1. 程式人生 > >PYTHON-TCP 粘包

PYTHON-TCP 粘包

1.TCP的模板程式碼
收發訊息的迴圈 通訊迴圈
不斷的連線客戶端迴圈 連線迴圈
判斷 用於判斷客戶端異常退出(拋異常)或close(死迴圈)

2.遠端CMD
粘包問題
一方傳送空資料 導致程式卡死 今後會通過多執行緒處理


3.解決粘包的方案 自定義報頭
1.先用報頭傳輸資料的長度
對於我們遠端CMD程式來說 只要先傳輸長度就能解決粘包的問題
但是如果做得是一個檔案上傳下載 除了資料的長度 還需要傳輸檔案的名字 md5等等資訊
又該如何?

傳送方
1.先告訴對方你要發的資料的長度
2.在傳送真實資料
接收方
1.先接收資料的長度資訊
2.根據長度資訊迴圈獲取直到以獲取的長度等於總長度

2.自定義複雜報頭 完成傳送一些額外的資訊 例如檔名
1.將要傳送的額外資料打包成一個字典
2.將字典轉為bytes型別
3.計算字典的bytes長度 並先傳送
4.傳送字典資料
5.傳送真實資料

struct
整型轉位元組,轉成的bytes是固定長度的
i 表示int 長度為4位元組 q表示long int 長度為8位元組
print(len(struct.pack("i",10240)))
位元組轉整型 得到一個元祖!!!
print(struct.unpack("q",struct.pack("q",10240))[0])

伺服器端示例:
# 為了方便存取 可以把需要的資訊打包為一個字典
dic{
"filename":"倉老師視訊教學 如何做炸雞!",
"md5":"xzxbzxkbsa1212121",
"total_size":2121221
}
# 字典轉字串? json
head_dic = str(dict)
bytes = head_dic.encode("utf-8")
# 先發送這個字典字串的長度
dic_len = len(head_dic)
#將長度轉為了 位元組
bytes_len = struct.pack("i",dic_len)
# 傳送報頭的長度
c.send(bytes_len)

# 傳送真實資料
c.send(xxx.mp4.bytes)
TCP能傳的只有位元組