Python socket粘包解決


  • socket粘包:  
  • socket 交互send時,連續處理多個send時會出現粘包,soket會把兩條send作為一條send強制發送,會粘在一起。
  • send發送會根據recv定義的數值發送一個固定的數值,如果最后一次,所剩的數值小於recv定義數就會連帶兩條send數據同時發送,發生粘包狀況。

 

  • 解決方案:
  • 方案1:可以使用time.sleep 在兩send之間加上時間(不建議)
  • 方案2:可以在send兩條之間加入一條 conn.recv(1024)            
服務端
conn.send(str(len(cmd_res.encode())).encode(
"utf-8")) client_ack = conn.recv(1024) #wait client to confirm conn.send(cmd_res.encode("utf-8")) 客戶端 client.send("准備好接收了,loser可以發了".encode("utf-8"))


原理:recv在接收數據時是一個堵塞狀態,自動卡在中間,
   客戶會自動返回client_ack的數據信息,相當於兩個
   send之間多了一次交互,就不會出現粘包情況。

      

  • 方案3:通過if判斷實現粘包解決(推薦)
while 總數值 > 遞增接收數據:
    if 總數值 - 遞增接收數據 > recv(1024): #比定義值大就成立
        size = 1024
    else: #最后一次
        size = 總數值 - 遞增接收數據 #剩的數值
    recv(size)   #賦值給 recv 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM