python摸爬滾打之day28----黏包處理
阿新 • • 發佈:2018-11-23
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視窗subprocess模組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)
2、黏包
現象1: 連續send兩個比較小點的資料時, TCP的Nagle演算法和延遲ACK機制, 減少大量小包的連續傳送, 所以會將比較小的連續傳送的資料合併成一個比較大的包, 這是第一種黏包;
現象2: send()給緩衝區扔了太多資料, 超過緩衝區的大小就會報錯, 每個IP包一般最大為1500b, 如果超過這個值就會被拆包傳送, 第一次剩下的資料有可能和第二次傳送的資料一起連在一起被接收, 這就是第二種黏包;
3、
4、
5、