golang,go,博客,开源,编程
gorilla/websocket
是 Go 语言中最常用的 WebSocket 实现之一,它提供了一个简单而功能强大的 API,用于通过 WebSocket 协议建立客户端与服务器之间的实时、双向通信。WebSocket 协议是一种在客户端和服务器之间进行全双工通信的协议,广泛应用于需要低延迟、实时更新的应用场景,比如聊天应用、实时推送系统等。
gorilla/websocket
主要特性gorilla/websocket
兼容多种操作系统和环境,支持在 Windows、Linux 和 macOS 上运行。首先,使用以下命令安装 gorilla/websocket
:
go get github.com/gorilla/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 客户端示例,它连接到服务端并发送消息。
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)
}
Upgrader
:将 HTTP 请求升级为 WebSocket 连接。通过 Upgrader.Upgrade()
方法将 HTTP 连接升级为 WebSocket。conn.ReadMessage()
:读取 WebSocket 连接的消息。可以读取文本或二进制消息。conn.WriteMessage()
:向 WebSocket 连接发送消息。可以发送文本消息、二进制消息等。conn.SetPongHandler()
:设置 Pong 消息的处理函数,处理服务器返回的 ping/pong 消息。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
})
gorilla/websocket
提供了内建的支持来保持 WebSocket 连接活跃。通过发送 ping
和接收 pong
,服务器可以确保客户端仍然在线。
// 设置 Ping/Pong 处理函数
conn.SetPongHandler(func(appData string) error {
fmt.Printf("Received Pong: %s\n", appData)
return nil
})
gorilla/websocket
是 Go 语言中处理 WebSocket 连接的一个强大而简单的库,适合用于构建需要实时通信的应用。它不仅遵循 WebSocket 协议的标准,还提供了易于使用的 API 和许多高级功能,如 ping/pong 机制、连接关闭处理等。