使用Websockets检测Python / Quart中的客户端断开连接

xdnvmnnf  于 2022-11-11  发布在  Python
关注(0)|答案(1)|浏览(289)

我有多个客户端,我存储在一个列表中(已连接)。当一个客户端(浏览器)关闭时,我想从已连接的websocket列表中删除此WebSocket。
我尝试了pgjones编写的方法,但做了一些小改动(https://medium.com/@pgjones/websockets-in-quart-f2067788d1ee):

def collect_websocket(func):
        @wraps(func)
        async def wrapper(*args,**kwargs):
            global connected
            data = await websocket.receive()
            data_json = json.loads(data)

            if data_json['msg_type'] == 'client_connect':
                if "id" in data_json:
                    new_client = Client(data_json['id'], False, websocket._get_current_object())
                    connected.add(new_client)
            try:
                return await func(*args,**kwargs)
            except Exception as e:
                connected.remove(websocket._get_current_object())
            finally:
                for connect in connected:
                    if connect.ws == websocket._get_current_object():
                        connected.remove(connect)
                    break
        return wrapper

...
在代码的后面...
...

async def update_clients(self, input_survey):
        try:
            for client in connected:
                if client.survey_id == input_survey.identifier:
                    my_websock = client.ws
                    message = { ... some message...
                                }
                    message_json = json.dumps(message)
                    await my_websock.send(message_json)
        except:
            var = traceback.format_exc()
            constants.raven_client.captureException()
            self.logger.error('ERROR updating clients: {}'.format(str(var)))

在update_clients中,应该有一些检测到发送到一个已经不存在的WebSocket出错了...然后删除它。但是没有例外...?!
我也竭力想:

try:
    await my_websock.send(message_json)
except asyncio.CancelledError:
    print('Client disconnected')
    raise

但依旧没有出现异常......

e4eetjau

e4eetjau1#

在更新quart和hypercorn到0.9/0.6后,代码可以在PC上的浏览器上工作。
但是当我用iPhone / iPad建立连接,然后关闭它时,连接没有被删除!
有什么建议吗?

相关问题