添加websocket连接
This commit is contained in:
1
go.mod
1
go.mod
@@ -23,6 +23,7 @@ require (
|
|||||||
github.com/goccy/go-json v0.10.5 // indirect
|
github.com/goccy/go-json v0.10.5 // indirect
|
||||||
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
|
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
|
||||||
github.com/google/uuid v1.6.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/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/klauspost/compress v1.18.0 // indirect
|
github.com/klauspost/compress v1.18.0 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package router
|
|||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"toutoukan/controllers/user"
|
"toutoukan/controllers/user"
|
||||||
|
"toutoukan/socket"
|
||||||
)
|
)
|
||||||
|
|
||||||
func SetupRouter() *gin.Engine {
|
func SetupRouter() *gin.Engine {
|
||||||
@@ -12,6 +13,9 @@ func SetupRouter() *gin.Engine {
|
|||||||
{
|
{
|
||||||
apiGroup.POST("/login", user.UserLogin)
|
apiGroup.POST("/login", user.UserLogin)
|
||||||
}
|
}
|
||||||
|
r.GET("/socket", func(c *gin.Context) {
|
||||||
|
socket.WebsocketHandler(c)
|
||||||
|
})
|
||||||
|
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|||||||
60
socket/connect.go
Normal file
60
socket/connect.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -37,7 +37,6 @@ func GenerateJWTAndStore(openid string) (string, error) {
|
|||||||
openid,
|
openid,
|
||||||
2*time.Hour,
|
2*time.Hour,
|
||||||
).Err()
|
).Err()
|
||||||
|
|
||||||
return tokenString, err
|
return tokenString, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user