Вам необходимо установить соединение, address = s.accept () за пределами while l oop, иначе ваш сервер будет каждый раз ждать нового соединения.
У вас также есть проблема с тем, как ваш получают данные. connection.recv(4096)
будет возвращать любое количество байтов от 0 до 4096 не каждый раз, когда принимается полное сообщение с «данными». Чтобы справиться с этим, вы можете отправить заголовок перед отправкой вам json, указывающий, сколько данных должно быть получено. Добавив заголовок, вы убедитесь, что отправляемые вами сообщения с данными будут получены правильно.
Заголовок в этот пример представляет собой четырехбайтовое целое число, указывающее размер данных.
Сервер
import pickle
import socket
import struct
HEADER_SIZE = 4
HOST = "127.0.0.1"
PORT = 12000
def receive(nb_bytes, conn):
# Ensure that exactly the desired amount of bytes is received
received = bytearray()
while len(received) < nb_bytes:
received += conn.recv(nb_bytes - len(received))
return received
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
connection, address = s.accept()
while True:
# receive header
header = receive(HEADER_SIZE, connection)
data_size = struct.unpack(">i", header)[0]
# receive data
data = receive(data_size, connection)
print(pickle.loads(data))
Клиент
import socket
import pickle
import math
HEADER_SIZE = 4
HOST = "127.0.0.1"
PORT = 12000
den = 20
rad = 100
theta = math.tau / den
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((HOST, PORT)) #connect to server
for step in range(1000):
i = step%den
x = math.cos(i*theta) * rad
y = math.sin(i*theta) * rad
data = pickle.dumps((x, y), protocol=0)
# compute header by taking the byte representation of the int
header = len(data).to_bytes(HEADER_SIZE, byteorder ='big')
sock.sendall(header + data)
Надеюсь, это поможет