feat: 增加信令自动重连保活与控制端视频录制

- 信令客户端增加心跳保活与指数退避自动重连机制
- 服务端优化传输异常日志级别,客户端断开不再报错
- 被控端信令断开时保持服务运行并自动重连
- Flutter 控制端增加远程视频录制功能,兼容标准 WebRTC 模式切换
- 各端连接按钮增加“连接中”状态防重复点击
This commit is contained in:
TongTongStudio
2026-07-30 00:40:22 +08:00
parent 7f545359d9
commit e831ef2795
14 changed files with 444 additions and 27 deletions

View File

@@ -123,11 +123,24 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
logger.error("Transport error on session {}: {}", session.getId(), exception.getMessage());
// EOFException / 连接被对端重置 属于正常网络事件(客户端网络中断、代理空闲超时等),
// 并非服务器错误,降级为 DEBUG 记录,避免误导。
boolean benign = exception instanceof java.io.EOFException
|| (exception.getMessage() != null
&& (exception.getMessage().contains("Connection reset")
|| exception.getMessage().contains("Broken pipe")
|| exception.getMessage().contains("An established connection")));
if (benign) {
logger.debug("Transport closed (client disconnected) on session {}: {}",
session.getId(), exception.getMessage());
} else {
logger.warn("Transport error on session {}: {}", session.getId(), exception.getMessage());
}
sessionManager.unregisterSession(session);
metrics.recordSessionCount(sessionManager.getOnlineCount());
// 连接已不可用时无需再以 SERVER_ERROR(1011) 关闭;仅在仍打开时温和关闭。
if (session.isOpen()) {
session.close(CloseStatus.SERVER_ERROR);
session.close(CloseStatus.GOING_AWAY);
}
}