python-socket 粘包问题
解决粘包的问题:
1.服务端在发送数据之前,先把发送数据的长度告诉客户端,要发送多少数据,然后客户端根据这个数据的长度循环接收就OK
传输过程:
服务端:
1.send #数据长度
4.recv #收到确认信息,开始下一步发送
send #发送数据
客户端 :
2.recv #获取数据长度
3.send #发送确认信息
recv #循环接收
socket-server端代码:
#解决粘包问题 send_data = bytes(send_data,encoding='utf-8') #编码成utf-8,字节,并把str转换为字节 ready_tag = 'Ready|%s' %len(send_data) conn.send(bytes(ready_tag,encoding='utf-8')) feedback = conn.recv(1024) #收到客户端发送过来的Start feedback = str(feedback,encoding='utf-8') #把收到的feedback 转换为str if feedback.startswith('Start'): conn.send(send_data)
socket-client端代码:
#解决粘包的问题 ready_tag = s.recv(1024) # Ready|9999 ready_tag = str(ready_tag,encoding='utf-8') if ready_tag.startswith('Ready'): # Ready|9999 msg_size = int(ready_tag.split('|')[-1]) start_tag = 'Start' s.send(bytes(start_tag,encoding='utf-8')) #给server发送Start,告诉server可以准备发送数据了 recv_size = 0 #初始化数据大小 recv_msg =b'' while recv_size < msg_size: recv_data = s.recv(1024) recv_msg += recv_data recv_size += len(recv_data) print('MSG SIZE %s RECE SIZE %s' % (msg_size, recv_size)) print(str(recv_msg,encoding='utf-8'))
UnixFBI 运维特工
www.unixfbi.com