You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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握手,但需要自己解析协议头、生成响应,步骤比较繁琐:

  1. 校验请求的Upgrade和Connection头是否符合WebSocket规范
  2. 计算并返回Sec-WebSocket-Accept响应头,完成握手
  3. 切换到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:57:15