Распаковка объектов по отдельности из TCP-потока - PullRequest
0 голосов
/ 28 мая 2020

Я хотел бы прочитать один за другим объекты, поступающие из 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()

1 Ответ

0 голосов
/ 29 мая 2020

См. Раздел «Распаковка потока» в README: https://github.com/msgpack/msgpack-python#streaming -распаковка

Вы можете сделать так:

unpacker = msgpack.Unpacker(use_list=False, raw=False)

while True:
    data = connection.recv(1024)
    if not data:
        break
    unpacker.feed(data)
    for unpacked in unpacker:
        print(unpacked)
...