一: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()