2025年Golang WebSocket技术解析与应用

2025年Golang WebSocket技术解析与应用 大家好,

这仍然是处理 WebSocket 的首选库吗?

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

现在有其他的替代方案吗?

它仍然不在标准库中,对吗?

这是我第一次需要使用它们。😅

谢谢并致以问候


更多关于2025年Golang WebSocket技术解析与应用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你可以在 GitHub - avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software 中找到许多 Go 包的链接。 同时,可以从 The WebSocket API (WebSockets) - Web APIs | MDN 获取基本信息。 希望对你有帮助。

更多关于2025年Golang WebSocket技术解析与应用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


x/net/websocket 的文档仍然推荐使用 gorilla 或 https://github.com/coder/websocket。我最近用过 gorilla,它易于使用和理解,我可能还会再次使用它。你可以查看这个仓库,里面有一个我使用 gorilla 和与之交互的客户端代码构建的小演示。

好的——不过话虽如此,这个项目看起来很有趣:

GitHub - centrifugal/centrifuge: Real-time messaging library for Go. The simplest...

GitHub - centrifugal/centrifuge: Real-time messaging library for Go. The simplest…

Real-time messaging library for Go. The simplest way to add feature-rich and scalable WebSocket support to your application. The core of Centrifugo server.

这是一个构建在 WebSocket 之上的抽象层。它有一个配套的 JS 库,并且 Grafana 正在使用它。文档看起来不错,示例也很丰富。唯一的缺点是:还没有发布 v1 版本,因此无法保证兼容性(但如果 Grafana 基于它构建,我想他们不会经常进行破坏性更改!)。

以下是一些关于这个主题的讨论,其中提供了更多选项:

https://www.reddit.com/r/golang/comments/zu80o0/gorillawebsocket_or_melody/

https://www.reddit.com/r/golang/comments/1cq61io/which_librarys_websocket_to_use/

总结一下:我认为这里没有一个明确的答案,这很遗憾。选择一个许可证适合你、文档和示例吸引你的库。

是的,gorilla/websocket 仍然是处理 WebSocket 的首选库之一。它成熟、稳定,在生产环境中被广泛使用。虽然 Go 标准库目前还没有内置 WebSocket 实现,但 gorilla/websocket 是事实上的标准选择。

目前也有一些其他的替代方案,例如:

  • nhooyr.io/websocket:一个较新的库,注重性能、内存效率和简洁的 API。
  • gobwas/ws:提供底层控制和高度优化的库,适合需要精细控制 WebSocket 帧的场景。

下面是一个使用 gorilla/websocket 的简单示例:

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func handler(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, message, err := conn.ReadMessage()
        if err != nil {
            log.Println("Read failed:", err)
            break
        }
        log.Printf("Received: %s", message)
        err = conn.WriteMessage(messageType, message)
        if err != nil {
            log.Println("Write failed:", err)
            break
        }
    }
}

func main() {
    http.HandleFunc("/ws", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

对于 nhooyr.io/websocket,示例代码如下:

package main

import (
    "log"
    "net/http"
    "nhooyr.io/websocket"
    "nhooyr.io/websocket/wsjson"
)

func handler(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, "Internal error")

    var v interface{}
    for {
        err = wsjson.Read(r.Context(), conn, &v)
        if err != nil {
            log.Println("Read failed:", err)
            break
        }
        log.Printf("Received: %v", v)
        err = wsjson.Write(r.Context(), conn, v)
        if err != nil {
            log.Println("Write failed:", err)
            break
        }
    }
}

func main() {
    http.HandleFunc("/ws", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

选择哪个库取决于具体需求。如果需要一个经过充分测试、社区支持广泛的库,gorilla/websocket 是可靠的选择。如果追求更好的性能和更现代的 API,可以考虑 nhooyr.io/websocket。对于需要底层控制的场景,gobwas/ws 提供了更多灵活性。

回到顶部