沾包问题的解决-----
struck模块 使用:
# 制作固定长度的报头 一个整型--->固定长度的bytes对象 import struct obj = struct.pack('i',1111111) # 生成一个bytes对象 print(obj,len(obj),type(obj)) b = struct.unpack('i',obj) print(b) print(b[0]) 结果:
b'G\xf4\x10\x00' 4 <class 'bytes'>
(1111111,)
1111111
实例运用:
server 端:
# 制作固定长度的报头 total_size = len(stdout)+len(stderr) header = struct.pack('i',total_size) # 将total_size做成客户端可以接受的固定长度 # 发送报头(指定长度)发送给客户端 conn.send(header) # 长度为4 # 把命令的结果返回给客户端 conn.send(stdout) conn.send(stderr)
client 端:
# 1 首先接受固定长度的报头 header = socket_obj.recv(4) # 2再解码报头,拿到数据的长度 total_size = struct.unpack('i', header)[0] # 3 接受真实的数据 recv_size = 0 recv_data = b'' while recv_size < total_size: res = socket_obj.recv(1024) recv_data += res recv_size += len(res)