核心是服务端按标签分组管理websocket连接:客户端连接后主动上报标签,服务端用map存储映射,支持多标签归属、定向广播与动态更新,断开时清理,重连需重新init。

核心在于服务端按标签分组管理连接,客户端建立连接后主动上报标签,服务端据此路由消息——不是前端“分群”,而是后端基于标签做连接池隔离与定向广播。
服务端需维护标签-连接映射关系
WebSocket 服务端(如 Node.js 的 ws 库或 Java 的 Spring WebSocket)不能只用一个全局 clients 集合。要构建类似 Map<string set>></string> 的结构:
- 用户首次连接成功后,立即发送初始化消息,携带自身标签数组,例如:
{"type":"init","tags":["vip","shanghai","ios"]} - 服务端解析并把该连接实例加入对应每个标签的 Set 中,支持一个连接归属多个标签
- 推送消息时,根据目标标签(如 "vip")取出所有关联连接,逐个
send(),不广播给全量用户 - 连接断开时,从所有所属标签的 Set 中清理该连接,避免内存泄漏
客户端连接后主动声明标签
网页端不能等服务端来“识别”身份,必须在握手完成、readyState 变为 OPEN 后立刻发送标签声明:
- 使用
localStorage或登录态 token 解析出当前用户标签(如从 JWT payload 读取user_tags字段) - 封装一个
sendTags(tags)方法,在ws.onopen回调中调用,确保只发一次 - 若标签后续变更(如用户升级为 VIP),可再发一次更新指令,服务端动态调整归属关系
消息格式需明确类型与作用域
前后端约定统一 JSON 消息协议,避免歧义:
- 客户端上行:区分
init、update_tags、ping等 type,带时间戳和唯一 msgId 方便排错 - 服务端下行:消息体包含
scope: "tag"+targets: ["vip","premium"],前端收到后可选择是否处理(比如非 VIP 标签用户忽略含"vip_only":true的消息) - 不依赖浏览器 Cookie 或 Referer 做权限判断,所有鉴权逻辑和服务端标签路由必须在 WebSocket 层完成
注意连接复用与状态同步
单页应用中用户可能切换账号或标签,但复用同一 WebSocket 实例:
- 不要直接关闭重连,优先发送
{"type":"rebind","new_tags":[...]}让服务端原子性替换其标签集 - 服务端响应
{"type":"bound","confirmed_tags":[...]}后,前端才认为切换完成 - 网络中断重连后,必须重新 init,不能假设上次标签仍有效
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











