WebSocket断开后必须手动实现重连逻辑,核心是状态机管理生命周期、指数退避控制重试时机、重连后恢复业务状态(如重发缓存消息、重新订阅)、结合网络事件辅助但不依赖onLine判断。

WebSocket 断开后不能自动重连,必须手动实现重连逻辑。关键不是“立刻重试”,而是控制重试时机、避免雪崩、同步状态,并在重连成功后恢复业务上下文(比如重新订阅消息、补发未确认数据)。
1. 用状态机管理连接生命周期
定义明确的状态(CONNECTING、OPEN、CLOSING、CLOSED),避免重复创建 WebSocket 实例或在错误状态下调用 send()。
- 每次新建 WebSocket 前检查当前状态,非 CLOSED 或 CLOSING 时不新建
- 监听
onopen后设为 OPEN;onclose和onerror统一触发到 CLOSED 状态 - 调用
close()时主动设为 CLOSING,防止 onclose 再次触发重连
2. 指数退避 + 最大重试次数
连续失败后逐步拉长重试间隔,防止服务端压力激增或客户端卡死。
- 初始延迟 1000ms,每次失败 ×1.5(如 1000 → 1500 → 2250 → 3375…)
- 设置上限(如最多重试 5 次),超限后暂停自动重连,交由用户手动触发或告警
- 可配合随机抖动(±10%)避免多客户端同时重连
3. 重连成功后恢复业务状态
仅重建连接不够,需同步上次断开前的“会话语义”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 缓存断连期间的待发消息(如聊天输入、指令),重连后按序重发,并加唯一 ID 防重复
- 维护一个订阅列表(如
["topic/chat", "topic/notify"]),重连后主动发送 SUBSCRIBE 命令 - 若服务端支持,带上 lastMessageId 或 timestamp 请求增量消息,避免丢失
4. 监听网络变化辅助判断
结合 navigator.onLine 和 window.addEventListener('online') 可提前感知网络恢复,但注意:onLine 是粗略指标(仅反映系统网络栈,不保证 WebSocket 可达)。
- 网络恢复时可清空退避计时器,立即尝试一次连接
- 仍需以 WebSocket 自身的 onopen/onerror 为准,不能依赖 onLine 做唯一判断
- 移动端尤其要注意,Wi-Fi 切换蜂窝网络时 onLine 可能短暂为 true 但实际不可连
不复杂但容易忽略的是状态同步和消息去重。重连不是“再 new 一次 WebSocket”,而是让前端会话对齐服务端当前上下文。

















