package session import ( "fmt" "github.com/gorilla/websocket" "sonet/pkg/utils/logger" "sync" "sync/atomic" "time" ) // NetClient 长连接客户端 type NetClient struct { Conn *websocket.Conn writeDeadline, readDeadline time.Duration Online *atomic.Bool Account *NetAccount WriteLock *sync.Mutex } func NewNetClient(conn *websocket.Conn, readDeadline, writeDeadline time.Duration) *NetClient { online := &atomic.Bool{} online.Store(true) return &NetClient{ Conn: conn, readDeadline: readDeadline, writeDeadline: writeDeadline, WriteLock: new(sync.Mutex), Online: online, } } func (c *NetClient) Close() { err := c.Conn.Close() if err != nil { logger.Error("NetClient Close error: ", err) } } func (c *NetClient) Write(bytes []byte) (err error) { c.WriteLock.Lock() defer c.WriteLock.Unlock() err = c.Conn.SetWriteDeadline(time.Now().Add(10 * time.Second)) if err != nil { err = fmt.Errorf("NetClient SetWriteDeadline error: %s", err.Error()) return } err = c.Conn.WriteMessage(websocket.BinaryMessage, bytes) if err != nil { err = fmt.Errorf("NetClient write message error: %s", err.Error()) } return } func (c *NetClient) MustWrite(bytes []byte) { err := c.Write(bytes) if err != nil { logger.Error(err) return } } // ReadMessage 阻塞读取消息 func (c *NetClient) ReadMessage() (ignore bool, bytes []byte, err error) { // err = c.Conn.SetReadDeadline(time.Now().Add(c.readDeadline)) err = c.Conn.SetReadDeadline(time.Time{}) if err != nil { return } var messageType int messageType, bytes, err = c.Conn.ReadMessage() if messageType != websocket.BinaryMessage { ignore = true logger.Infof("read websocket message type: %d", messageType) return } return }