跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Golang如何实现WebSocket通信

Go语言通过gorilla/websocket库实现WebSocket通信,1. 服务端监听/ws路径并升级HTTP连接;2. 客户端使用ws协议连接服务器;3. 双方通过ReadMessage和WriteMessage收发数据,支持跨域与消息回显。 Go语言实现WebSocket通信主要依赖第三方库,最常用的是
gorilla/websocket
。它提供了对WebSocket协议的完整支持,使用简单且性能良好。下面介绍如何用Golang搭建一个基础的WebSocket服务端和客户端。 安装gorilla/ websocket 库 在项目目录下执行:
go get github.com/gorilla/websocket
编写WebSocket服务端 服务端负责监听HTTP请求,将连接升级为WebSocket,并处理消息收发。 示例代码: Git 程序猿必备版本控制工具 下载 立即学习 “ go语言免费学习笔记(深入) ”;
package main import ( "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)) }
编写WebSocket客户端 客户端通过
ws
或
wss
连接到服务端,发送和接收数据。 示例代码: 立即学习 “ go语言免费学习笔记(深入) ”;
package main import ( "log" "net/url" "os" "os/signal" "github.com/gorilla/websocket" ) func main() { u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"} log.Printf("连接到 %s", u.String()) conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { log.Fatal("连接失败:", err) } defer conn.Close() done := make(chan struct{}) // 读取协程 go func() { defer close(done) for { _, message, err := conn.ReadMessage() if err != nil { log.Println("读取错误:", err) return } log.Printf("收到: %s", message) } }() // 发送消息 ticker := time.NewTicker(time.Second) defer ticker.Stop() sig := make(chan os.Signal, 1) signal.Notify(sig, os.Interrupt) for { select { case <-ticker.C: err := conn.WriteMessage(websocket.TextMessage, []byte("你好,WebSocket!")) if err != nil { log.Println("发送失败:", err) } case <-sig: log.Println("关闭连接...") return case <-done: return } } }
关键点说明 Upgrader.CheckOrigin :默认拒绝 跨域 请求,开发时可设为返回true,生产环境应做域名校验。 conn.ReadMessage() :返回消息类型(文本或二进制)和内容。 conn.WriteMessage() :发送消息到客户端,类型需匹配。 并发安全 :每个连接建议使用独立的goroutine处理读写,避免阻塞。 连接管理 :实际项目中可用map或channel池维护活跃连接,实现广播或多用户通信。 基本上就这些。使用
gorilla/websocket
能快速实现稳定可靠的WebSocket通信,适合聊天、实时通知等场景。

相关文章