websocket 四个核心事件是连接生命周期的刚性环节:onopen 在通道真正就绪(readystate=1)后触发,初始化操作须置于其回调中;onmessage 需按 data 类型(blob/arraybuffer/string)分类处理;onerror 表示协议层异常,非断连通知,需记录上下文并节流重连;onclose 是终结信号,依 code 区分关闭原因并执行清理或条件重连。

WebSocket 的四个核心事件不是可选插件,而是连接生命周期的刚性环节。漏掉任何一个,尤其是 onerror,就等于在通信链路上埋下静默故障的隐患。
onopen:只在真正就绪时发初始化消息
它不是构造 WebSocket 实例后立刻触发的,而是在 TCP 握手完成、HTTP 升级响应成功、且底层通道可用时才执行。此时 readyState 一定是 1(OPEN),但 JS 执行可能快于事件调度——所以不能在 new WebSocket() 后直接 send()。
- 所有初始化动作(如登录认证、订阅频道)必须写在 onopen 回调里
- 避免在 onopen 外部检查 readyState 并调用 send(),容易因状态未稳报 InvalidStateError
- 调试时可在 onopen 中打印 ws.readyState 和时间戳,确认是否真正在通道就绪后执行
onmessage:data 类型不固定,必须分类处理
evt.data 可能是 string、Blob 或 ArrayBuffer,取决于服务端发送方式和 binaryType 设置。直接 JSON.parse(evt.data) 在二进制场景下会失败。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 优先用 instanceof 判断:先 check evt.data instanceof Blob,再 check ArrayBuffer,最后当 string 处理
- Blob 用 evt.data.text()(返回 Promise,需 await 或 .then)
- ArrayBuffer 用 new TextDecoder().decode(evt.data)
- 不要依赖 typeof evt.data === 'string' 做唯一判断,某些浏览器在 binaryType: 'arraybuffer' 下仍可能返回小字符串
onerror:它是警报器,不是断连通知
触发时连接未必已断——readyState 可能还是 0 或 1,且通常几毫秒内就会跟来 onclose。它表示协议层异常:DNS 失败、证书无效、跨域拒绝、帧损坏等。
- 不要在 onerror 里调 ws.close(),可能引发 InvalidStateError
- 应记录上下文:evt.target.url、ws.readyState、时间戳
- 可触发重连逻辑,但要加节流或指数退避,防止雪崩
- 漏绑 onerror 是常见错误,会导致防火墙拦截、SSL 错误等完全无感知
onclose:连接终结的正式信号
这是连接生命周期的终点事件,event.code 和 event.reason 能帮你区分关闭原因:1000 是正常关闭,1006 是异常断连,4001 这类可能是业务自定义码。
- 在这里做清理工作:清除定时器、释放资源、重置 UI 状态
- 若需自动重连,应在 onclose 中启动,而不是 onerror
- 注意:手动调用 ws.close() 也会触发 onclose,code 默认为 1000
- 不要把 onclose 当作“重连指令”盲目执行,先看 code 再决定策略










