造成黏包的原因,及解決方案

Bound_w發表於2018-09-04

什麼原因導致的黏包?

  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轉換成數字來獲取要接收的資料長度
再次傳送 再按照長度接收資料

相關文章