Golang中的Websocket框架对比与选择
Golang中的Websocket框架对比与选择 是否有仅使用 WebSocket 而非传统 Web 框架的框架?
也许你想要这个:
GitHub - gorilla/websocket: 一个快速、经过充分测试且广泛使用的 WebSocket…
一个快速、经过充分测试且广泛使用的 Go WebSocket 实现。- GitHub - gorilla/websocket: 一个快速、经过充分测试且广泛使用的 Go WebSocket 实现。
我之前使用 gorilla/websocket 做了一个概念验证,可能也有用:
GitHub - DeanPDX/go-websocket-job-runner: 一个 WebSocket 任务运行器概念…
一个 WebSocket 任务运行器概念应用程序。通过在 GitHub 上创建帐户来为 DeanPDX/go-websocket-job-runner 的开发做出贡献。
在Go语言中,确实存在专注于WebSocket通信的轻量级框架,它们不依赖传统Web框架(如Gin、Echo等),而是直接基于标准库net/http和gorilla/websocket等包构建。以下是一些常见选择及其示例代码:
1. gorilla/websocket
这是最流行的WebSocket库,它提供了完整的WebSocket协议实现,可以独立使用或集成到其他框架中。它不包含路由、中间件等Web框架功能,纯粹处理WebSocket连接。
示例代码:
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.Println("Upgrade failed:", err)
return
}
defer conn.Close()
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
log.Println("Read failed:", err)
break
}
log.Printf("Received: %s", p)
if err := conn.WriteMessage(messageType, p); err != nil {
log.Println("Write failed:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", wsHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
2. nhooyr.io/websocket
一个高性能、符合RFC 6455标准的WebSocket库,API设计简洁,支持上下文(context)和并发安全。
示例代码:
package main
import (
"context"
"log"
"net/http"
"nhooyr.io/websocket"
"nhooyr.io/websocket/wsjson"
)
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := websocket.Accept(w, r, &websocket.AcceptOptions{
InsecureSkipVerify: true,
})
if err != nil {
log.Println("Accept failed:", err)
return
}
defer conn.Close(websocket.StatusInternalError, "Connection closed")
ctx := context.Background()
for {
var v interface{}
err := wsjson.Read(ctx, conn, &v)
if err != nil {
log.Println("Read failed:", err)
break
}
log.Printf("Received: %v", v)
if err := wsjson.Write(ctx, conn, v); err != nil {
log.Println("Write failed:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", wsHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
3. gobwas/ws
底层WebSocket库,提供高度可控的API,适合需要精细控制帧处理的场景。
示例代码:
package main
import (
"log"
"net/http"
"github.com/gobwas/ws"
"github.com/gobwas/ws/wsutil"
)
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, _, _, err := ws.UpgradeHTTP(r, w)
if err != nil {
log.Println("Upgrade failed:", err)
return
}
defer conn.Close()
for {
msg, op, err := wsutil.ReadClientData(conn)
if err != nil {
log.Println("Read failed:", err)
break
}
log.Printf("Received: %s (op: %v)", msg, op)
if err := wsutil.WriteServerMessage(conn, op, msg); err != nil {
log.Println("Write failed:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", wsHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
总结
- gorilla/websocket:生态成熟,文档丰富,适合大多数场景。
- nhooyr.io/websocket:性能优异,API现代化,支持上下文。
- gobwas/ws:底层控制能力强,适合高级用例。
这些库均不依赖传统Web框架,可直接通过net/http处理WebSocket连接。选择时需根据具体需求考虑性能、API设计及控制粒度。

