解決粘包的問題:
1.服務端在傳送資料之前,先把傳送資料的長度告訴客戶端,要傳送多少資料,然後客戶端根據這個資料的長度迴圈接收就ok
傳輸過程:
服務端:
1.send #資料長度
4.recv #收到確認資訊,開始下一步傳送
send #傳送資料
客戶端 :
2.recv #獲取資料長度
3.send #傳送確認資訊
recv #迴圈接收
socket-server端**:
#解決粘包問題
send_data = bytes(send_data,encoding='
utf-8
') #
編碼成utf-8,位元組,並把str轉換為位元組
ready_tag = '
ready|%s
' %len(send_data)
conn.send(bytes(ready_tag,encoding='
utf-8'))
feedback = conn.recv(1024) #
收到客戶端傳送過來的start
feedback = str(feedback,encoding='
utf-8
') #
把收到的feedback 轉換為str
if feedback.startswith('
start'):
conn.send(send_data)
socket-client端**:
#解決粘包的問題
ready_tag = s.recv(1024) #
ready|9999
ready_tag = str(ready_tag,encoding='
utf-8')
if ready_tag.startswith('
ready
'): #
ready|9999
msg_size = int(ready_tag.split('
|')[-1])
start_tag = '
start
's.send(bytes(start_tag,encoding='
utf-8
')) #
給server傳送start,告訴server可以準備傳送資料了
recv_size = 0 #
初始化資料大小
recv_msg =b''
while recv_size recv_data = s.recv(1024)
recv_msg +=recv_data
recv_size +=len(recv_data)
print('
msg size %s rece size %s
' %(msg_size, recv_size))
print(str(recv_msg,encoding='
utf-8
'))
TCP粘包 拆包
tcp粘包 拆包 客戶端發服務端傳送了兩個資料報a和b 粘包 服務端一次性接收到了a和b 拆包 服務端第一次接收了a和b的一部分,第二次接收到了b的剩餘部分 粘包 拆包原因 1 應用程式寫入的位元組大小 socket傳送緩衝區大小 2 tcp分段 tcp data部分的大小 mss max segm...
TCP粘包,拆包
粘包 拆包表現形式 現在假設客戶端向服務端連續傳送了兩個資料報,用packet1和packet2來表示,那麼服務端收到的資料可以分為三種,現列舉如下 第一種情況,接收端正常收到兩個資料報,即沒有發生拆包和粘包的現象,此種情況不在本文的討論範圍內。第二種情況,接收端只收到乙個資料報,由於tcp是不會出...
TCP粘包 拆包
粘包 拆包問題是網路比較底層的問題,在資料鏈路層 網路層以及傳輸層都有可能發生。我們日常的網路應用開發大都在傳輸層進行,由於udp有訊息保護邊界,不會發生粘包拆包問題,因此粘包拆包問題只發生在tcp協議中。假設客戶端向服務端連續傳送了兩個資料報,用packet1和packet2來表示,那麼服務端收到...