websocket 未就绪时需暂存待发消息至内存队列以确保不丢、不错、不乱序;推荐用 useref(react)或数组维护队列,仅存原始消息体;发送前校验 readystate,非 open 则入队,onopen 后 fifo 发送;重连后应重绑 onmessage 并丢弃旧接收消息。

在 WebSocket 连接尚未建立(readyState 不为 OPEN)时,直接调用 ws.send() 会报错。所以必须在发送前做状态守门,并把待发消息暂存到内存队列中——这不是为了“攒着一起发”,而是确保不丢、不错、不乱序。
用 ref 或变量维护一个稳定的消息队列
推荐使用 useRef(React)或普通数组(原生 JS)来持有待发消息,避免因组件重渲染或作用域丢失导致队列被重置:
- 队列结构建议为数组,每项是原始消息体(如字符串或已序列化的 JSON)
- 不要存闭包或 DOM 引用等易失效对象
- 如果消息含时间戳或唯一 ID,可顺便用于去重或幂等校验
发送时检查 readyState,非 OPEN 就入队
每次调用发送函数,先判断连接状态:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
ws.readyState === WebSocket.OPEN→ 直接send() -
ws.readyState === WebSocket.CONNECTING→ 入队,稍后 onopen 里统一发 -
ws.readyState === WebSocket.CLOSING或CLOSED→ 可选择入队(等待重连成功后补发),或按业务丢弃非关键消息(如打字提示)
onopen 回调中清空队列并逐条发送
连接就绪后,立即消费积压消息:
- 用
while (queue.length)+shift()保证 FIFO 顺序 - 每条发送后可加简单节流(如
await new Promise(r => setTimeout(r, 0)))避免突发压垮服务端 - 若某条发送失败(如抛异常),应记录并停止后续发送,避免雪崩
注意:接收缓冲区不需暂存,旧消息要清空
连接断开重连后,前端收到的“历史消息”可能是上一连接残留的。因此:
- 不要复用旧的
onmessage处理器,重连后应重新绑定 - 新连接建立后,接收侧不做跨会话缓存;已入队但未处理的接收消息,应主动丢弃
- 服务端配合下发连接标识(如
connId)或消息 seq,前端可据此过滤过期数据
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










