本技能讲解原生 WebSocket API 的实时通信模式。原生 API 只提供全双工通道,重连、存活检测、断线期间投递和消息类型都需自行实现。
用途:适用于低延迟双向通信场景,如聊天、协同编辑、实时仪表盘;也覆盖带退避与抖动的重连、心跳与关闭码解读、有界队列跨短暂断线投递、类型化消息契约、二进制帧与分块传输、组件树间共享连接。
主要能力与要点:
- 连接生命周期:CONNECTING→OPEN→CLOSING→CLOSED;onerror 无细节且总跟随 onclose,恢复逻辑只放 onclose。
- 重连:指数退避加抖动,并对延迟和尝试次数设上限;抖动用于分散同时掉线的客户端。
- 心跳:定时发送 ping,设置更短的超时,收到 pong 则取消;超时即视为连接已死。
- 队列:发送前检查 readyState,非 OPEN 时入有界队列,重连后冲刷。
- 类型化消息:每条消息带 type 字段,用可辨识联合建模,default 分支用 never 做穷尽检查。
- 二进制:设置 binaryType = "arraybuffer" 以便同步读取;默认 Blob 会强制异步读取。
- 认证:API 不支持自定义请求头,令牌应放在首帧而非 URL。
- 房间:协议本身无房间概念,需自行用消息约定加本地成员状态实现。
- 共享连接:由 provider 持有 socket,按消息类型通过 subscribe(type, handler) 分发并返回各自的取消订阅。
- bfcache:pagehide 时关闭、pageshow 且 event.persisted 时重连,避免打开连接使页面失去前进后退缓存资格。
使用方式:按场景选择路径——单组件持有连接用 Hook;多组件共享用 provider;状态超过两三种时改用 reducer 状态机。示例代码见 examples/core.md、state-machine.md、binary.md、presence.md,关闭码表与反模式见 reference.md。
限制:HTTPS 页面必须用 wss://;send() 在非 OPEN 状态会抛错或丢消息;bufferedAmount 是唯一的背压信号;WebSocketStream 仅 Chromium 支持;服务端连接注册、广播、消息存储渲染及令牌签发刷新不在本技能范围内。