粘包问题

一、粘包问题

服务器第一次发送的数据,客户端无法精确的一次性接收完毕。

下一次发送的数据与上一次数据在一起了。

1、导致粘包问题的原因

  1. 无法预测对方需要接收的数据大小长度。
  2. 多次连续发送数据量小,并且时间间隔短的数据一次性打包发送。

2、TCP协议特性

TCP是一个流式协议,会将多次连续发送数据量小,并且时间间隔短的数据一次性打包发送。

二、解决粘包问题

让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据。

1、struct模块

必须先定义报头,发送报头,再发送真实数据。

# 传输端

message = '你要发送的信息'
# 打包压缩,获取报头,'i'可以把长度压缩成四个字节的数据传输
headers = struct.pack('i', len(mssage))

# 先发送头部
conn.send(headers)

result = '真实数据'
# 再发送真实数据
conn.send(result)
# 接收端

# 先获取数据报头
headers = client.recv(4)

# 解包,或者真实数据长度
data_len = struct.unpack('i', headers)[0]  # (len, )

# 接收真实数据
data = client.recv(data_len)
posted @ 2019-10-19 16:05  Donner  阅读(111)  评论(0编辑  收藏  举报