如何实现Golang WebSocket服务器主动向客户端推送消息
解决WebSocket握手后主动发消息的问题
嘿,我注意到你现在的代码其实只是个普通的HTTP服务,还没真正实现WebSocket的功能呢!要完成握手后主动给客户端发消息的需求,得先把HTTP连接升级成WebSocket连接才行。下面我给你两种实现方式,推荐用更成熟的第三方库,也会提一下标准库手动处理的思路。
推荐方案:使用Gorilla WebSocket库
这是Go生态里最常用的WebSocket库,封装了握手和消息处理的细节,用起来省心不少。
第一步:安装依赖
先在项目里安装这个库:
go get github.com/gorilla/websocket
第二步:完整实现代码
package main import ( "log" "net/http" "github.com/gorilla/websocket" ) // 配置WebSocket升级器,开发环境允许所有来源(生产环境记得限制哦) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 生产环境请根据业务需求校验请求Origin }, } func wsHandler(w http.ResponseWriter, r *http.Request) { // 把普通HTTP连接升级成WebSocket连接,完成握手流程 conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Printf("握手失败: %v", err) return } defer conn.Close() // 确保连接关闭时释放资源 // 握手完成后,立刻主动给客户端发消息 err = conn.WriteMessage(websocket.TextMessage, []byte("Hi, 握手完成啦!\nLet's start to talk something.")) if err != nil { log.Printf("主动发消息失败: %v", err) return } // 可选:添加处理客户端消息的逻辑 for { _, msg, err := conn.ReadMessage() if err != nil { log.Printf("读取客户端消息失败: %v", err) break } log.Printf("收到客户端消息: %s", msg) // 也可以回复客户端消息 conn.WriteMessage(websocket.TextMessage, []byte("我收到你的消息啦:"+string(msg))) } } func main() { http.HandleFunc("/ws", wsHandler) log.Printf("WebSocket服务器启动,监听443端口...") err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil) log.Fatal(err) }
关键代码解释
upgrader.Upgrade():这一步会完成WebSocket的握手流程,替换原来的普通HTTP响应conn.WriteMessage():握手成功后直接调用这个方法,就能主动给客户端发消息,完全不需要等客户端先发送请求defer conn.Close():确保连接断开时正确释放资源,避免内存泄漏- 后面的消息循环是可选的,如果不需要处理客户端消息,可以去掉,但要注意保持连接存活(或者根据需求主动关闭)
备选方案:用标准库手动处理WebSocket握手
如果你不想依赖第三方库,也可以手动实现WebSocket握手,但需要自己解析协议头、生成响应,步骤比较繁琐:
- 校验请求的
Upgrade和Connection头是否符合WebSocket规范 - 计算并返回
Sec-WebSocket-Accept响应头,完成握手 - 切换到WebSocket的帧格式来发送消息
这种方式容易出错,除非有特殊需求,否则还是推荐用Gorilla库。
测试方法
你可以用浏览器控制台快速测试:
const ws = new WebSocket('wss://你的域名/ws'); ws.onmessage = function(event) { console.log('收到服务器消息:', event.data); }; ws.send('Hello Server!');
运行代码后,打开浏览器控制台执行上面的JS,就能看到服务器主动发来的消息啦!
内容的提问来源于stack exchange,提问作者Bjergsen Zhu
相关产品推荐
相关产品推荐

