tcp的粘包现象:发送的多条消息在发送到接收的过程中可能会粘在一起
只出现在tcp协议中,因为tcp协议 多条消息之间没有边界,并且还有大量优化算法
发送端:两条消息很短;发送时间间隔也非常短
接收端:多条消息没有及时接收,而堆积在接收方缓存堆里
如何解决:
发送方:
1.计算即将要发送的数据的长度,通过struct模块将长度转换成固定的4个字节的bytes数据
2.先发送这固定4个字节的bytes数据
3.再发送指定要发送的数据
接收方:
1.len = recv(4) 接收固定4个字节的bytes数据
2.len = 通过struct模块将接收到的bytes数据转换回原来的数据的长度
3.recv(len) 再接收相应长度的数据
server端代码示例:
import socket import struct sk = socket.socket() sk.bind(('ip', port)) sk.listen() conn, addr = sk.accept() send_msg1 = input('>>>').encode('utf-8') send_msg2 = input('>>>').encode('utf-8') blen1 = struct.pack('i', len(send_msg1)) conn.send(blen1) conn.send(send_msg1) blen2 = struct.pack('i', len(send_msg2)) conn.send(blen2) conn.send(send_msg2) recv_msg = conn.recv(1024) print(recv_msg) conn.close() sk.close()
client端代码示例:
import socket import struct sk = socket.socket() sk.connect(('10.11.30.149', 9001)) blen1 = sk.recv(4) blen1 = struct.unpack('i', blen1)[0] recv_msg1 = sk.recv(blen1).decode('utf-8') print(recv_msg1) blen2 = sk.recv(4) blen2 = struct.unpack('i', blen2)[0] recv_msg2 = sk.recv(blen2).decode('utf-8') print(recv_msg2) sk.send(b'hello') sk.close()