websocket 连接通过 onopen 和 onclose 直接赋值监听,onopen 在握手完成时触发且 readystate 已为 open,可立即发消息;onclose 提供 code、reason、wasclean 字段区分正常/异常关闭,建议做清理并按需重连;onerror 仅捕获底层错误,不可靠,应以 onclose 的 wasclean 判断连接状态。

WebSocket 连接的打开与关闭事件,通过 onopen 和 onclose 两个事件处理器监听,它们是 WebSocket 实例的原生属性,无需额外注册。
监听连接成功(onopen)
当 WebSocket 成功建立连接、握手完成时触发。此时可以开始发送消息或更新 UI 状态。
- 确保在
new WebSocket(url)创建实例后立即赋值,避免因连接过快导致错过事件 -
event参数在onopen中通常不携带关键信息,可忽略或用于调试 - 不要在
onopen中重复调用send()前检查readyState,因为触发时readyState === WebSocket.OPEN已为真
示例:
const ws = new WebSocket('wss://example.com/chat');<br>ws.onopen = function(event) {<br> console.log('连接已建立');<br> ws.send(JSON.stringify({ type: 'join', user: 'Alice' }));<br>};
监听连接关闭(onclose)
当连接被服务器关闭、网络中断或主动调用 ws.close() 时触发。注意:它不区分正常关闭和异常断开。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
event对象包含code(关闭码)、reason(关闭原因字符串)、wasClean(是否为正常关闭)三个有用字段 -
wasClean === true表示双方协商关闭(如服务端调用了close()),否则可能是网络问题或服务异常终止 - 建议在
onclose中做清理工作(如清除定时器、重置状态),并考虑是否需要自动重连
示例:
ws.onclose = function(event) {<br> console.log(`连接关闭:${event.wasClean ? '正常' : '异常'},码 ${event.code},原因:${event.reason}`);<br> if (!event.wasClean) {<br> setTimeout(() => connectWebSocket(), 3000); // 异常时尝试重连<br> }<br>};
补充:错误监听(onerror)
onerror 不是连接生命周期事件,而是发生不可恢复错误时触发(如 DNS 失败、SSL 握手失败、URL 无效等)。它不会提供详细错误信息,且触发后通常紧跟着 onclose。
- 不要依赖
onerror判断连接是否失败——onopen未触发 +onclose的wasClean === false更可靠 - 可在
onerror中记录日志,但一般不执行业务逻辑
示例:
ws.onerror = function(event) {<br> console.error('WebSocket 发生错误', event);<br>};
注意 readyState 的使用时机
readyState 是只读属性,反映当前连接状态:0=CONNECTING、1=OPEN、2=CLOSING、3=CLOSED。它适合在发送前判断,但不能替代事件监听。
- 不要轮询
readyState来等待连接就绪——应使用onopen - 发送消息前检查:
if (ws.readyState === WebSocket.OPEN) ws.send(...),防止报错 - 创建实例后立即检查
readyState可能仍为0,不代表失败,只是尚未完成握手
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










