package logic import ( "context" "encoding/json" "fmt" "slowwildws/internal/server" "slowwildws/internal/svc" "slowwildws/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type ConnectionLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewConnectionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ConnectionLogic { return &ConnectionLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } // 处理连接信息 func (c *ConnectionLogic) HandlerConn(conn *server.ConnectionServer) { uid := c.svcCtx.WsServer.GetUserId(conn) if uid == 0 { // 如果用户id不存在,直接关闭连接 c.svcCtx.WsServer.Close(conn) return } fmt.Println(fmt.Sprintf("用户id:%d", uid)) conn.Uid = uid // 处理任务 go c.svcCtx.WsServer.HandleWrite(conn) if c.svcCtx.WsServer.IsAck(nil) { go c.svcCtx.WsServer.ReadAck(conn) } for { // 获取消息 _, msg, err := conn.ReadMessage() if err != nil { c.Logger.Errorf("websocket conn read message error %v", err) c.svcCtx.WsServer.Close(conn) return } // 解析消息 var message types.Message if err = json.Unmarshal(msg, &message); err != nil { c.Logger.Errorf("json unmarshal err %v, msg %v", err, string(msg)) c.svcCtx.WsServer.Close(conn) return } if c.svcCtx.WsServer.IsAck(&message) { c.svcCtx.WsServer.Logger.Infof("conn message read ack msg %v", message) conn.AppendMsgMq(&message) } else { conn.WriteMessageToChan(&message) } } }