粘包待改
阿新 • • 發佈:2018-11-05
1.TCP的模板程式碼
收發訊息的迴圈 通訊迴圈
不斷的連線客戶端迴圈 連線迴圈
判斷 用於判斷客戶端異常退出(拋異常)或close(死迴圈)
2.遠端CMD
粘包問題
一方傳送空資料 導致程式卡死 今後會通過多執行緒處理
3.解決粘包的方案 自定義報頭
1.先用報頭傳輸資料的長度
對於我們遠端CMD程式來說 只要先傳輸長度就能解決粘包的問題
但是如果做得是一個檔案上傳下載 除了資料的長度 還需要傳輸檔案的名字 md5等等資訊
又該如何?
2.自定義複雜報頭 完成傳送一些額外的資訊 例如檔名
1.將要傳送的額外資料打包成一個字典
2.將字典轉為bytes型別
3.計算字典的bytes長度 並先傳送
4.傳送字典資料
5.傳送真實資料
伺服器端示例:
# 為了方便存取 可以把需要的資訊打包為一個字典
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能傳的只有位元組