package websocket import ( "encoding/json" "fmt" "log" "net" "net/http" "site/core" "site/utils/tcp" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) type ImController struct { core.Controller WsManager *core.WebSocketConnManager } func NewImController() *ImController { return &ImController{ WsManager: core.NewWebSocketConnManager(), } } func (ic *ImController) Register(r *gin.RouterGroup) { r.GET("/ws", ic.WebSocketServer) } type TcpData struct { ConnId string `json:"conn_id"` Message string `json:"message"` } func init() { // 创建一个TCP服务,作为数据发送接口 go func() { tcp.NewServer().Listen("127.0.0.1:8081", func(conn net.Conn) { // 从连接读取数据 buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { log.Println("read error:", err) } // 解析数据 var data TcpData err = json.Unmarshal(buf[:n], &data) if err != nil { log.Println("json unmarshal error:", err) } // 发送数据到所有WebSocket连接 wsManage := core.NewWebSocketConnManager() wsConn, ok := wsManage.GetConn(data.ConnId) if ok { fmt.Printf("conn: %v\n", wsConn) } }) }() } // WebSocket服务 func (ic *ImController) WebSocketServer(c *gin.Context) { upgrader := &websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { http.NotFound(c.Writer, c.Request) } // 生成连接ID并加入到管理器 connId := ic.UUID() ic.WsManager.AddConn(connId, conn) ic.WsManager.SendMessageToUser(connId, []byte("连接ID: "+connId)) ic.WsManager.SendMessageToAll([]byte("用户" + connId + "上线了")) defer ic.closeWebSocketConn(connId) log.Printf("连接已建立,连接ID:%s", connId) go func() { tcpConn, err := net.Dial("tcp", "127.0.0.1:8081") if err != nil { log.Println("tcp dial error:", err) } defer tcpConn.Close() td := TcpData{ ConnId: connId, Message: "hello tcp", } sd, _ := json.Marshal(td) tcpConn.Write([]byte(sd)) }() for { _, msg, err := conn.ReadMessage() if err != nil { ic.closeWebSocketConn(connId) break } log.Println("客户端" + connId + "消息:" + string(msg)) } } // 关闭连接 func (ic *ImController) closeWebSocketConn(connId string) { conn, ok := ic.WsManager.GetConn(connId) if ok { log.Printf("连接已关闭,连接ID:%s", connId) conn.Close() ic.WsManager.RemoveConn(connId) } }