粘包

粘包主要是因为接收方不知道一次性提取多少字节的数据所造成的

解决粘包的方案:自定义报头

  第一种方法:发送方先用报头传输数据的长度再发送数据,接受方先接受数据的长度信息再根据长度信息来获取知道获取的长度等于总长度

  第二种方法:自定义复杂报头  完成发送一些额外的信息。先将要发送的额外数据打包成一个字典,将字典转为bytes类型,计算字典的bytes长度并发送,再发送字典数据,最后发送真实数据

#先把需要的信息打包成一个字典
dic = {'name':'博客园',
            'md5':'3714718355'
            'len':1035}
#字典转字符串
head_dic = str(dict)
bytes = head_dic.encode('utf-8')
#先发送这个字典字符串的长度
dic_len = len(head_dic)
#将长度转化为字节
bytes_len = struct.pack('i',dic_len)
#发送报头的长度
c.send(bytes_len)
#发送真实数据
c.send(bytes)
注意:TCP只能传字节
示例
原文地址:https://www.cnblogs.com/xiamenghan/p/9918041.html