解決粘包問題,目前較為合理的方法就是:
為位元組流加上乙個包頭,告訴接收方位元組流的總大小,然後接收方就可以利用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...