websocket客户端需确保连接就绪(readystate===1)才可发送消息,否则会抛错;应封装sendmessage()方法,根据连接状态选择直发或入队,并通过onopen事件清空并重发队列。

WebSocket 客户端发送消息前必须确保连接已建立(readyState === 1),否则调用 send() 会直接抛错。实现一个轻量级发送队列,核心是:缓存待发消息 + 监听连接就绪事件 + 按序重放。
监听连接状态并触发重发
在 WebSocket 实例创建后,立即监听 open 事件,在回调中清空队列并逐条发送。注意避免重复监听(例如重连时)——推荐每次新建连接时重新绑定一次即可。
- 用数组(如
pendingQueue = [])暂存未发出的消息(字符串或可序列化对象) ws.onopen = () => { pendingQueue.forEach(msg => ws.send(msg)); pendingQueue.length = 0; }- 若连接过程中多次调用
send(),统一推入队列,不主动尝试发送
封装安全的 send 方法
不要直接调用原生 ws.send(),而是封装一个带队列逻辑的 sendMessage():
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 检查
ws.readyState === 1:是 → 直接发;否 → 推入队列 - 支持传入字符串、
ArrayBuffer或Blob(需判断类型后入队,发送时保持原样) - 可选:为每条消息附加时间戳或 ID,便于调试或去重
处理连接中断与重连场景
仅靠 open 事件不够——断连后新消息仍可能进队列,而重连成功前无法发送。建议配合简单重连机制:
-
ws.onclose中标记连接断开,并可选择性清空或保留队列(根据业务:如聊天消息可暂存,实时指令则丢弃) - 重连成功后再次触发
onopen,自然完成重发 - 避免无限重试:加次数限制或退避延迟(如 1s、2s、4s)
可选增强:添加发送确认与超时
纯队列解决“不报错”,但不保证送达。如需可靠性:
- 服务端返回
ack消息,客户端维护待确认队列,超时未回则重发 - 给队列中的每条消息加唯一 ID 和计数器,防止重复投递
- 前端业务层调用
sendMessage()时可传回调或 Promise,内部 resolve 在收到 ack 后触发
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










