在Golang中处理WebSocket连接,最常用也最成熟的方案是借助gorilla/websocket库。它封装了协议握手、数据帧读写以及连接生命周期管理,让开发者可以专注于业务消息的处理。下面以一个简单的echo服务和广播场景为例,说明如何用它管理实时通信。

安装与基础准备
首先通过go get获取依赖:
go get github.com/gorilla/websocket
在服务端我们需要一个upgrader来完成HTTP到WebSocket的协议升级,同时设置允许的跨域来源。
建立WebSocket连接
下面代码展示了如何将普通HTTP请求升级为WebSocket连接,并读取客户端发来的消息再原样返回:
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func echoHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("升级失败:", err)
return
}
defer conn.Close()
for {
// 读取消息
mt, message, err := conn.ReadMessage()
if err != nil {
log.Println("读取失败:", err)
break
}
// 写回消息
if err := conn.WriteMessage(mt, message); err != nil {
log.Println("写回失败:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", echoHandler)
log.Println("服务启动在 :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
管理多个连接的广播
实时通信常常需要把一条消息发给所有在线客户端。我们可以用一个带锁的map保存连接,并用goroutine安全广播:
package main
import (
"log"
"net/http"
"sync"
"github.com/gorilla/websocket"
)
var (
clients = make(map[*websocket.Conn]bool)
clientsMu sync.Mutex
upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}
)
func broadcast(msg []byte) {
clientsMu.Lock()
defer clientsMu.Unlock()
for conn := range clients {
if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
conn.Close()
delete(clients, conn)
}
}
}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
clientsMu.Lock()
clients[conn] = true
clientsMu.Unlock()
defer func() {
clientsMu.Lock()
delete(clients, conn)
clientsMu.Unlock()
conn.Close()
}()
for {
_, message, err := conn.ReadMessage()
if err != nil {
break
}
broadcast(message)
}
}
func main() {
http.HandleFunc("/ws", wsHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
注意事项
- 读取和写入应在不同goroutine中进行,避免互相阻塞。
- 使用
defer conn.Close()确保连接释放,防止资源泄漏。 - 对共享的连接集合加锁,避免并发写panic。
- 客户端异常断开时,ReadMessage会返回错误,此时应清理对应连接。
通过以上方式,使用Golang配合gorilla/websocket即可稳定地处理WebSocket连接并管理实时通信逻辑。
GolangWebSocketgorilla_websocket修改时间:2026-07-27 05:15:18