Создать ТРУБУ между веб-сокетом и TCP-сокетом - PullRequest
0 голосов
/ 20 октября 2019

Мой сервис уже использует Websockets для связи с веб-сервером. Он также подключается к другой конечной точке tcp.

Он выполняет две функции

1 / => Считывает данные с веб-сервера => writeэто к конечной точке tcp

2 / => Считывает данные из конечной точки tcp => записывает их на веб-сервер.

У меня есть следующий код для цели

import websocket
import asyncio


def open_remote(reader):
print("open remote")
    do_remote_read(reader)

def on_message(ws, message):
    print("message recieved")
    print(message)
    writer.write(message)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

async def do_remote_read(reader):
    print("remote read")
    data = await reader.read(1000)
    ws.send(data)
    print(data.decode())
    print ("remote exit")


def on_open(ws):
    print("websocket opened")
    loop = asyncio.get_event_loop();
    reader, writer = asyncio.open_connection('127.0.0.1', 2000,
                                                  loop=loop)
    asyncio.sleep(3)
    loop.run_until_complete(open_remote(reader))


websocket.enableTrace(True)
ws = websocket.WebSocketApp("ws://x.x.x.x:/abc",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)
ws.on_open = on_open
ws.run_forever()

В этом коде после открытия веб-сокета вызывается обратный вызов on_open, который пытается открыть другую удаленную конечную точку и выдает мне следующую ошибку.

websocket opened
error from callback <function on_open at 0x7f398e3d96a8>: yield from wasn't used with future
  File "/usr/local/lib/python3.6/dist-packages/websocket/_app.py", line 345, in _callback
    callback(self, *args)
  File "websocket_python.py", line 40, in on_open
    loop=loop)
  File "/usr/lib/python3.6/asyncio/streams.py", line 81, in open_connection
    lambda: protocol, host, port, **kwds)
  File "/usr/lib/python3.6/asyncio/base_events.py", line 748, in create_connection
    yield from tasks.wait(fs, loop=self)
  File "/usr/lib/python3.6/asyncio/tasks.py", line 313, in wait
    return (yield from _wait(fs, timeout, return_when, loop))
  File "/usr/lib/python3.6/asyncio/tasks.py", line 396, in _wait
    yield from waiter

1 Ответ

0 голосов
/ 21 октября 2019

Непосредственной причиной ошибки является то, что asyncio.open_connection является сопрограммой, поэтому вы должны дождаться ее или, поскольку on_open не является асинхронной, запустите ее с run_until_complete:

reader, writer = loop.run_until_complete(asyncio.open_connection(...))

Также обратите вниманиетот простой вызов asyncio.sleep(3) ничего не делает, если вы не ждете его от сопрограммы. (Вызов loop.run_until_complete(asyncio.sleep(3)) возможен, но сводится к очень причудливому способу написания time.sleep(3).)

...