package server import ( "fmt" "github.com/gorilla/websocket" "go.uber.org/zap" "runtime/debug" ) // Client 用户连接 type Client struct { Addr string // 客户端地址 Socket *websocket.Conn // 用户连接 Send chan []byte // 待发送的数据 AppID uint32 // 登录的平台ID app/web/ios UserID string // 用户ID,用户登录以后才有 FirstTime uint64 // 首次连接事件 HeartbeatTime uint64 // 用户上次心跳时间 LoginTime uint64 // 登录时间 登录以后才有 } // NewClient 初始化 func NewClient(addr string, socket *websocket.Conn, firstTime uint64) (client *Client) { client = &Client{ Addr: addr, Socket: socket, Send: make(chan []byte, 100), FirstTime: firstTime, HeartbeatTime: firstTime, } return } // 读取客户端数据 func (c *Client) read() { defer func() { if r := recover(); r != nil { zap.L().Error("write stop", zap.String("stack", string(debug.Stack())), zap.Any("r", r)) } }() defer func() { close(c.Send) }() for { _, message, err := c.Socket.ReadMessage() fmt.Println("读取客户端数据", message) if err != nil { fmt.Println("读取客户端数据 错误", c.Addr, err) return } ProcessData(c, message) } } // SendMsg 发送数据 func (c *Client) SendMsg(msg []byte) { if c == nil { return } defer func() { if r := recover(); r != nil { fmt.Println("SendMsg stop:", r, string(debug.Stack())) } }() c.Send <- msg } func (c *Client) write() { defer func() { if r := recover(); r != nil { fmt.Println("write stop", string(debug.Stack()), r) } }() defer func() { GlobalClientManager.Unregister <- c _ = c.Socket.Close() }() for { select { case message, ok := <-c.Send: if !ok { // 发送数据错误 关闭连接 fmt.Println("Client发送数据 关闭连接", c.Addr, "ok", ok) return } _ = c.Socket.WriteMessage(websocket.TextMessage, message) } } }