socket粘包问题解决

时间:2023-03-09 00:41:26
socket粘包问题解决

粘包
client.send(data1)
client.send(data2)
这两次send紧挨在一起,处理的时候会放在一起发过去
在Linux里每次都粘包,Windows里面某次会出现粘包
在两次send中间放一个time.time(0.5)可以解决这个问题,这个比较low

粘包问题解决(一)

解决办法是在第一次send之后等待客户端确认,客户端确认之后,发给服务端,服务端收到之后进行第二次send

socket粘包问题解决

粘包问题解决(二)

import socket
'''
server.send(data1)
server.send(md5)
如果知道第一次data1的长度,
可以不用收到确认信息,也能保证不粘包的方法,怎么做呢?
'''
# 客户端
client = socket.socket()
client.connect(("localhost",9999))
total_size = 50000
received_size = 0
while received_size < total_size:
if total_size - received_size > 1024: #要收不止一次
size = 1024
else: #最后一次了,剩多少收多少
size = total_size - received_size
data = client.recv(size)
received_size += len(data)
else:
print("receive done", total_size, received_size)
md5 = client.recv(1024)