61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
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
|
||
}
|
||
}
|
||
}
|