1. 程式人生 > >python摸爬滾打之day28----黏包處理

python摸爬滾打之day28----黏包處理

1、緩衝區和subprocess模組

  1.1  緩衝區

    

 

 

 

 

 

 

 

 

 

  每個 socket 被建立後,都會分配兩個緩衝區,輸入緩衝區和輸出緩衝區。

  write()/send() 並不立即向網路中傳輸資料,而是先將資料寫入緩衝區中,再由TCP協議將資料從緩衝區傳送到目標機器。一旦將資料寫入到緩衝區,函式就可以成功返回,不管它們有沒有到達目標機器,也不管它們何時被髮送到網路,這些都是TCP協議負責的事情。

  TCP協議獨立於 write()/send() 函式,資料有可能剛被寫入緩衝區就傳送到網路,也可能在緩衝區中不斷積壓,多次寫入的資料被一次性發送到網路,這取決於當時的網路情況、當前執行緒是否空閒等諸多因素,不由程式設計師控制。

  read()/recv() 函式也是如此,也從輸入緩衝區中讀取資料,而不是直接從網路中讀取。

  2.2  直譯器呼叫系統指令----> subprocess

 1 import subprocess      # 直譯器操作cmd的模組
 2 recv_msg = input("輸入cmd命令: ")
 3 cmd_obj = subprocess.Popen(
 4     recv_msg,       # 輸入的cmd指令,"dir", "ipconfig" ......
 5     shell=True,     # shell = True, 即相當於使用cmd視窗
6 stdout=subprocess.PIPE, # 標準輸出資訊都在PIPE管道中 7 stderr=subprocess.PIPE, # 出錯資訊也在PIPE管道中 8 ) 9 cmd_msg = cmd_obj.stdout.read().decode("gbk") # 物件呼叫裡面的stdout屬性, 並讀取出來.(和計算機互動一般都以GBK編碼解碼) 10 print(cmd_msg)
subprocess模組

2、黏包

  現象1: 連續send兩個比較小點的資料時, TCP的Nagle演算法和延遲ACK機制, 減少大量小包的連續傳送, 所以會將比較小的連續傳送的資料合併成一個比較大的包, 這是第一種黏包;

  現象2: send()給緩衝區扔了太多資料, 超過緩衝區的大小就會報錯, 每個IP包一般最大為1500b, 如果超過這個值就會被拆包傳送, 第一次剩下的資料有可能和第二次傳送的資料一起連在一起被接收, 這就是第二種黏包;

3、

4、

5、