什麼原因導致的黏包?
tcp協議的流失傳輸造成的黏包。
黏包:(自定義協議)先傳送資料長度,再傳送資料。
基於tcp先執行乙個遠端行命令的程式:
subprocess模組:
importsubprocess
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轉換成數字來獲取要接收的資料長度
再次傳送
再按照長度接收資料
Linux tcp黏包解決方案
tcpip協議使用 流式 套接字 進行資料的傳輸,就是說它保證資料的可達以及資料抵達的順序,但並不保證資料是否在你接收的時候就到達,特別是為了提高效率,充分利用頻寬,底層會使用快取技術,具體的說就是使用nagle演算法將小的資料報放到一起傳送,但是這樣也帶來乙個使用上的問題 黏包,黏包就是說一次將多...
python之黏包和黏包解決方案
黏包現象主要發生在tcp連線,基於tcp的套接字客戶端往服務端上傳檔案,傳送時檔案內容是按照一段一段的位元組流傳送的,在接收方看來,根本不知道該檔案的位元組流從何處開始,在何處結束.兩種黏包現象 1 連續的小包可能會被優化演算法給組合到一起進行傳送 2 第一次如果傳送的資料大小2000b接收端一次性...
造成死鎖的原因和解決方案
計算機系統中,如果系統的資源分配策略不當,更常見的可能是程式設計師寫的程式有錯誤等,則會導致程序因競爭資源不當而產生死鎖的現象。產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就...