tcp的粘包現象:傳送的多條訊息在傳送到接收的過程中可能會粘在一起
只出現在tcp協議中,因為tcp協議 多條訊息之間沒有邊界,並且還有大量優化演算法
傳送端:兩條訊息很短;傳送時間間隔也非常短
接收端:多條訊息沒有及時接收,而堆積在接收方快取堆裡
如何解決:
傳送方:
1.計算即將要傳送的資料的長度,通過struct模組將長度轉換成固定的4個位元組的bytes資料
2.先傳送這固定4個位元組的bytes資料
3.再傳送指定要傳送的資料
接收方:
1.len = recv(4) 接收固定4個位元組的bytes資料
2.len = 通過struct模組將接收到的bytes資料轉換回原來的資料的長度
3.recv(len) 再接收相應長度的資料
server端**示例:
importsocket
import
struct
sk =socket.socket()
sk.bind((
'ip', port))
sk.listen()
conn, addr =sk.accept()
send_msg1 = input('
>>>
').encode('
utf-8')
send_msg2 = input('
>>>
').encode('
utf-8')
blen1 = struct.pack('i'
, len(send_msg1))
conn.send(blen1)
conn.send(send_msg1)
blen2 = struct.pack('i'
, len(send_msg2))
conn.send(blen2)
conn.send(send_msg2)
recv_msg = conn.recv(1024)
(recv_msg)
conn.close()
sk.close()
client端**示例:
importsocket
import
struct
sk =socket.socket()
sk.connect((
'10.11.30.149
', 9001))
blen1 = sk.recv(4)
blen1 = struct.unpack('i'
, blen1)[0]
recv_msg1 = sk.recv(blen1).decode('
utf-8')
(recv_msg1)
blen2 = sk.recv(4)
blen2 = struct.unpack('i'
, blen2)[0]
recv_msg2 = sk.recv(blen2).decode('
utf-8')
(recv_msg2)
sk.send(b
'hello')
sk.close()
tcp粘包現象
二 什麼時候需要考慮粘包問題?1 如果利用tcp每次傳送資料,就與對方建立連線,然後雙方傳送完一段資料後,就關閉連線,這樣就不會出現粘包問題 因為只有一種包結構,類似於http協議 關閉連線主要要雙方都傳送close連線 參考tcp關閉協議 如 a需要傳送一段字串給b,那麼a與b建立連線,然後傳送雙...
TCP的粘包現象
1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 我們知道,tcp缺省會使用nagle演算法。而nagle演算法主要做兩件事 1 只有上乙個分組得到確認,才會傳送下乙個分組 2 ...
TCP的粘包現象
原文 看面經時,看到有面試官問tcp的粘包問題。想起來研一做購物車處理資料更新時遇到粘包問題,就總結一下吧。1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 所以,正是nagle...