用Golang实现WebSocket服务核心是gorilla/websocket库,需处理HTTP升级、跨域校验、并发连接池管理、读写超时及心跳机制,并配合前端原生WebSocket API完成实时通信。

用 Golang 实现 WebSocket 服务并不复杂,核心是使用 gorilla/websocket 这个成熟、轻量且广泛使用的第三方库。它比标准库更友好,封装了握手、消息读写、连接管理等细节。
安装依赖并初始化 WebSocket 连接
先通过 go mod 引入库:
go get github.com/gorilla/websocket
服务端需处理 HTTP 升级请求(Upgrade),将普通 HTTP 连接转为 WebSocket 连接。关键在于设置合适的 Upgrader,并在 handler 中调用 Upgrader.Upgrade()。
立即学习“go语言免费学习笔记(深入)”;
常见注意点:
- 设置
CheckOrigin函数允许跨域(开发时可临时返回true,生产环境应校验 Origin) - 避免在 Upgrade 前写入任何 HTTP 响应(如
w.WriteHeader()或w.Write()),否则会 panic - 每个连接建议启动独立 goroutine 处理读/写,防止阻塞
处理客户端消息与广播逻辑
连接建立后,通常需要持续读取消息(conn.ReadMessage())并响应。若要实现群聊或实时通知,需维护一个连接池(如 map[*websocket.Conn]bool)。
简单广播示例逻辑:
- 用
sync.RWMutex保护连接池的并发读写 - 新连接加入时存入 map;断开时主动删除(可用
defer+delete()) - 收到消息后遍历所有活跃连接,调用
conn.WriteMessage()推送(注意检查WriteDeadline和写错误)
保持连接稳定与优雅关闭
WebSocket 连接容易因网络波动中断,服务端需主动处理异常和超时:
- 设置
SetReadDeadline()和SetWriteDeadline()防止 goroutine 泄漏 - 捕获
websocket.CloseMessage或io.EOF等错误,及时清理连接 - 支持 ping/pong 心跳(Upgrader 默认启用,也可自定义
SetPingHandler) - 客户端关闭前建议发送
websocket.CloseMessage,服务端收到后调用conn.Close()
前端简单对接示例
浏览器原生支持 WebSocket,只需几行 JS 即可连接:
const ws = new WebSocket("ws://localhost:8080/ws");
ws.onmessage = (e) => console.log("收到:", e.data);
ws.onopen = () => ws.send("你好服务端");
确保 URL 协议为 ws://(HTTP)或 wss://(HTTPS),路径需和服务端路由一致(如 /ws)。
基本上就这些。不复杂但容易忽略超时和并发安全,把连接管理理清楚,实时通信就很稳。










