Я пытаюсь прочитать некоторые потоки данных, используя protobuf в Python, и я хочу использовать трио, чтобы сделать клиент для чтения потоков.Protobuf имеет некоторые вызовы методов, и я считаю, что они не работают, когда я использую потоки трио.
Клиент Python на компьютере с Linux.
import DTCProtocol_pb2 as Dtc
async def parent(addr, encoding, heartbeat_interval):
print(f"parent: connecting to 127.0.0.1:{addr[1]}")
client_stream = await trio.open_tcp_stream(addr[0], addr[1])
# encoding request
print("parent: spawing encoding request ...")
enc_req = create_enc_req(encoding) # construct encoding request
await send_message(enc_req, Dtc.ENCODING_REQUEST,client_stream, 'encoding request') # send encoding request
log.debug('get_reponse: started')
response = await client_stream.receive_some(1024)
m_size = struct.unpack_from('<H', response[:2]) # the size of message
m_type = struct.unpack_from('<H', response[2:4]) # the type of the message
m_body = response[4:]
m_resp = Dtc.EncodingResponse()
m_body
будут некоторые байтовые данные, который я не знаю, как декодировать.Dtc.EncodingResponse()
- это метод protobuf, который дает объект Dtc, который содержит ответ в читаемом формате.(Dtc - это файл protobuf).Но я ничего не понимаю здесь.Когда я делал этот сценарий без трио, Dtc.EncodingResponse()
давал полный ответ в читаемом формате.
Я предполагаю, что проблема в том, что "client_stream" - это объект потока трио, который читает только байты, и поэтому мне, вероятно, нужно вместо этого использовать объект ReceiveChannel
.Но если это правда, я не знаю, как это сделать.
ОБНОВЛЕНИЕ: ответ ниже Натаниэля Дж. Смита решает мою проблему.
m_resp = Dtc.EncodingResponse()
m_resp.ParseFromString(m_body)
Я чувствую себя так глупо, но яне обрабатывал данные ранее, и это было все, что потребовалось.Чрезвычайно благодарен всем, кто дал ответы.Надеюсь, это поможет кому-то там.