要知道!所謂粘包問題主要還是因為接收方不知道訊息之間的界限,不知道一次性提取多少位元組的資料所造成的。
要解決粘包不外乎乙個條件,就是知道取多少,讓對方事先知道我們要發多少位元組的資料,然後造乙個容器,每次規定的往容器裡面倒水,當水快滿的時候,量出最後一勺還需要多少勺多少的水,最後把這水不多不少的往容器裡倒,如果多出來的就往第二個容器裡道,粘包就解決了
只能接受一收一發
不能像udp一樣發完 可以繼續發
from socket import *
import struct,json
ip_port=('127.0.0.1',8080)
client=socket(af_inet,sock_stream)
client.connect(ip_port)
while true:
cmd=input('>>: ')
if not cmd:continue
client.send(bytes(cmd,encoding='utf-8'))
head=client.recv(4)
head_json_len=struct.unpack('i',head)[0]
head_json=json.loads(client.recv(head_json_len).decode('utf-8'))
data_len=head_json['data_size']
recv_size=0
recv_data=b''
while recv_size < data_len:
recv_data+=client.recv(1024)
recv_size+=len(recv_data)
print(recv_data.decode('utf-8'))
#print(recv_data.decode('gbk')) #windows預設gbk編碼
#服務端
# import socket
# server=socket.socket()
# addr = ("192.168.11.175",8080)
# server.connect(addr)
## server.send("wo shi diao bao xia !!".encode())
# feedback=server.recv(1024) #收訊息,聽話
# print(feedback.decode('utf-8'))
# input("")
# server.close()
import socket,subprocess
import struct
server=socket.socket(socket.af_inet,socket.sock_stream)
server.bind(("127.0.0.1",8081))
server.listen(5)
while true :
coon,addr=server.accept()
while true:
try:
msg=coon.recv(1024).decode()
if not msg :break
with open(msg,"rb") as r :
data=r.read()
data_len=struct.pack("i",len(data))
print(">>>2")
coon.send(data_len)
coon.send(data)
except exception as f :
print(f)
解決粘包問題
注意注意注意 res subprocess.popen cmd.decode utf 8 shell true,stderr subprocess.pipe,stdout subprocess.pipe 的結果的編碼是以當前所在的系統為準的,如果是windows,那麼res.stdout.read ...
解決粘包問題(python)
在傳輸資料訊息時因為tcp協議使用了優化方法 nagle演算法 將多次間隔較小且資料量小的資料,合併成乙個大的資料塊,然後進行封包,這樣,接收端就難於分辨出來了,所以會產生粘包效果。在這種情況下我們需要製作乙個報頭來告訴接收端我們要傳送的資料的長度,來方便接收端接收。第一步 製作固定長度的報頭 he...
Python Day33 粘包問題及粘包解決方案
tcp粘包問題 python 粘包指的是資料與資料之間沒有明確的分界線,導致不能正確讀取資料!tcp協議也稱之為流式協議 udp稱為資料報協議 應用程式無法直接操作硬體,應用程式想要傳送資料則必須將資料交給作業系統,而作業系統需要需要同時為所有應用程式提供資料傳輸服務,也就意味著,作業系統不可能立馬...