使用Golang结合gorilla/websocket库可实现高效WebSocket服务,支持全双工通信,适用于实时聊天、通知等场景。1. 安装库:go get github.com/gorilla/websocket;2. 创建升级器Upgrader并处理HTTP升级;3. 实现消息读写循环,服务端回显客户端消息;4. 浏览器通过JavaScript创建WebSocket连接测试通信;5. 构建广播机制,使用clients映射维护连接池,broadcast通道分发消息;6. 启动独立goroutine处理广播,实现多人聊天室模型。该方案依托Go并发优势,具备高并发支持能力,适合生产环境实时通信需求。

使用Golang结合
gorilla/websocket
在项目中引入
gorilla/websocket
该库是Go语言中最流行的WebSocket实现之一,API简洁且稳定。
创建一个简单的WebSocket处理器,用于升级HTTP连接并处理消息收发:
立即学习“go语言免费学习笔记(深入)”;
package main
import ( "log" "net/http" "github.com/gorilla/websocket" )
var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许跨域连接,生产环境应限制来源 }, }
func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("升级WebSocket失败:", err) return } defer conn.Close()
for {
// 读取客户端消息
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Print("读取消息失败:", err)
break
}
// 打印收到的消息
log.Printf("收到: %s", message)
// 回显消息给客户端
if err := conn.WriteMessage(messageType, message); err != nil {
log.Print("发送消息失败:", err)
break
}
}}
func main() { http.HandleFunc("/ws", wsHandler) log.Println("服务器启动在 :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
上面代码中,
upgrader.Upgrade()
使用浏览器JavaScript快速测试连接:
const ws = new WebSocket("ws://localhost:8080/ws");
ws.onopen = () => { console.log("连接已建立"); ws.send("你好,服务端!"); };
ws.onmessage = (event) => { console.log("收到消息:", event.data); };
ws.onclose = () => { console.log("连接已关闭"); };
打开浏览器控制台运行以上代码,可以看到与Go服务端的双向通信正常工作。
真实场景中通常需要将消息广播给多个连接。可以通过维护连接池实现:
var clients = make(map[*websocket.Conn]bool) var broadcast = make(chan []byte)
func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("升级失败:", err) return } defer conn.Close()
// 添加客户端到广播池
clients[conn] = true
// 读取消息的goroutine
go func() {
for {
_, message, err := conn.ReadMessage()
if err != nil {
delete(clients, conn)
break
}
broadcast <- message
}
}()
// 阻塞在此,防止函数退出
select {}}
// 广播消息处理 func startBroadcast() { for { msg := <-broadcast for client := range clients { err := client.WriteMessage(websocket.TextMessage, msg) if err != nil { client.Close() delete(clients, client) } } } }
func main() { go startBroadcast() http.HandleFunc("/ws", wsHandler) log.Println("服务启动在 :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
每个新连接加入
clients
broadcast
基本上就这些。通过
gorilla/websocket
以上就是Golang实现WebSocket服务 通过gorilla/websocket建立全双工通信的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号