You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.7 KiB
77 lines
1.7 KiB
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 |
|
} |
|
} |
|
|
|
func (c *NetClient) ReadMessage() (bytes []byte, err error) { |
|
err = c.Conn.SetReadDeadline(time.Now().Add(c.readDeadline)) |
|
if err != nil { |
|
return |
|
} |
|
|
|
var messageType int |
|
messageType, bytes, err = c.Conn.ReadMessage() |
|
if messageType != websocket.BinaryMessage { |
|
err = fmt.Errorf("only support websocket binary message") |
|
return |
|
} |
|
return |
|
}
|
|
|