【问题标题】:Create PIPE between web socket and tcp socket在 web socket 和 tcp socket 之间创建 PIPE
【发布时间】:2019-10-20 18:03:09
【问题描述】:

我的服务已经使用 Websockets 与网络服务器通信 它还连接到另一个 tcp 端点。

它做了两件事

1/ => 从网络服务器读取数据 => 将其写入 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()

在此代码中,一旦打开 websocket,就会调用回调 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

【问题讨论】:

    标签: websocket python-3.6 python-asyncio


    【解决方案1】:

    错误的直接原因是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) 的一种非常奇特的写法。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      相关资源
      最近更新 更多