Я хотел бы прочитать один за другим объекты, поступающие из TCP-потока, желательно с помощью библиотеки MessagePack .
С одной стороны, у меня есть клиент что на каждой итерации al oop:
- вычисляет местоположение точки (кортеж)
- упаковывает это местоположение и отправляет его через сокет
С другой стороны, сервер , который:
- получает данные при обнаружении клиента
- распаковывает эти данные
Пока я сохраняю данные в буфере при получении, а затем приступаю к распаковке, когда поток закончится. Моя проблема в том, что мне нужно распаковывать кортежи один за другим по мере их отправки . Другими словами, я хотел бы читать данные в реальном времени , не помещая их в буфер.
Если это возможно, как я могу добиться этого с помощью MessagePack?
- на стороне клиента -
#Python3.7
import socket
import msgpack
import math
HOST = "127.0.0.1"
PORT = 9000
den = 40
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(den):
x = math.cos(i*theta) * rad
y = math.sin(i*theta) * rad
data = msgpack.packb((x, y), use_bin_type = True)
sock.sendall(data)
- на стороне сервера -
#Jython2.7 <-- Python 2.7 compatible only
from io import BytesIO
import msgpack
import socket
HOST = "127.0.0.1"
PORT = 9000
buf = BytesIO()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
connection, address = s.accept()
while True:
try:
data = connection.recv(1024)
buf.write(data)
except:
buf.seek(0)
unpacker = msgpack.Unpacker(buf, use_list=False, raw=False)
for unpacked in unpacker:
print(unpacked)
buf = BytesIO()