Gorilla WebSocket:Go 语言的 WebSocket 标准实现

gorilla/websocket 在 GitHub 上有 24.7K Star。

这是 Go 语言里用得最多的 WebSocket 库,实现了 RFC 6455 协议。API 稳定,测试完备,通过了 Autobahn Test Suite 的全部服务端测试。

1、 为什么需要这个库

WebSocket 是做实时通信绕不开的协议。聊天、消息推送、协同编辑、在线游戏,凡是需要服务端主动往客户端推数据的场景,都得用它。

Go 标准库没有内置 WebSocket 支持。自己从零实现协议,要处理握手、帧解析、Ping/Pong 心跳、关闭握手、分片消息这些细节,每一项都有坑。

gorilla/websocket 把这些全封装好了。调用方只需要关心业务逻辑:连上之后读消息、写消息,其他的它来处理。

正文顶部截图

2、 它能做什么

基础能力:客户端和服务端都支持,可以升级 HTTP 连接为 WebSocket 连接,支持文本和二进制消息。

协议层面:完整支持 RFC 6455,包括扩展压缩(permessage-deflate)、自定义子协议、Ping/Pong 帧控制。

并发安全:写操作有内置的互斥锁保护,多个 goroutine 可以同时读写同一个连接。

压缩支持:可选启用 permessage-deflate 扩展,减少传输数据量。

README区域截图

3、 怎么用

安装就一行:

go get <module-path>

服务端升级 HTTP 连接:

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 {
        return
    }
    defer conn.Close()
    for {
        messageType, msg, err := conn.ReadMessage()
        if err != nil {
            break
        }
        conn.WriteMessage(messageType, msg)
    }
}

客户端连接:

conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
if err != nil {
    log.Fatal(err)
}
defer conn.Close()

项目里带了四个完整示例:聊天室、命令行交互、Echo 回显、文件监听推送。直接 clone 下来跑一遍,比看文档快。

4、 适合什么场景

需要实时通信的后端服务:在线客服、通知系统、多人协作编辑器。

数据实时推送:监控面板、行情报价、日志流。

游戏服务端:状态同步、房间管理。

这个库只做 WebSocket 协议这一件事,不绑框架,不挑 HTTP 路由库。标准库的 net/http 能用,gin、echo 这些也能用。项目结构干净,依赖少,出问题好排查。

ocket 协议这一件事,不绑框架,不挑 HTTP 路由库。标准库的 net/http 能用,gin、echo 这些也能用。项目结构干净,依赖少,出问题好排查。

更多推荐