如何使用Golang创建WebSocket服务_Golang WebSocket实时通信实现

用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()

常见注意点:

  • 设置 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.CloseMessageio.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)。

基本上就这些。不复杂但容易忽略超时和并发安全,把连接管理理清楚,实时通信就很稳。