websocket意外断开后自动重连需监听onclose为主、onerror为辅,结合readystate检查触发重连;采用指数退避延迟(初始1000ms,系数1.5,上限30秒)并限制最大重试次数(如10次);重连前清除旧连接与定时器,避免重复连接和内存泄漏。

WebSocket 意外断开后自动重连,核心是监听 onclose 和 onerror 事件,在合适时机调用重新连接逻辑,并加入退避策略避免频繁重试。
监听断开与错误,触发重连入口
WebSocket 本身不提供自动重连,需手动捕获连接异常:
-
ws.onclose:连接被服务器关闭、网络中断、页面卸载等导致关闭时触发(含正常关闭和异常断开) -
ws.onerror:发生不可恢复错误时触发(如 URL 错误、跨域失败),但注意该事件不冒泡,且部分浏览器在连接未真正建立前就触发,不能单独依赖它判断断连 - 推荐以
onclose为主判断依据,配合状态检查(如ws.readyState !== WebSocket.OPEN)防止重复触发
实现带延迟和退避的重连逻辑
直接立即重连可能压垮客户端或服务端。应引入递增延迟(指数退避)并限制最大重试次数:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 定义初始延迟(如 1000ms),每次失败后乘以系数(如 1.5),上限设为 30 秒左右
- 设置最大重试次数(如 10 次),达到后可暂停或提示用户
- 使用
setTimeout启动重连,重连前先清除旧定时器、检查是否已手动关闭 - 示例关键片段:
let reconnectDelay = 1000;
let retryCount = 0;
const maxRetries = 10;
function connect() {
ws = new WebSocket('wss://example.com');
ws.onopen = () => { retryCount = 0; reconnectDelay = 1000; };
ws.onclose = () => { if (retryCount ws.onerror = (e) => console.warn('WebSocket error:', e);
}
避免重复连接和内存泄漏
重连过程中若用户主动关闭或页面跳转,需清理资源:
- 每次新建 WebSocket 前,检查并关闭上一个实例(
if (ws && ws.readyState === WebSocket.OPEN) ws.close()) - 将
ws实例和定时器 ID 存为模块级/类成员变量,便于统一管理 - 在页面卸载前(
beforeunload或visibilitychange)主动关闭连接,避免后台无效重试 - 重连时取消上一次未执行的定时器(保存
timeoutId并在新连接前clearTimeout(timeoutId))
补充健壮性措施
真实场景还需考虑心跳保活和连接状态同步:
- 服务端无响应时,WebSocket 可能长时间保持
OPEN状态却不收发数据 —— 需客户端定期发 ping(如每 30 秒ws.send('ping')),超时未收到 pong 则视为断连并主动 close 触发重连 - 重连成功后,建议重新发送订阅消息或同步业务状态(如重订 topic、恢复游标位置)
- 可暴露
reconnect()方法供外部手动触发,比如用户点击“重试”按钮
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










