websocket需全生命周期管理:初始化连接并监听onopen/onmessage/onclose/onerror事件;通过心跳机制(ping/pong)与指数退避重连维持稳定性;发送前校验readystate,接收端统一json解析;关闭时调用ws.close()并清理定时器与监听器。

WebSocket 在 JavaScript 中创建长连接实现双向实时通信,核心在于正确初始化连接、监听关键事件、保持连接活性,并处理异常恢复。它不是“建完就完”,而是一整套生命周期管理。
一、创建连接并监听基础事件
使用 new WebSocket(url) 初始化,URL 必须以 ws://(开发)或 wss://(生产,推荐)开头。连接建立后,客户端与服务器即共享一个持久 TCP 通道,可随时互发数据。
必须监听四个核心事件:
- onopen:连接成功建立时触发,此时可立即发送首次消息或启动心跳
-
onmessage:收到服务器推送的数据,
event.data可能是字符串、Blob 或 ArrayBuffer,建议统一转为 JSON 处理 -
onclose:连接关闭(可能是正常关闭,也可能是意外断开),需区分
event.code和event.reason判断原因 - onerror:发生不可恢复错误(如 DNS 失败、SSL 握手失败),通常伴随 onclose,但不提供具体码值,仅作日志记录
二、维持长连接稳定的关键:心跳与重连
真实网络中,NAT 超时、代理中断、Wi-Fi 切换都可能导致连接静默断开。仅靠 onclose 不够,必须主动探测连接状态。
推荐做法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 连接打开后,启动定时器每 20–30 秒向服务端发送一次轻量 ping 消息(如
{"type":"ping"}) - 服务端收到后应立即回传 pong(如
{"type":"pong"}),客户端在onmessage中识别并重置本地心跳超时计时器 - 若连续 2–3 次未收到 pong,视为连接失效,主动调用
ws.close()并触发重连逻辑 - 重连采用退避策略:首次延迟 1 秒,失败则 2 秒、4 秒、8 秒……上限建议 30 秒,避免雪崩式重连
三、发送与接收数据的实用细节
发送前务必检查 ws.readyState:
-
WebSocket.CONNECTING === 0:正在连接,暂不可发 -
WebSocket.OPEN === 1:可安全发送 -
WebSocket.CLOSING / CLOSED === 2 / 3:禁止发送,否则抛错
发送 JSON 数据建议封装方法:
send(data) {
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
this.ws.send(JSON.stringify(data));
}
}
接收端建议统一解析逻辑,对非 JSON 字符串做降级处理,避免因格式异常导致整个消息处理器崩溃。
四、关闭连接与资源清理
页面卸载或用户退出时,应主动关闭连接:
- 调用
ws.close(1000, "user logout")发送标准关闭帧,code 1000 表示正常关闭 - 清除所有定时器(心跳、重连)、移除事件监听器,防止内存泄漏
- 若使用类封装,建议提供
destroy()方法集中处理释放逻辑
不主动关闭,浏览器会在页面关闭时自动终止连接,但服务端可能无法及时感知,造成资源滞留。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










