044 python TCP 粘包問題的解決

2021-10-10 02:17:33 字數 1500 閱讀 1466

解決粘包問題,目前較為合理的方法就是

為位元組流加上乙個包頭,告訴接收方位元組流的總大小,然後接收方就可以利用while迴圈來接受完所有資料。然後用struck將序列化後的資料打包成多個位元組即可。

客戶端

from socket import

*import struct

import os

client = socket(af_inet, sock_stream)

client.connect(

('192.168.56.1'

,9999))

file_path =

'new.mp4'

f =open

(file_path,

'rb'

)# 獲取檔案位元組長度

size = os.path.getsize(file_path)

# 建立乙個包頭,i為四個位元組的int

heard = struct.pack(

'!i'

, size)

client.send(heard)

# 傳送檔案內容

while

true

: data = f.read(

1024)if

not data:

break

client.send(data)

print

("檔案上傳完成"

)f.close(

)client.close(

)

伺服器端

from socket import

*import struct

server = socket(af_inet, sock_stream)

server.bind((''

,9999))

server.listen(5)

conn,addr = server.accept(

)f =

open

(r'd:\伺服器.mp4'

,'wb'

)header_data = conn.recv(4)

# unpack返回的是乙個元組,元組的第乙個位元組就是長度

size = struct.unpack(

"!i"

, header_data)[0

]recv_size =

0while recv_size < size:

data = conn.recv(

1024

) recv_size +=

len(data)

f.write(data)

print

("伺服器端接受完成"

)f.close(

)conn.close(

)server.close(

)

TCP的粘包問題

粘包指的是資料與資料之間沒有明確的分界線,導致不能正確讀取 應用程式無法直接操作硬體,應用程式想要傳送資料則必須將資料交給作業系統,而作業系統需要同時為所有應用程式提供資料傳輸服務,也就意味著,作業系統不可能立馬就能將應用程式的資料傳送出去,就需要為應用程式提供乙個緩衝區,用於臨時存放資料,具體流程...

Python TCP的黏包問題以及UDP的分片問題

tcp transport control protocol,傳輸控制協議 是面向連線的,面向流的,提供高可靠性服務。收發兩端 客戶端和伺服器端 都要有一一成對的socket,因此,傳送端為了將多個發往接收端的包,更有效的發到對方,使用了優化方法 nagle演算法 將多次間隔較小且資料量小的資料,合...

Socket粘包問題的處理

當前在網路傳輸應用中,廣泛採用的是tcp ip通訊協議及其標準的socket應用開發程式設計介面 api tcp ip傳輸層有兩個並列的協議 tcp和udp。其中tcp transport control protocol,傳輸控制協議 是面向連線的,提供高可靠性服務。udp user datagr...