WebSocket是一种基于HTTP扩展的支持全双工通信的应用层协议,适用于实时通讯、网络游戏等场景。Gin框架本身未提供WebSocket相关的支持,但我们可以很容易的将gorilla/websocket
集成到Gin中。Gorilla是一个流行的Go语言Web工具包,其中提供了多种功能强大的模块,gorilla/websocket
便是其中之一。这篇笔记我们介绍如何基于Gin开发WebSocket服务。
执行以下命令安装gorilla/websocket
包。
go get -u github.com/gorilla/websocket
这里我们直接编写一个简单的例子,代码中我们创建了一个WebSocket服务,它会向客户端echo输入的内容,当输入的内容为exit
时则关闭连接。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"net/http"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println(err.Error())
return
}
defer func() {
err := conn.Close()
if err != nil {
fmt.Println(err.Error())
return
}
}()
for {
_, p, err := conn.ReadMessage()
if err != nil {
fmt.Println(err.Error())
return
}
pStr := string(p)
if pStr == "exit" {
break
} else {
println("Received: ", string(p))
err = conn.WriteMessage(websocket.TextMessage, p)
if err != nil {
fmt.Println(err.Error())
return
}
}
}
}
func main() {
engine := gin.Default()
engine.GET("/ws", func(context *gin.Context) {
wsHandler(context.Writer, context.Request)
})
err := engine.Run(":8080")
if err != nil {
fmt.Println(err)
return
}
}
代码中,upgrader
用于配置WebSocket连接的参数。main()
函数中,我们在/ws
路径上注册了WebSocket相关的处理函数,它调用gorilla/websocket
来将连接“升级”为WebSocket连接。wsHandler()
中的代码逻辑十分简单,我们编写了一个循环,当接收到消息时,我们将其打印出来,然后将其原样发送回客户端。当接收到消息为exit
时,我们退出循环。