我是websockets和异步通信的新手,我正在尝试使用一个简单的示例。我希望创建一个服务器,该服务器接受来自多个客户端的连接,并同时运行一个循环,该循环每秒钟向每个连接发送一条消息。我还试图使用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()中向客户端发送一条消息时,会收到一个错误,因为连接已经关闭。我应该如何更改我的代码来阻止这种情况的发生?
发布于 2021-04-29 09:58:05
我应该如何更改代码来阻止这种情况的发生?
问题可能是,您的处理程序,即register
协同器,将立即返回,这将提示websockets关闭连接。试着像这样改变它:
async def register(websocket, path):
USERS.add(websocket)
await websocket.send("Successfully registered")
await asyncio.Event().wait()
如果这有帮助,您可以将事件与websocket放在USERS
中,这样您就可以在需要时终止到客户端的连接。
https://stackoverflow.com/questions/67309060
复制