
本文详解如何使用 go 语言基于 gorilla/websocket 构建一个支持单对单私聊(而非仅群聊)的 websocket 实时聊天服务,涵盖连接管理、用户标识、消息路由与客户端交互等核心实现。
要实现“向指定用户发送消息”而非广播给所有人,关键在于为每个 WebSocket 连接绑定唯一用户身份,并建立可寻址的用户连接映射表——这正是私聊功能的基础。官方推荐的 Gary Burd 的 WebSocket Chat 示例 提供了极佳的起点,但其原始版本默认实现的是全局广播(即所有在线用户接收同一条消息)。我们需要在此基础上扩展用户注册、会话寻址与定向投递逻辑。
✅ 核心改造步骤
用户登录与唯一标识
客户端首次连接时,需通过初始 JSON 消息提交用户名(如 {"type":"login","username":"alice"}),服务端解析后将该 *Client 实例存入 map[string]*Client(以用户名为 key)。-
消息结构升级
定义结构化消息类型,支持 broadcast(群发)、private(私聊)等模式:type Message struct { Type string `json:"type"` // "private", "broadcast", "system" From string `json:"from"` // 发送者用户名 To string `json:"to"` // 接收者用户名(私聊时必填) Content string `json:"content"` Timestamp int64 `json:"timestamp"` } -
定向消息分发逻辑
在 hub.broadcast 基础上新增 hub.sendToUser(to string, msg []byte) 方法:func (h *Hub) sendToUser(username string, message []byte) { if client, ok := h.clients[username]; ok { select { case client.send <- message: default: close(client.send) delete(h.clients, client.username) } } } -
客户端示例(JavaScript)发送私聊
云模块网站管理系统3.1.03下载云模块_YunMOK网站管理系统采用PHP+MYSQL为编程语言,搭载自主研发的模块化引擎驱动技术,实现可视化拖拽无技术创建并管理网站!如你所想,无限可能,支持创建任何网站:企业、商城、O2O、门户、论坛、人才等一块儿搞定!永久免费授权,包括商业用途; 默认内置三套免费模板。PC网站+手机网站+适配微信+文章管理+产品管理+SEO优化+组件扩展+NEW Login界面.....目测已经遥遥领先..
const ws = new WebSocket("ws://localhost:8080/ws"); ws.onopen = () => { ws.send(JSON.stringify({type: "login", username: "bob"})); }; // 向 alice 发送私聊 ws.send(JSON.stringify({ type: "private", to: "alice", content: "Hello! This is a private message." }));
⚠️ 注意事项
- 用户名唯一性校验:需在登录阶段检查重复,避免覆盖已有连接;
- 连接异常处理:defer hub.unregister
- 并发安全:map[string]*Client 读写需加 sync.RWMutex(原示例未包含,必须补充);
- 生产环境建议:引入 JWT 鉴权、消息持久化(如 Redis 存储离线消息)、心跳保活(websocket.SetPingHandler)。
通过以上设计,你将拥有一个轻量、可扩展、真正支持点对点通信的 Go WebSocket 聊天服务——它不止于演示,更具备落地私聊场景的完整能力。









