1,https和http的区别:

  https比较安全,传输的时候先对内容进行加密,收到后再进行解密;它的传输内容不容易拦截,就算拦截下来了,也是加密的,看不懂。但是要买证书,一年要好几万,小公司承担不起。听说非常安全,在业内都没有出过问题。

2,udp不会黏包,只有tcp会黏包

  传输的时候只能传输bite类型数据

  demo1--远程执行命令:

server.py

sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
if cmd == 'q':
conn.send(b'q')
break
conn.send(cmd.encode('gbk'))
res = conn.recv(1024).decode('gbk')
print(res)
conn.close()
sk.close()

client.py

#接收server端的命令之后在自己的机器上执行
import socket
#找个什么人去帮你执行程序
import subprocess #创建一个sokect的对象
sk = socket.socket()
sk.connect(('127.0.0.1', 8080))
while True:
#收1024个字节
cmd = sk.recv(1024).decode('gbk')
if cmd == 'q':
break
#把接收的结果预先存到PIPE管道里面,就是装数据的容器
res = subprocess.Popen(cmd,shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
sk.send(res.stdout.read())
sk.send(res.stderr.read())
sk.close()

黏包现象:

3、什么是黏包问题,这里终于讲清楚了:

黏包(是tcp协议内部的优化算法造成的):

  client接收数据的时候,分两次接收,第一次接收的时候假如只接收两个的话,第二次接收的时候就不会接收得到十个数据,只能接收掉了八个数据。

  如果是udp,第一次接收了两个数据,第二次接收是接收不到数据的,因为后面八位数据已经丢失了。

  只有tcp中有缓存机制才能发生第二次接收的时候从缓存中接收到剩下的机制,这种现象就是黏包现象。第一次没有完全接收,第二次就会把剩下的发给我,这种问题就是黏包问题。

  现在用到的所有的网络传输都是基于socket的

  #优化算法

  #连续的小数据包会被合并

  #多个send 小的数据连在一起,会发生黏包现象,是tcp协议内部的优化算法造成的

  #连续使用了send

  client端发送信息的机制:

    当把所需要的消息发送完关闭之后,默认再往服务器发送一个空消息。(比较高点版本的Windows系统会发送空消息,比较低版本的Windows系统直接报错,我在win7下测试发送的也是空消息)

  client2.py

  server2.py

  #在tcp优化算法中,只有在非常短的时间内接收到消息,才会发生黏包,

  #如果等了一段时间,比如一个网络延时了,就会先发先走

  server2.py

  client2.py

4、发生黏包的原因:

  1,连续send两个小数据

  2,两个recv,第一个recv特别小

  #发生黏包的本质就是你不知道到底要接收多大的数据

5、黏包问题的解决方式

  1,方法1:

    首先:发送一下这个数据到底有多大

    再按照数据的长度接收数据

  #好处:确定了我到底要接收多大的数据
  #要在文件中配置一个配置项:就是每一次recv的大小 buffer = 4096
  #当我们要发送大数据的时候,要明确的告诉接收方要发送多大的数据,以便接收方能够准确的接收到所有的数据
  #多用在文件传输的过程中
  #大文件的传输 一定是按照字节读 每一次读固定的字节
  #传输的过程中 一边读一边传 接收端 一边收一边写
  #send这个大文件之前,35672字节 send(4096) 35672-4096-4096 -->0
  #recv这个文件,recv 35672字节 recv(2048) 35672-2048 -->0   #不好的地方:多了一次交互
  #send sendto 在超过一定的范围的时候 都会报错
  #程序的内存管理
  程序:
  client.py
 #接收server端的命令之后在自己的机器上执行
import socket
#找个什么人去帮你执行程序
import subprocess #创建一个sokect的对象
sk = socket.socket()
sk.connect(('127.0.0.1', 8080))
while True:
#收1024个字节
cmd = sk.recv(1024).decode('gbk')
if cmd == 'q':
break
#把接收的结果预先存到PIPE管道里面,就是装数据的容器
res = subprocess.Popen(cmd,shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
std_out = res.stdout.read()
std_err = res.stderr.read()
sk.send(str(len(std_out)+len(std_err)).encode('utf-8'))#
#这里一般不超过4096个,过大会给运行内存造成巨大的压力
sk.recv(4096) #ok
sk.send(std_out)
sk.send(std_err)
sk.close()

  server.py

 #server 下发命令 给client

 import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
if cmd == 'q':
conn.send(b'q')
break
conn.send(cmd.encode('gbk'))
num = conn.recv(1024).decode('utf-8')
conn.send(b'ok')
res = conn.recv(int(num)).decode('gbk')
print(res)
conn.close()
sk.close()

  2,方法2:struct模块解决黏包问题(看红色的代码)

      init.py

 import struct

 ret = struct.pack('i', 4096) #‘i’代表int,就是即将要把一个数字转换成固定长度bytes类型
print(ret) num = struct.unpack('i', ret)
print(num[0]) #如果发送数据的时候
#先发送长度 先接收长度

      server.py

 import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
if cmd == 'q':
conn.send(b'q')
break
conn.send(cmd.encode('gbk'))
13 num = conn.recv(4) #2048
14 num = struct.unpack('i', num)[0] #2048
res = conn.recv(int(num)).decode('gbk')
print(res)
conn.close()
sk.close()

    client.py

 import struct
import socket
#找个什么人去帮你执行程序
import subprocess #创建一个sokect的对象
sk = socket.socket()
sk.connect(('127.0.0.1', 8080))
while True:
#收1024个字节
cmd = sk.recv(1024).decode('gbk')
if cmd == 'q':
break
#把接收的结果预先存到PIPE管道里面,就是装数据的容器
res = subprocess.Popen(cmd,shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
std_out = res.stdout.read()
std_err = res.stderr.read()
len_num = len(std_out)+len(std_err) 22 num_by = struct.pack('i', len_num)
23 sk.send(num_by) #4 2048
sk.send(std_out)#
sk.send(std_err)#1024 4+2048
sk.close()
 

Python--day32--复习:https和http的区别;黏包;黏包问题的解决方式;的更多相关文章

  1. https http 混合访问_https 页面中引入 http 资源的解决方式

    解决android 5.0 webview不能加载http与https混合内容的问题 在使用WebView加载https资源文件时,如果认证证书不被Android认可,那么会出现无法成功加载对应资源问 ...

  2. Python新式类与经典类的区别

    1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...

  3. Python import与from import使用及区别介绍

    Python程序可以调用一组基本的函数(即内建函数),比如print().input()和len()等函数.接下来通过本文给大家介绍Python import与from import使用及区别介绍,感 ...

  4. 嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av15123607/?from=search&seid=10211084839195730432#page=25 中的42-45讲 {字典}

    #coding=gbk#嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av15123607/?from=search&seid=1021108 ...

  5. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  6. HTTPS和HTTP的区别

    (转自:http://www.php100.com/html/it/biancheng/2015/0209/8582.html) 总的来说,http效率更高,https安全性更高. 首先谈谈什么是HT ...

  7. 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接

    使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...

  8. HTTPS和HTTP的区别(转)

    HTTPS和HTTP的区别 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信 息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器 ...

  9. python _、__和__xx__的区别

    python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...

  10. python中import和from...import...的区别

    python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...

随机推荐

  1. UWP获取任意网页加载完成后的HTML

    主要思想:通过后台WebView载入指定网页,再提取出WebView中的内容 关键代码: var html = await webView.InvokeScriptAsync("eval&q ...

  2. pycharm 2017 序列号失效问题解决(2016-2017版本都有效)

    pycharm 序列号失效问题解决   this license BIG3CLIK6F has been cancelled  具体如下: 对,没错,这个激活码本来可以使用到2018年的,但是,忽然间 ...

  3. jQuery纵向分类下拉菜单导航

    在线演示 本地下载

  4. twitter、facebook、pinterest、linkedin 分享代码

    twitter.facebook.pinterest.linkedin 分享代码 http://www.cnblogs.com/adstor-Lin/p/3994449.html

  5. JavaScript学习之setTimeout

    <JavaScript权威指南>第四版中说“window对象方法setTimeout()用来安排一个JavaScript的代码段在将来的某个指定时间运行”. setTimeout(foo, ...

  6. n!素因子p的幂 swjtuOJ 2090【数论】

    原文地址:http://blog.csdn.net/u012717411/article/details/47334969(感谢作者) 素因子分解写的非常好!数论一道好题:给以两个大整数n,s(n&l ...

  7. hdu2897 巴什博奕

    n%(q+p)==0,也就是说先手必胜; n%(q+p)<=p,先手必输; n%(q+p)==k if(k>p&&k<=q)先手必胜; if(k>p&& ...

  8. js数组增删

    1.shift() 2.pop() 3.push() 4.unshift() 5.splice(start,num,string...)

  9. SQL左连接查询 left join ... on

    左连接查询 保留左边主表的所有行(即使在右表没有匹配的行),右表输出满足 on 条件的行,不满足的输出null   示例:组合两个表 - 力扣 表1: Person +--------------+- ...

  10. 查看JAVA占用CPU高的线程日志

    # . 查看主进程占用cpu高 top # java # . 按照线程占用cpu由高到低进行排查: -o THREAD,tid, # USER %CPU PRI SCNT WCHAN USER SYS ...