websocket断线重连采用指数退避策略,即延迟从1s逐次翻倍至最大30s,限制最多重试10次,连接成功后重置延迟与计数,并结合抖动、可见性及网络状态提升稳定性。

WebSocket 断线重连时用指数退避,核心是让每次重试间隔随失败次数递增(如 1s → 2s → 4s → 8s),避免密集重连冲击服务端或客户端资源。关键在于控制重连延迟、限制最大重试次数,并在连接成功后重置状态。
定义退避参数与状态变量
在 WebSocket 实例外维护重连控制变量,避免闭包混乱或重复初始化:
- reconnectDelay:当前重连等待毫秒数,初始设为 1000(1 秒)
- maxReconnectDelay:最大等待时间(如 30000,即 30 秒),防止间隔过长影响体验
- reconnectAttempts:已尝试次数,用于计算退避倍数
- maxReconnectAttempts:总重试上限(如 10 次),超限后停止自动重连
- reconnectTimer:存储 setTimeout 句柄,便于连接成功时 clearTimeout
封装带退避的重连逻辑
将重连动作封装为函数,在 onclose 或 onerror 中触发,而非直接 new WebSocket:
- 每次调用前先清除上一次定时器(防止旧定时器在新连接建立后误触发)
- 检查是否已达最大重试次数,若是则退出并可触发全局错误通知
- 设置下一次重连延迟:
Math.min(reconnectDelay * 2, maxReconnectDelay) - 更新
reconnectDelay和reconnectAttempts - 用
setTimeout延迟执行实际连接逻辑
连接成功后重置退避状态
在 WebSocket 的 onopen 回调中必须重置退避参数,否则下次断线会沿用上次的高延迟:
- 将
reconnectDelay设回初始值(如 1000) - 将
reconnectAttempts归零 - 清除当前
reconnectTimer(虽已触发,但保险起见) - 可选:记录日志或触发“重连成功”事件供 UI 更新
增强稳定性的小技巧
实际项目中建议补充以下细节提升鲁棒性:
- 在
onclose中判断event.code(如 1000 是正常关闭,不重连;其他码才触发退避重连) - 加入随机抖动(jitter),例如
delay * (0.5 + Math.random() * 0.5),避免多客户端同步重连 - 监听页面可见性(
document.visibilityState),页面隐藏时暂停重连,唤醒后再续 - 连接前检查网络状态(
navigator.onLine),离线时不盲目重试
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











