package connect import ( "context" "gim/pkg/logger" "gim/pkg/pb" "gim/pkg/rpc" "time" "go.uber.org/zap" "github.com/alberliu/gn" ) var encoder = gn.NewHeaderLenEncoder(2, 1024) var server *gn.Server // StartTCPServer 启动TCP服务器 func StartTCPServer(addr string) { gn.SetLogger(logger.Sugar) var err error server, err = gn.NewServer(addr, &handler{}, gn.WithDecoder(gn.NewHeaderLenDecoder(2)), gn.WithEncoder(gn.NewHeaderLenEncoder(2, 1024)), gn.WithReadBufferLen(256), gn.WithTimeout(11*time.Minute), gn.WithAcceptGNum(10), gn.WithIOGNum(100)) if err != nil { logger.Sugar.Error(err) panic(err) } server.Run() } type handler struct{} func (*handler) OnConnect(c *gn.Conn) { // 初始化连接数据 conn := &Conn{ CoonType: CoonTypeTCP, TCP: c, } c.SetData(conn) logger.Logger.Debug("connect:", zap.Int32("fd", c.GetFd()), zap.String("addr", c.GetAddr())) } func (*handler) OnMessage(c *gn.Conn, bytes []byte) { conn := c.GetData().(*Conn) conn.HandleMessage(bytes) } func (*handler) OnClose(c *gn.Conn, err error) { conn, ok := c.GetData().(*Conn) if !ok || conn == nil { return } logger.Logger.Debug("close", zap.String("addr", c.GetAddr()), zap.Int64("user_id", conn.UserId), zap.Int64("device_id", conn.DeviceId), zap.Error(err)) DeleteConn(conn.DeviceId) if conn.UserId != 0 { _, _ = rpc.GetLogicIntClient().Offline(context.TODO(), &pb.OfflineReq{ UserId: conn.UserId, DeviceId: conn.DeviceId, ClientAddr: c.GetAddr(), }) } }