我做了一個非常簡單的服務器和客戶端程式來測驗。我需要從服務器發送 3 個不同的串列,客戶端必須單獨接收它們。請你幫助我好嗎 ?
這是 server.py
import socket
import pickle
am0=['AQ-20', 'A3000', 'AQ-26', 'A5000', 'AQ-33', 'A5000pro', 'AQ-33pro']
am1=['A10000Pro', 'AQ-43', 'AX-48', 'AX-58', 'AX-68']
am2=['Material', 'nan', 'Steel', 'Stainless S.', 'Stainless S. 1.403']
am00=pickle.dumps(am0)
am01=pickle.dumps(am1)
am02=pickle.dumps(am2)
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysocket.bind(('127.0.0.1', 1))
buffer_size = 1024
mysocket.listen()
(client, (ip,port)) = mysocket.accept()
client.send(am00)
#----------------HOW CAN I ADD THEM:----------------
#client.send(am01)
#client.send(am02)
mysocket.close()
這是client.py
import socket
import pickle
host = '127.0.0.1'
port = 1
buffer_size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
#----------------HOW CAN I RECEIVE THEM SEPERATELY ?----------------
data1 = pickle.loads(s.recv(buffer_size))
print(data1)
uj5u.com熱心網友回復:
pickle 協議包括pickle 緩沖區的長度,您可以使用一次pickle.Unpickler加載一個pickle 物件。問題是它需要一個類似檔案的物件,而不是一個套接字。幸運的是,套接字可以使用socket.makefile. 有一些警告,因此閱讀參考檔案是值得的。
更新您的服務器以寫入每個腌制物件,然后將客戶端更改為
import socket
import pickle
host = '127.0.0.1'
port = 8899
buffer_size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
unpickler = pickle.Unpickler(s.makefile("rb"))
print(unpickler.load())
print(unpickler.load())
print(unpickler.load())
uj5u.com熱心網友回復:
這是一個更通用的方法,也適用于非腌制資料(例如,從 c 套接字接收資料),您首先發送資料 len,然后將實際資料串行發送到套接字,請注意,while 回圈在那里,因為您不能保證在一次呼叫中接收指定數量的位元組,如果資料尚未到達,您將收到更少的資料。struct.pack 將您提供給函式的資料按照第一個引數提供的順序打包為二進制資料,'H' 表示 unsigned short,長度為 2 個位元組(您可以打包的最大整數為 65535)
服務器:
import socket
import pickle, struct
am0=['AQ-20', 'A3000', 'AQ-26', 'A5000', 'AQ-33', 'A5000pro', 'AQ-33pro']
am1=['A10000Pro', 'AQ-43', 'AX-48', 'AX-58', 'AX-68']
am2=['Material', 'nan', 'Steel', 'Stainless S.', 'Stainless S. 1.403']
am00=pickle.dumps(am0)
am00 = struct.pack("H", len(am00)) am00
am01=pickle.dumps(am1)
am01 = struct.pack("H",len(am01)) am01
am02=pickle.dumps(am2)
am02 = struct.pack("H", len(am02)) am02
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysocket.bind(('127.0.0.1', 1))
buffer_size = 1024
mysocket.listen()
(client, (ip,port)) = mysocket.accept()
client.send(am00)
#----------------HOW CAN I ADD THEM:----------------
client.send(am01)
client.send(am02)
mysocket.close()
客戶:
import socket
import pickle, struct
host = '127.0.0.1'
port = 1
buffer_size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
#----------------HOW CAN I RECEIVE THEM SEPERATELY ?---------------
def recv_all(sock:socket.socket):
data_len = 0
buffer = b''
while len(buffer) < 2:
buffer = sock.recv(2-len(buffer))
data_len = struct.unpack("H", buffer)[0]
buffer = b''
while len(buffer) < data_len:
buffer = sock.recv(data_len-len(buffer))
return buffer
data1 = pickle.loads(recv_all(s))
print(data1)
data1 = pickle.loads(recv_all(s))
print(data1)
data1 = pickle.loads(recv_all(s))
print(data1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313419.html
