From 2ca3b9da3429c0f2f787bdb9a15bfd1f400d1042 Mon Sep 17 00:00:00 2001 From: This-is-XiaoDeng <1744793737@qq.com> Date: Mon, 17 Aug 2026 00:30:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20WebSocket=20?= =?UTF-8?q?=E5=8F=8D=E5=90=91=E8=BF=9E=E6=8E=A5=E6=96=AD=E5=BC=80=E5=90=8E?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE=E9=87=8D=E8=BF=9E=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 EventClient.push_event() 中添加 ConnectionClosedError 异常处理 - 在 reconnect() 中先关闭旧连接再建立新连接,避免下游服务器保留旧连接拒绝新连接 - 修复了 WebSocket 因 keepalive ping 超时断开后任务异常未被捕获的问题 --- network/v11/ws_reverse.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/network/v11/ws_reverse.py b/network/v11/ws_reverse.py index 7cde5ba..3b22d8b 100644 --- a/network/v11/ws_reverse.py +++ b/network/v11/ws_reverse.py @@ -65,7 +65,14 @@ async def create_connection(self) -> None: ) async def reconnect(self) -> None: - # 但愿别 tm 出 bug + # 先关闭旧连接,避免下游服务器保留旧连接拒绝新连接 + if hasattr(self, "ws"): + try: + await self.ws.close() + except Exception: + pass # 忽略关闭时的错误 + self.ws = None + if not self.connect_task: self.connect_task = asyncio.create_task(self.connect()) await self.connect_task @@ -141,9 +148,22 @@ def __init__(self, config: dict) -> None: self.role = "Event" async def push_event(self, event: dict) -> None: - if not hasattr(self, "ws"): + if not self.is_ready(): + await self.reconnect() + try: + await self.ws.send(json.dumps(await translator.translate_event(event))) + except websockets.exceptions.ConnectionClosedError: + logger.warning( + f"从反向 WebSocket {self.role} 断开连接: {traceback.format_exc()}" + ) await self.reconnect() - await self.ws.send(json.dumps(await translator.translate_event(event))) + # 重连后重试发送 + try: + await self.ws.send(json.dumps(await translator.translate_event(event))) + except Exception: + logger.error( + f"重连后发送事件失败: {traceback.format_exc()}" + ) class UniversalClient(APIClient, EventClient):