【问题标题】:Why websocket with aiohttp server doesn't work为什么带有 aiohttp 服务器的 websocket 不起作用
【发布时间】:2023-01-14 06:45:45
【问题描述】:

我试图了解带有 aiohttp 的 websocket 是如何工作的,所以我从文档 https://docs.aiohttp.org/en/stable/web_quickstart.html#websockets 运行这段代码:

async def websocket_handler(request):

    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.type == aiohttp.WSMsgType.TEXT:
            if msg.data == 'close':
                await ws.close()
            else:
                await ws.send_str(msg.data + '/answer')
        elif msg.type == aiohttp.WSMsgType.ERROR:
            print('ws connection closed with exception %s' %
                  ws.exception())

    print('websocket connection closed')

    return ws

app = web.Application()
app.add_routes([web.get('/ws', websocket_handler)])


asyncio.run(web.run_app(app))

我用 curl 检查的结果:

curl  http://0.0.0.0:8080/ws

我看到的消息是:

No WebSocket UPGRADE hdr: None
 Can "Upgrade" only to "WebSocket"

Firefox 显示相同的消息。

我究竟做错了什么?也许有人知道问题出在哪里?

【问题讨论】:

  • 1. Firefox 在哪里显示相同的信息?我假设您需要一些额外的代码来从 Firefox 启动 WS 连接——如果是这样,您能否也将它添加到问题中?
  • 2. 如果您使用其他一些已知可以工作的 WS 服务器并使用 curl 对其进行测试,会发生什么情况?或者使用其他客户端来测试? (例如github.com/vi/websocat
  • 可能相关:stackoverflow.com/a/34925832 现在读完之后,我想问题可能在于在这两种情况下,客户端都没有告诉服务器它希望升级到 WebSocket,但这是必需的
  • 谢谢你的 cmets。我尝试了 github.com/vi/websocat 客户端,一切正常。所以问题是我如何尝试连接到 WS 服务器,而不是在 aiohttp 示例中。

标签: python websocket aiohttp


【解决方案1】:

对于仍然对为什么不能使用 websocat 测试上面给出的 aiohttp websocket 示例感到困惑的任何人,值得注意的是当前版本 (v1.11.0) 存在问题

brew install websocat

这意味着 localhost 没有正确解析。

如果您用 127.0.0.1 代替,它就可以正常工作。例如:

websocat ws://127.0.0.1:8000/ws

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2015-10-10
    • 2019-12-23
    相关资源
    最近更新 更多