WebSocket无内置房间概念,需服务端用Map按房间名管理连接集合,客户端通过URL参数或JSON消息加入/离开房间,消息按room字段精准广播且过滤非本房间消息。

WebSocket 本身不内置“房间”概念,实现房间聊天的关键在于服务端对连接的分组管理 + 客户端按房间订阅/发送。核心思路是:客户端连接后加入指定房间,服务端只将消息广播给该房间内的所有连接(不包括自己或按需处理),同时避免跨房间泄露。
服务端按房间维护连接集合
用 Map 或对象存储每个房间名对应的 WebSocket 连接数组(或 Set):
- 用户连接时,通过 URL 参数(如
?room=js101)或首次发送的 JSON 消息(如{"type":"join","room":"js101"})告知要加入的房间 - 服务端解析后,把该 socket 添加到对应房间的连接池中(注意去重、清理断开连接)
- 用户离开时(close 事件或主动发 leave),从对应房间中移除该 socket
消息发送时限定广播范围
客户端发送消息时,需携带目标房间标识(通常隐含在当前上下文,或显式带上 room 字段):
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
- 服务端收到消息后,解析 room 字段,只遍历该房间的连接列表
- 遍历中跳过发送者自身(可选),调用
socket.send()推送消息 - 示例结构:
{"room":"js101","from":"Alice","content":"Hello!"},服务端提取 room 后精准投递
客户端按房间组织收发逻辑
前端不直接操作原始 WebSocket,而是封装一个“房间会话”对象:
立即学习“Java免费学习笔记(深入)”;
- 建立连接后,立即发送 join 指令并监听服务端确认
- 提供
sendMessage(content)方法,自动补全当前房间、用户名等字段再发送 - 监听 onmessage,根据消息中的 room 字段过滤,只渲染本房间消息(防止多房间混播)
- 切换房间时,先发 leave 再 join 新房间,并清空本地消息列表
注意连接生命周期与状态同步
真实场景中需处理异常情况,否则房间状态易错乱:
- WebSocket 断线重连后,必须重新 join 房间(不能假设服务端还记得)
- 服务端定期 ping/pong 检测连接有效性,及时从房间中剔除失效 socket
- 用户昵称、在线状态等信息建议由服务端统一维护并广播(如 user-joined / user-left 事件)

















