Golang中的Websocket框架对比与选择

Golang中的Websocket框架对比与选择 是否有仅使用 WebSocket 而非传统 Web 框架的框架?

3 回复

谢谢迪恩,这真的很有帮助!

更多关于Golang中的Websocket框架对比与选择的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


也许你想要这个:

GitHub

GitHub - gorilla/websocket: 一个快速、经过充分测试且广泛使用的 WebSocket…

一个快速、经过充分测试且广泛使用的 Go WebSocket 实现。- GitHub - gorilla/websocket: 一个快速、经过充分测试且广泛使用的 Go WebSocket 实现。

我之前使用 gorilla/websocket 做了一个概念验证,可能也有用:

GitHub

GitHub - DeanPDX/go-websocket-job-runner: 一个 WebSocket 任务运行器概念…

一个 WebSocket 任务运行器概念应用程序。通过在 GitHub 上创建帐户来为 DeanPDX/go-websocket-job-runner 的开发做出贡献。

在Go语言中,确实存在专注于WebSocket通信的轻量级框架,它们不依赖传统Web框架(如Gin、Echo等),而是直接基于标准库net/httpgorilla/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设计及控制粒度。

回到顶部