WebSocket需应用层实现消息路由:①消息带type及上下文字段并校验;②用Map注册类型处理器解耦逻辑;③多路复用靠streamId隔离,广播用Promise.allSettled异步并发发送。

WebSocket 本身不提供多路复用或消息路由能力,这些逻辑必须由应用层实现。关键不是“WebSocket 怎么做”,而是“你如何设计服务端和客户端配合的消息分发机制”。核心落在三点:结构化消息体、类型驱动的处理器注册、连接状态精准管控。
消息必须带明确 type 和上下文字段
所有客户端发送的消息需统一为 JSON 格式,并至少包含 type 和业务标识字段:
-
type 是路由开关:如
"private"(私聊)、"group"(群聊)、"system"(系统通知)、"heartbeat"(心跳) - 私聊必须附
"targetId": "u123";群聊建议用"roomId": "r456";系统类可带"scope": "all"或"scope": "online" - 禁止传空 type、拼错 type(如
"prviate"),服务端应静默丢弃,不响应错误——避免被用于在线探测
服务端用 Map + 处理器映射解耦路由逻辑
不要在 onmessage 回调里写 if-else 链,而是提前注册处理函数:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
- 用
Map存储处理器:handlers.set("private", handlePrivateMsg)、handlers.set("group", handleGroupMsg) - 收到消息后两步完成分发:
if (handlers.has(msg.type)) { handlers.get(msg.type)(ws, msg.data) } - 每个处理器只专注一件事:私聊查
clients.get(msg.targetId)并校验readyState === OPEN;群聊则遍历房间内所有连接,跳过发送者自身
多路复用场景下靠 StreamId 或会话标签隔离逻辑流
当一条 WebSocket 连接承载多个业务通道(如聊天+文件传输+指令控制),需额外维度区分消息归属:
立即学习“Java免费学习笔记(深入)”;
- 在消息体中加入
"streamId"或"channel"字段,例如:{"type":"file_chunk","streamId":"s789","data":...} - 服务端按 streamId 维护临时缓冲区或状态机,避免不同业务消息互相干扰
- 前端每个业务模块使用独立的逻辑 ID 发送,不共用同一 send 调用点,便于后端做流级限速、中断恢复或优先级调度
广播与群聊务必异步并发,且跳过无效连接
群聊不是 for 循环同步发,否则一个卡顿连接会拖垮整个广播:
- 收集所有目标连接(如 roomId 对应的 client 列表),过滤掉
readyState !== OPEN的实例 - 构造 Promise 数组:
sendPromises = clients.map(ws => ws.send(data).catch(() => {})) - 用
Promise.allSettled(sendPromises)执行,不因单个失败中断整体流程 - 断开时必须监听
close和error事件并从 Map 中清理,否则内存泄漏不可避免


















