WebSocket私聊需服务端路由实现:连接时立即绑定用户身份,消息带to字段标识接收人,服务端查表单播,前端按to字段隔离显示。

WebSocket 本身不提供点对点能力,所谓“私聊”是靠服务端控制消息路由实现的:客户端发消息时标明接收人,服务端查在线用户表,只把消息推给目标用户的 socket 连接。
用户身份必须在连接建立后立即绑定
客户端一连上 WebSocket,就得立刻告诉服务端“我是谁”。不能等发消息时才传 userId,否则服务端无法建立映射关系。常见做法有:
- 通过 URL 参数传递,比如
ws://example.com/chat?userId=1001 - 连接成功后,前端主动发送登录凭证(如 JWT 或纯 userId),服务端验证后存入内存 Map,例如
onlineUsers.set("1001", socket) - 监听
close和error事件,及时从 Map 中清理失效连接
消息体必须带明确的接收方标识
前端不能只发一段文字,得用结构化格式说明“发给谁”。推荐统一使用 JSON,并包含必要字段:
-
type:标记消息类型,如
"private"(区别于群聊或系统通知) - to:目标用户 ID,服务端靠它查表投递(必填)
- content:实际消息内容
- from 可由服务端自动补全,避免前端伪造
示例:{"type":"private","to":"2005","content":"在忙吗?"}
立即学习“Java免费学习笔记(深入)”;
服务端负责精准单播,不是广播后过滤
收到私聊消息后,服务端要做三件事:
- 解析 JSON,取出
to字段 - 查
onlineUsers.get(to)获取对应 socket 实例 - 确认该 socket 状态正常(
readyState === 1),再调用socket.send()推送;若不在线,可存离线消息库,待上线再补发
前端收消息要按接收人做判断和隔离
服务端可能把不同人的私聊都推到同一个 WebSocket 连接上,前端需自行识别哪些是发给自己的:
- 收到消息后检查
data.to === currentUserId,只有匹配才展示 - 聊天界面需按会话隔离,比如点击“张三”进入专属窗口,后续只显示与张三的往来记录
- 每条消息显示对方昵称和时间,避免混淆
别在前端用 URL 路径或订阅 topic 模拟点对点——那本质仍是服务端广播、前端自己过滤,既不安全也不可靠。


















