一:struct模块介绍
暂略
二:粘包问题解决方案
# 套接字服务端 import socket import struct import json import os server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) conn,client_addr=server.accept() # 1、制作报头 header_dic={ 'total_size':os.path.getsize('a.txt'), 'md5':'123svsaef123sdfasdf', 'filename':'a.txt' } header_json = json.dumps(header_dic) header_bytes = header_json.encode('utf-8') # 2、先发送报头的长度 header_size=len(header_bytes) conn.send(struct.pack('i',header_size)) # 把一个整型数字打包成固定字节数(i模式为4字节)的字节对象 # 3、发送报头 conn.send(header_bytes) # 4、发送真实的数据 with open('a.txt','rb') as f: for line in f: conn.send(line) conn.close() server.close()
# 套接字客户端 import socket import struct import json client= socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('127.0.0.1',8080)) # 1、先收报头的长度 header_size=struct.unpack('i',client.recv(4))[0] # 固定收4字节,然后解包,得到报头的长度 # 2、接收报头 header_bytes=client.recv(header_size) # 3、解析报头 header_json=header_bytes.decode('utf-8') header_dic=json.loads(header_json) total_size=header_dic[ 'total_size'] # 4、根据报头内的信息,收取真实的数据 with open('a.txt','wb') as f: recv_size = 0 while recv_size < total_size: recv_data=client.recv(1024) f.write(recv_data) recv_size+=len(recv_data) client.close()