- 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
