Python websockets onclose

2024-10-01 11:39:37 发布

您现在位置:Python中文网/ 问答频道 /正文

在javascript中,我们有WebSocket.onclose()用于在服务器关闭websocket连接时执行一些操作。当客户端设备关闭连接时,在Python服务器中是否有同样的方法?服务器是使用websockets模块本身和websockets.serve()方法运行的。两者都是.Connected&.ConnectionClosed不是WebSocketServerProtocol的属性(或者错误是这样说的)。任何帮助都将不胜感激


Tags: 模块方法服务器客户端属性websocketsjavascriptwebsocket
1条回答
网友
1楼 · 发布于 2024-10-01 11:39:37

recv()和send()都将在关闭的连接上引发websockets.exceptions.ConnectionClosed。在那里处理你的清理工作。见https://websockets.readthedocs.io/en/stable/cheatsheet.html

下面是对文档中websocket web示例的一个轻微修改:

import asyncio
import datetime
import random
import websockets

async def time(websocket, path):
    while True:
        now = datetime.datetime.utcnow().isoformat() + "Z"
        try:
            await websocket.send(now)
        except websockets.exceptions.ConnectionClosed:
            print("Client disconnected.  Do cleanup")
            break             
        await asyncio.sleep(random.random() * 3)

start_server = websockets.serve(time, "127.0.0.1", 5678)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

示例客户端:

import asyncio
import websockets

async def hello():
    uri = "ws://localhost:5678"
    count = 5
    async with websockets.connect(uri) as websocket:
        while count > 0:
            greeting = await websocket.recv()
            print(f"< {greeting}")
            count = count - 1

asyncio.get_event_loop().run_until_complete(hello())

相关问题 更多 >