【发布时间】: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 示例中。