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