golang,go,博客,开源,编程

golang每日一库之gorilla/websocket

Published on with 0 views and 0 comments

gorilla/websocket 是 Go 语言中最常用的 WebSocket 实现之一,它提供了一个简单而功能强大的 API,用于通过 WebSocket 协议建立客户端与服务器之间的实时、双向通信。WebSocket 协议是一种在客户端和服务器之间进行全双工通信的协议,广泛应用于需要低延迟、实时更新的应用场景,比如聊天应用、实时推送系统等。

gorilla/websocket 主要特性

  1. 跨平台支持gorilla/websocket 兼容多种操作系统和环境,支持在 Windows、Linux 和 macOS 上运行。
  2. 标准实现:它符合 WebSocket RFC 6455 标准,确保其实现的兼容性和稳定性。
  3. 易用性:提供简单易用的 API,可以轻松地实现 WebSocket 服务端和客户端。
  4. 支持 ping/pong 机制:可以使用 ping/pong 消息机制保持连接的活跃性。
  5. 连接管理:支持并发的 WebSocket 连接管理,能够处理连接的打开、关闭和错误。
  6. 灵活的消息处理:支持发送文本和二进制消息,可以根据需要选择不同的消息类型。

安装

首先,使用以下命令安装 gorilla/websocket

go get github.com/gorilla/websocket

基本示例

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 handler(w http.ResponseWriter, r *http.Request) {
	// 升级 HTTP 请求为 WebSocket 连接
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println(err)
		return
	}
	defer conn.Close()

	for {
		// 读取消息
		messageType, p, err := conn.ReadMessage()
		if err != nil {
			log.Println(err)
			return
		}

		// 打印接收到的消息
		fmt.Printf("Received: %s\n", p)

		// 发送消息回客户端
		err = conn.WriteMessage(messageType, p)
		if err != nil {
			log.Println(err)
			return
		}
	}
}

func main() {
	http.HandleFunc("/ws", handler)

	// 启动 WebSocket 服务器
	log.Println("WebSocket server starting on :8080")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

WebSocket 客户端

下面是一个简单的 WebSocket 客户端示例,它连接到服务端并发送消息。

package main

import (
	"fmt"
	"log"
	"github.com/gorilla/websocket"
)

func main() {
	// 连接到 WebSocket 服务器
	conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
	if err != nil {
		log.Fatal("dial:", err)
	}
	defer conn.Close()

	// 发送消息
	err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, WebSocket!"))
	if err != nil {
		log.Fatal("write:", err)
	}

	// 接收服务器消息
	_, msg, err := conn.ReadMessage()
	if err != nil {
		log.Fatal("read:", err)
	}
	fmt.Printf("Received: %s\n", msg)
}

主要功能和 API

  1. Upgrader:将 HTTP 请求升级为 WebSocket 连接。通过 Upgrader.Upgrade() 方法将 HTTP 连接升级为 WebSocket。
  2. conn.ReadMessage():读取 WebSocket 连接的消息。可以读取文本或二进制消息。
  3. conn.WriteMessage():向 WebSocket 连接发送消息。可以发送文本消息、二进制消息等。
  4. conn.SetPongHandler():设置 Pong 消息的处理函数,处理服务器返回的 ping/pong 消息。
  5. conn.SetCloseHandler():设置关闭连接时的回调函数。

处理连接关闭

WebSocket 连接通常会有一个关闭过程。在 gorilla/websocket 中,您可以设置一个关闭回调函数,以便在连接关闭时执行一些操作。

conn.SetCloseHandler(func(code int, text string) error {
	fmt.Printf("Connection closed with code %d, message: %s\n", code, text)
	return nil
})

连接保持活跃(ping/pong)

gorilla/websocket 提供了内建的支持来保持 WebSocket 连接活跃。通过发送 ping 和接收 pong,服务器可以确保客户端仍然在线。

// 设置 Ping/Pong 处理函数
conn.SetPongHandler(func(appData string) error {
	fmt.Printf("Received Pong: %s\n", appData)
	return nil
})

适用场景

  • 实时聊天应用:WebSocket 非常适合用于实现实时消息传递系统,比如聊天应用。
  • 实时推送系统:比如股票价格更新、新闻推送等。
  • 在线游戏:WebSocket 可以实现低延迟的实时通信,适用于多人在线游戏。

总结

gorilla/websocket 是 Go 语言中处理 WebSocket 连接的一个强大而简单的库,适合用于构建需要实时通信的应用。它不仅遵循 WebSocket 协议的标准,还提供了易于使用的 API 和许多高级功能,如 ping/pong 机制、连接关闭处理等。


标题:golang每日一库之gorilla/websocket
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/27/1737952899550.html
联系:scotttu@163.com