AQQBot icon indicating copy to clipboard operation
AQQBot copied to clipboard

WebSocket 连接断开或对端死机后存在无限等待风险,建议增加超时和心跳机制

Open mike-brown8 opened this issue 2 months ago • 1 comments

您好,目前代码中 WebSocket 相关逻辑(如 AQQBotWebhookServer.kt)在连接断开或对端死机等异常情况下,未见实现主动超时断开、心跳包(如 ping/pong)、自动重连等机制。
虽然主类(如 AQQBot.kt)有定时检测 bot 状态并尝试重连的逻辑,但这只针对上层 bot 实例,对于底层 WebSocket 连接因网络异常或对端无响应导致的“假死”,依然可能出现无限等待或资源长期占用的风险。

建议

  1. 在 WebSocket 服务器和客户端实现心跳包(如定时发送 ping/pong),检测连接存活状态。
  2. 设置合理的超时时间,如一段时间内无响应自动断开连接并尝试重连。
  3. 对于 onCloseonError 等事件,增加日志与重连逻辑,避免长时间挂起。

复现方式

  • 启动 bot 并建立 WebSocket 连接,让对端异常关闭(如 kill 掉进程或断网),观察 bot 是否能及时感知并恢复连接。
  • 若对端失联但连接未及时断开,可验证“无限等待”现象。

相关代码位置

  • common/src/main/kotlin/top/alazeprt/aqqbot/api/webhook/AQQBotWebhookServer.kt
  • common/src/main/kotlin/top/alazeprt/aqqbot/AQQBot.kt

期望行为

  • WebSocket 连接异常时能自动超时关闭并尝试重连,避免资源泄漏或功能失效。

by Copilot

mike-brown8 avatar Sep 30 '25 23:09 mike-brown8