所谓粘包问题主要仍是由于接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所形成的。
python
#struct模块介绍 #该模块能够把一个类型,如数字,转成固定长度为4的bytes类型 import struct res = struct.pack('i',12345) #i表示整数int print(res,len(res),type(res)) #长度是4 res2 = struct.pack('i',12345111) print(res,len(res),type(res2)) #长度也是4 unpack_res =struct.unpack('i',res2) print(unpack_res) #(12345111,) print(unpack_res[0]) #12345111
###################客户端client################### #!/usr/bin/env python # -*- coding:utf-8 -*- import socket import struct sock=socket.socket() sock.connect(('127.0.0.1', 13459)) content1='我好'.encode('utf-8') #要发送消息 content2='他也好'.encode('utf-8') con1_len=struct.pack('i',len(content1)) # 计算要发送消息(字节)的长度,并使用struct模块转化为长度为4的字节b'\x06\x00\x00\x00' sock.send(con1_len) #先把这个4字节的报文发送 sock.send(content1) #发送内容 con2_len=struct.pack('i',len(content2)) sock.send(con2_len) sock.send(content2) sock.close()
###################服务端server################### #!/usr/bin/env python # -*- coding:utf-8 -*- import struct import socket sock = socket.socket() #买手机 sock.bind(('127.0.0.1', 13459)) #插卡 sock.listen(10) #开机(同时最大链接10) conn, addr = sock.accept() #(受)与cilent端connect(攻)对应. msg = conn.recv(4) #首先接收4个字节(4个字节由client端struct模块转化) len_msg= struct.unpack('i',msg) #struct模块读取报文,判断跟随数据长度.返回值是一个元祖(6,) size_msg=len_msg[0] #取值判断跟随数据长度 msg = conn.recv(size_msg) #接收报文读取长度字节 print(msg.decode('utf-8')) #解码输出 msg=conn.recv(4) len_msg=struct.unpack('i',msg) size_msg=len_msg[0] msg = conn.recv(size_msg) print(msg.decode('utf-8')) conn.close() sock.close()
!重要struct模块转化与读取都是对字节进行操做!算法