我有多个客户端,我存储在一个列表中(已连接)。当一个客户端(浏览器)关闭时,我想从已连接的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
但依旧没有出现异常......
1条答案
按热度按时间e4eetjau1#
在更新quart和hypercorn到0.9/0.6后,代码可以在PC上的浏览器上工作。
但是当我用iPhone / iPad建立连接,然后关闭它时,连接没有被删除!
有什么建议吗?