python基於TCP的粘包問題解決方案

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


發佈了53 篇原創文章 · 獲贊 34 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章