WebSocket 稳定应用的关键在于连得稳、发得准、收得全、断了能续;需手动实现心跳保活、ACK确认、序列号校验、退避重连及消息队列管理。
JavaScript 中实现 WebSocket 通信很简单,但要做出稳定、可用的实时应用,关键不在“连上”,而在“连得稳、发得准、收得全、断了能续”。
用 new WebSocket(url) 创建实例即可建立长连接。它自动处理底层 TCP 握手(基于 HTTP 升级协议),之后客户端和服务端可随时互相发送文本或二进制数据。
open 事件表示连接就绪,此时才能调用 send()
onmessage 接收服务端推送的数据,event.data 是字符串或 Blob(取决于服务端发送类型)onerror 不代表连接失败,只是某次操作出错;真正判断断连要看 onclose
WebSocket 没有内置心跳机制,NAT、代理、防火墙可能在空闲几十秒后静默关闭连接。必须手动加心跳。
ws.send("ping")),服务端收到后立即回 pongws.close() 并触发重连onclose 的 event.code 判断原因——很多断连不带明确码,需结合超时逻辑综合判断WebSocket 本身保证消息有序、不丢包(TCP 层),但不保证“业务层面送达”。比如用户离线时消息就丢了。
onmessage
中做耗时同步操作(如大量 DOM 更新),用 requestIdleCallback 或分片处理防卡顿网络抖动很常见,暴力轮询重连会雪崩。需要退避+状态管理。
connecting / open / reconnecting / closed),UI 显示“正在重连…”并禁用发送按钮不复杂但容易忽略。