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 } } }