粘包问题
一、粘包问题
服务器第一次发送的数据,客户端无法精确的一次性接收完毕。
下一次发送的数据与上一次数据在一起了。
1、导致粘包问题的原因
- 无法预测对方需要接收的数据大小长度。
- 多次连续发送数据量小,并且时间间隔短的数据一次性打包发送。
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)