用Golang实现WebSocket服务核心是gorilla/websocket库,需处理HTTP升级、跨域校验、并发连接池管理、读写超时及心跳机制,并配合前端原生WebSocket API完成实时通信。
用 Golang 实现 WebS
ocket 服务并不复杂,核心是使用 gorilla/websocket 这个成熟、轻量且广泛使用的第三方库。它比标准库更友好,封装了握手、消息读写、连接管理等细节。
先通过 go mod 引入库:
go get github.com/gorilla/websocket
服务端需处理 HTTP 升级请求(Upgrade),将普通 HTTP 连接转为 WebSocket 连接。关键在于设置合适的 Upgrader,并在 handler 中调用 Upgrader.Upgrade()。
常见注意点:
CheckOrigin 函数允许跨域(开发时可临时返回 true,生产环境应校验 Origin)w.WriteHeader() 或 w.Write()),否则会 panic连接建立后,通常需要持续读取消息(conn.ReadMessage())并响应。若要实现群聊或实时通知,需维护一个连接池(如 map[*websocket.Conn]bool)。
简单广播示例逻辑:
sync.RWMutex 保护连接池的并发读写defer + delete())conn.WriteMessage() 推送(注意检查 WriteDeadline 和写错误)WebSocket 连接容易因网络波动中断,服务端需主动处理异常和超时:
SetReadDeadline() 和 SetWriteDeadline() 防止 goroutine 泄漏websocket.CloseMessage 或 io.EOF 等错误,及时清理连接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)。
基本上就这些。不复杂但容易忽略超时和并发安全,把连接管理理清楚,实时通信就很稳。