什麼原因導致的黏包?
tcp協議的流失傳輸造成的黏包。
黏包:
(自定義協議)先傳送資料長度,再傳送資料。
基於tcp先執行一個遠端行命令的程式:
subprocess模組:
import subprocess res=subprocess.Popen("dir", shell=True, # 終端錯誤 stderr=subprocess.PIPE, #標準 錯誤 stdout=subprocess.PIPE #終端標準輸出 ) print(res.stdout.read().decode("gbk"))
檢視在當前目錄下的所有內容
程式的結果的編碼是以當前所在的系統為準的,Windows,res.stdout.read()讀出來的是gbk,在接收端使用gbk解碼,且只能從管道里讀取一次結果
注意:
同時執行多條命令後,得到的結果很可能是一部分;(1024),因為在執行其他命令的時候又接收之前執行的另一部分結果,這種現象就是黏包
tcp 和udp的區別?
tcp:可靠的(保證對方能收到訊息),面向連線的,全雙工的流式傳輸,效率比較低。
udp:不可靠,效率高,是無連線的,基於資料包傳輸而傳輸資料,但是傳輸的資料長度有限制。
注意:只有tcp有黏包現象,udp永遠不會黏包。
黏包的解決方法?
使用struct解決黏包,藉助struct模組,長度數字可以被轉換成一個標準大小的4位元組數字,因此可以利用這個特點來預先傳送資料長度。
傳送時 | 接收時 |
先傳送struct轉換好的資料長度4位元組 | 先接收4個位元組使用struct轉換成數字來獲取要接收的資料長度 |
再次傳送 | 再按照長度接收資料 |