From f41a1a02d67a2992ad70f3657ef77062d896229d Mon Sep 17 00:00:00 2001 From: mayiming <1627832236@qq.com> Date: Sun, 10 Aug 2025 05:57:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0websocket=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 1 + router/setupRouter.go | 4 +++ socket/connect.go | 60 +++++++++++++++++++++++++++++++++++++++++++ utill/jwtUt.go | 1 - 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 socket/connect.go diff --git a/go.mod b/go.mod index 7946cc2..163abed 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( github.com/goccy/go-json v0.10.5 // indirect github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect diff --git a/router/setupRouter.go b/router/setupRouter.go index 7b5bbc6..1ad05c6 100644 --- a/router/setupRouter.go +++ b/router/setupRouter.go @@ -3,6 +3,7 @@ package router import ( "github.com/gin-gonic/gin" "toutoukan/controllers/user" + "toutoukan/socket" ) func SetupRouter() *gin.Engine { @@ -12,6 +13,9 @@ func SetupRouter() *gin.Engine { { apiGroup.POST("/login", user.UserLogin) } + r.GET("/socket", func(c *gin.Context) { + socket.WebsocketHandler(c) + }) return r } diff --git a/socket/connect.go b/socket/connect.go new file mode 100644 index 0000000..a817ead --- /dev/null +++ b/socket/connect.go @@ -0,0 +1,60 @@ +package socket + +import ( + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "log" + "net/http" +) + +// 1. 配置WebSocket升级器(处理HTTP到WebSocket的握手) +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + // 允许跨域(生产环境需根据实际情况限制) + CheckOrigin: func(r *http.Request) bool { + return true + }, +} + +// 2. WebSocket处理器(处理实时消息) +func WebsocketHandler(c *gin.Context) { + // 从Gin上下文中提取标准库的ResponseWriter和Request + w := c.Writer + r := c.Request + + // 将HTTP连接升级为WebSocket + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Printf("升级WebSocket失败: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{ + "error": "WebSocket连接失败", + }) + return + } + defer conn.Close() // 确保连接关闭 + + // 客户端IP,用于日志 + clientIP := r.RemoteAddr + log.Printf("新的WebSocket连接: %s", clientIP) + + // 循环处理消息 + for { + // 读取消息类型(文本/二进制)和内容 + msgType, p, err := conn.ReadMessage() + if err != nil { + log.Printf("WebSocket读取错误(%s): %v", clientIP, err) + break + } + + // 处理消息内容(示例:打印收到的消息) + log.Printf("收到来自%s的消息(类型:%d): %s", clientIP, msgType, string(p)) + + // 示例:根据消息类型回复(保持原类型) + response := []byte("已收到:" + string(p)) + if err := conn.WriteMessage(msgType, response); err != nil { + log.Printf("WebSocket发送错误(%s): %v", clientIP, err) + break + } + } +} diff --git a/utill/jwtUt.go b/utill/jwtUt.go index 0197b19..d4574eb 100644 --- a/utill/jwtUt.go +++ b/utill/jwtUt.go @@ -37,7 +37,6 @@ func GenerateJWTAndStore(openid string) (string, error) { openid, 2*time.Hour, ).Err() - return tokenString, err }