Files
toutoukan/socket/connect.go
2025-08-10 05:57:51 +08:00

61 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}
}
}