
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时数据传输场景,比如聊天应用、实时通知等。Golang 通过第三方库 gorilla/websocket 提供了对 WebSocket 的良好支持。下面介绍如何使用 Golang 实现 WebSocket 通信。
1. 安装 gorilla/websocket 库
在项目中引入 gorilla/websocket:
go get github.com/gorilla/websocket
这是目前最常用的 Go WebSocket 实现库,功能稳定且文档完善。
2. 创建 WebSocket 服务端
以下是一个简单的 WebSocket 服务端示例,监听客户端连接并回显收到的消息:
立即学习“go语言免费学习笔记(深入)”;
package mainimport ( "log" "net/http" "github.com/gorilla/websocket" )
var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许跨域连接 }, }
func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("升级失败:", err) return } defer conn.Close()
for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("读取消息失败:", err) break } log.Printf("收到消息: %s", message) // 回显消息给客户端 if err := conn.WriteMessage(messageType, message); err != nil { log.Println("发送消息失败:", err) break } }}
func main() { http.HandleFunc("/ws", handleWebSocket) log.Println("服务器启动在 :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
说明:
- upgrader 用于将 HTTP 连接升级为 WebSocket 连接。
- CheckOrigin 设为 true 是为了允许前端跨域连接,生产环境应根据需要限制来源。
- conn.ReadMessage() 阻塞等待客户端消息。
- WriteMessage 将消息原样返回。
3. 编写客户端测试(可用浏览器或命令行)
你可以使用 JavaScript 在浏览器中测试:
也可以使用命令行工具如 wscat 测试:
wscat -c ws://localhost:8080/ws
4. 实现广播机制(多人聊天示例)
如果想让一个消息发送给所有连接的客户端,可以维护一个客户端集合:
var clients = make(map[*websocket.Conn]bool) var broadcast = make(chan []byte)func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } defer conn.Close()
clients[conn] = true for { _, message, err := conn.ReadMessage() if err != nil { delete(clients, conn) break } broadcast <- message }}
// 广播协程 func broadcastMessages() { for { msg :=
在 main 函数中启动广播协程:
go broadcastMessages()这样任意客户端发送的消息都会被转发给所有在线用户。
基本上就这些。使用 gorilla/websocket 能快速搭建可靠的 WebSocket 服务,结合 Go 的并发优势,适合构建高并发实时应用。










