Gorilla WebSocket 库 for Go (Golang) — 完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Gorilla WebSocket 库 for Go (Golang)



Gorilla WebSocket 是 Go (Golang) 语言中最流行且最稳定的 WebSocket 协议库之一。它是 Gorilla Toolkit 生态系统的一部分,为开发者提供了一个强大、灵活且高性能的工具,用于构建实时应用程序:聊天、实时通知、在线游戏、监控面板等等。



该库完全实现了 RFC 6455 规范,支持服务器端和客户端,并自动处理消息分片、ping/pong 机制和连接控制。Gorilla WebSocket 使用纯 Go 编写,无外部依赖,因此轻量且快速。



主要功能

  • 完全支持 WebSocket 协议 (RFC 6455)。
  • 简单直观的 API。
  • 支持文本和二进制消息。
  • 自动管理 ping/pong 以保持连接。
  • 支持请求来源 (Origin) 检查。
  • 支持消息压缩 (permessage-deflate)。
  • 支持 TLS/HTTPS。
  • 高性能和低内存消耗。


安装

要安装该库,请执行以下命令:

go get github.com/gorilla/websocket

之后,在代码中导入该包:

import "github.com/gorilla/websocket"


Go WebSocket 服务器示例

下面是一个简单的服务器,它接受 WebSocket 连接并将接收到的消息发回(回显服务器):



package main

import ( "fmt" "log" "net/http"

"github.com/gorilla/websocket")

var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许所有来源(用于开发) },}

func echoHandler(w http.ResponseWriter, r *http.Request) { // 建立 WebSocket 连接 conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("升级错误:", err) return } defer conn.Close()

// 无限循环读取消息 for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("读取错误:", err) break } log.Printf("收到消息: %s", message)

// 将消息发回 err = conn.WriteMessage(messageType, message) if err != nil { log.Println("写入错误:", err) break } }}

func main() { http.HandleFunc("/echo", echoHandler) fmt.Println("服务器启动在 :8080") log.Fatal(http.ListenAndServe(":8080", nil))}


Go WebSocket 客户端

一个简单客户端的示例,它连接到服务器并发送消息:



package main

import ( "fmt" "log" "net/url"

"github.com/gorilla/websocket")

func main() { u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/echo"} fmt.Printf("正在连接到 %s", u.String())

conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { log.Fatal("连接错误:", err) } defer conn.Close()

// 发送文本消息 err = conn.WriteMessage(websocket.TextMessage, []byte("你好, WebSocket!")) if err != nil { log.Fatal("发送错误:", err) }

// 读取响应 _, message, err := conn.ReadMessage() if err != nil { log.Fatal("读取错误:", err) } fmt.Printf("收到响应: %s", message)}


处理多个客户端 (广播)

为了创建聊天或通知系统,通常需要向所有连接的客户端广播消息

推荐