【问题标题】:How can I stop my websocket connection from closing?如何阻止我的 websocket 连接关闭?
【发布时间】:2021-04-30 01:58:05
【问题描述】:

我是 websockets 和 asyncio 的新手,我正在尝试让一个简单的示例正常工作。我想创建一个接受来自多个客户端的连接并同时运行一个循环的服务器,该循环每秒向每个连接发送一次消息。我也在尝试使用 asyncio.run(),我认为它优于许多示例所基于的 get_event_loop() 代码。

到目前为止,这是我的代码:

import asyncio
import websockets

USERS = set()

async def register(websocket, path):
    USERS.add(websocket)
    await websocket.send("Successfully registered")

async def count():
    count = 0
    while True:
        print(f"Iteration: {count}")
        if USERS:
            for user in USERS:
                await user.send("Sending message back to client")
        await asyncio.sleep(1)
        count +=1

async def serve():
    server = await websockets.serve(register, 'localhost', 8765)
    await server.wait_closed()
    print("Server closed")

async def main():
    await asyncio.gather(count(), serve())

asyncio.run(main())

当我运行它时,计数协程会一直工作,直到我从客户端建立连接。此时连接已成功注册,但是当我尝试在 count() 中将消息发送回客户端时,由于连接已关闭,我收到错误消息。我应该如何更改我的代码以阻止这种情况发生?

【问题讨论】:

    标签: python websocket python-asyncio


    【解决方案1】:

    我应该如何更改我的代码以阻止这种情况发生?

    问题可能是您的处理程序 register 协程立即返回,这会提示 websockets 关闭连接。尝试像这样更改它:

    async def register(websocket, path):
        USERS.add(websocket)
        await websocket.send("Successfully registered")
        await asyncio.Event().wait()
    

    如果有帮助,您可以将事件与 websocket 一起放入 USERS,以便您可以在需要时终止与客户端的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多