WebSocketUtil
带自动重连、心跳、AES-ECB 解密的 WebSocket 封装类。构造即连接,断线自动重连,服务端加密消息透明解密后分发给所有订阅者。
工作原理
- 构造即
connect():新建 WebSocket,绑定 open / close / error / message。 - 心跳:连接建立后每 5 秒发送
'ping'字符串,服务端返回的'pong'(Blob)被识别为心跳响应丢弃。 - 消息解密:非心跳的 Blob 消息按 hex 密文走
decryptHex(data, options.key)解密为 JSON 字符串再分发;普通 text 消息直接透传。 - 断线重连:close / error 触发重连,延迟
reconnectInterval(默认 3 秒)后重新 connect;显式close()后不再重连。 - 多订阅者:listeners 为自建数组,add / remove 对称 API。
API
new WebSocketUtil(options: WebSocketOptions)
interface WebSocketOptions {
url: string // wss:// 地址
key: string // AES-ECB 解密密钥(hex 格式)
reconnectInterval?: number // 重连间隔 ms,默认 3000
}
| 实例方法 | 说明 |
|---|---|
send(data) | 向服务端发送字符串 / Buffer / Blob;未连接时 console.warn 并丢弃 |
close() | 主动关闭(清掉重连定时器与心跳,不再自动重连) |
isConnected() | readyState === OPEN |
addOnMessageListener(fn) / removeOnMessageListener(fn) | 订阅 / 退订消息(fn(data: string),已解密) |
addOnOpenListener(fn) / removeOnOpenListener(fn) | 订阅 / 退订连接建立 |
addOnCloseListener(fn) / removeOnCloseListener(fn) | 订阅 / 退订连接关闭 |
addOnErrorListener(fn) / removeOnErrorListener(fn) | 订阅 / 退订连接错误 |
使用示例
// 建立连接并订阅消息
const ws = new WebSocketUtil({ url: 'wss://api.example.com/ws', key: wsHexKey })
ws.addOnMessageListener((data) => console.log('recv:', data))
// 登录后发送鉴权帧
ws.addOnOpenListener(() => ws.send(JSON.stringify({ type: 'auth', token })))
// 组件卸载时释放(退订 + 关闭,避免泄漏与幽灵重连)
onBeforeUnmount(() => {
ws.removeOnMessageListener(handler)
ws.close()
})
注意事项
- 仅客户端可用:
connect使用全局window/WebSocket,请在onMounted或 client-only 上下文实例化,SSR 阶段不要触发构造。 key为 hex 字符串,与 aes 的decryptHex约定一致。- 心跳间隔 5s、重连间隔默认 3s;如需调整心跳请扩展本类,不要魔改私有字段。
- 组件级使用务必在卸载时
close()—— 否则实例会在后台无限重连。