Я пытаюсь отправить 2D-массив через сокет, его нужно сделать из нескольких socket.recv (), иначе я получу ошибку _pickle.UnpicklingError: pickle data was truncated
.
Я пытался сделать это, пока l oop получает пакеты и добавляет их в список, пока не будут получены все данные:
def receive(self):
packets = []
while True:
packet = self.socket.recv(1024)
if not packet:
break
packets.append(packet)
data = b"".join(packets)
data = pickle.loads(data)
return data
Просто выполняю:
def receive(self):
data = self.socket.recv(1024)
data = pickle.loads(data)
return data
Работает, если я отправляю что-то меньше, чем двумерный массив, например, кортеж пары координат (2, 3). Но не с 2D-массивом.
Я получаю OSError: [WinError 10022]
при попытке приближения в то время как l oop. Я видел, что OSError: [WinError 10022]
может быть проблемой без привязки сокета, но я думаю, что сделал это.
Я не могу понять, где закрываются соединения, и я очень запутался.
Остальной код:
Сервер:
import socket
from _thread import start_new_thread
clients = []
def threaded(client):
while True:
data = client.recv(1024)
if not data:
print('Not Data.')
break
# Send the data received from one client to all the other clients.
for c in clients:
if c != client:
c.send(data)
client.close()
def Main():
host = ""
port = 5555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("Socket binded to port:", port)
s.listen(2)
print("Socket is listening.")
while True:
c, addr = s.accept()
clients.append(c)
print(f"Connected to: {addr[0]}:{addr[1]}")
start_new_thread(threaded, (c,))
s.close()
Клиент:
import socket
import pickle
class Client:
def __init__(self):
self.host = 'localhost'
self.port = 5555
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
def send(self, data):
message = pickle.dumps(data)
try:
self.socket.send(message)
except socket.error as e:
return str(e)
def receive(self):
packets = []
while True:
packet = self.socket.recv(1024)
if not packet:
break
packets.append(packet)
data = b"".join(packets)
data = pickle.loads(data)
return data
Клиент-сервер, который я хочу сделать, будет иметь 2 клиенты и каждый клиент будут отправлять данные другому постоянно. Как я могу исправить свой код и правильно реализовать это?