WebSocket本身不原生支持多路复用,但可通过应用层协议在单连接上模拟多个逻辑通道:为每条消息添加channelId、type、payload等字段封装,客户端和服务端据此解析并分发至对应通道。

WebSocket 本身是单个 TCP 连接上的全双工通信通道,不原生支持多路复用(multiplexing)。但可以通过应用层协议设计,在同一个 WebSocket 连接上模拟多个逻辑通道——即“多路复用传输多个逻辑通道”。核心思路是:**给每条消息添加标识(如 channel ID 或 type 字段),由收发双方按约定解析、分发到对应逻辑通道**。
定义通道标识与消息封装格式
在发送前,把业务数据包装成带元信息的结构体。推荐使用轻量、可扩展的 JSON 格式:
- channelId:唯一字符串或数字,标识该消息所属逻辑通道(例如 "chat-123", "notify", "heartbeat")
- type:操作类型(如 "message", "open", "close", "error"),便于状态管理
- payload:实际业务数据(可以是字符串、对象、二进制 ArrayBuffer 的 base64 编码等)
- 可选 seq 或 id:用于请求响应匹配或去重
示例:
{
"channelId": "user-status",
"type": "update",
"payload": { "online": true, "lastSeen": 1718234567 }
}
客户端实现逻辑通道管理
维护一个 Map 存储各 channel 的回调处理器,并封装发送/接收逻辑:
立即学习“Java免费学习笔记(深入)”;
- 创建
ChannelManager类,内部用Map<string set>></string>管理 channelId → handler 映射 -
register(channelId, handler)订阅指定通道的消息 -
send(channelId, payload, type = "data")自动打包并调用ws.send() - 在
ws.onmessage中解析消息,根据channelId分发给对应 handler 集合
注意:避免直接暴露原始 ws.onmessage,统一走 ChannelManager 分发,确保通道隔离。
服务端配合做通道路由(以 Node.js + ws 为例)
服务端同样需要解析消息中的 channelId,并按需转发或处理:
- 收到消息后先 JSON.parse,校验
channelId和type - 对不同
channelId做不同处理:比如 "rpc" 通道走方法调用,"stream" 通道做数据帧拼接,"control" 通道处理心跳或权限 - 支持广播到某 channel 的所有客户端(如聊天室),或点对点定向推送(如私信)
- 可结合 session 或 userId 做通道权限控制(例如用户只能访问自己的 "order-456" 通道)
进阶:支持二进制流与优先级(可选)
若需传输大量二进制数据(如音视频帧),可在消息中增加 binary: true 字段,约定 payload 为 base64 字符串或直接使用 ArrayBuffer 发送(需设置 ws.binaryType = "arraybuffer");对于高优先级通道(如控制指令),可加 priority: "high" 字段,客户端侧用不同队列或立即处理机制保障时效性。


















