Python中Socket粘包問題的解決

2022-01-12 10:36:59 字數 1987 閱讀 8871

伺服器端

import

socket

import

subprocess

import

struct

server =socket.socket()

ip_port = ("

192.168.15.33

",8001)

server.bind(ip_port)

server.listen()

conn,addr =server.accept()

while 1:

print("

等待接收訊息...")

from_client_cmd = conn.recv(1024).decode("

utf-8

")#接收客戶端訊息

print

(from_client_cmd)

sub_obj = subprocess.popen( #

通過subprocess模組執行服務端指令,並拿到指令結果

from_client_cmd, #

客戶端指令

shell =true,

stdout = subprocess.pipe, #

標準輸出:正確指令的執行結果

stderr = subprocess.pipe, #

標準錯誤輸出:錯誤指令的執行結果

) server_cmd_msg =sub_obj.stdout.read()

#server_cmd_msg = sub_obj.stderr.read() #接收到的返回資訊是bytes型別,並且windoes系統的預設編碼為gbk

cmd_msg_len = len(server_cmd_msg) #

計算你要傳送的資料長度

msg_len_stru = struct.pack("

i",cmd_msg_len)#

先對資料長度進行打包,打包成4個位元組的資料,目的是為了和你將要傳送的資料拼接在一起,就像我們自製乙個訊息頭.

conn.send(msg_len_stru) #

首先傳送打包成功後的那4個位元組的資料

conn.sendall(server_cmd_msg) #

迴圈send資料,直到資料全部傳送成功

conn.close()

server.close()

客戶器端

import

socket

import

struct

client =socket.socket()

server_ip_port = ("

192.168.15.33

",8001)

client.connect(server_ip_port)

while 1:

msg = input("

請輸入要執行的命令》")

client.send(msg.encode(

"utf-8"))

from_server_msglen = client.recv(4)#

先接受服務端要傳送給我的資料長度,前四個位元組,固定的

unpack_len_msg = struct.unpack("i"

,from_server_msglen)[0]

recv_msg_len =0

all_msg = b""

while recv_msg_len every_recv_date = client.recv(1024)

all_msg += every_recv_date #

將每次接收到的資料進行拼接和統計

recv_msg_len += len(every_recv_date) #

對每次接受到的資料進行累加

print(all_msg.decode("

gbk"

))client.close()

python 之解決socket 粘包

1 low版本 使用者端 from socket import ip port 127.0.0.1 8080 back log 5buffer size 1024tcp client socket af inet,sock stream ipv4 internet協議,sock stream位元組流...

socket中的粘包理解

粘包問題 傳送端傳送資料,接收端不知道應該如何接收而造成的一種資料混亂的現象 只有tcp協議才會傳送粘包 資料鏈路層 udp 傳輸層 不會發生 udp不會發生粘包,udp協議本層對一次收發資料大小的限制是 65535 ip包頭 20 udp包頭 8 65507針對 使用udp協議傳送資料,一次收發大...

Socket粘包問題

這兩天看csdn有一些關於socket粘包,socket緩衝區設定的問題,發現自己不是很清楚,所以查資料了解記錄一下 一兩個簡單概念長連線與短連線 1.長連線 client方與server方先建立通訊連線,連線建立後不斷開,然後再進行報文傳送和接收。2.短連線 client方與server每進行一次...