From 147f0a31a0859502cc32775751cadb48fd31181f Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Wed, 1 May 2024 14:42:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20server=20=E6=96=B0=E5=A2=9E=20NewOfflin?= =?UTF-8?q?eConn=20=E5=87=BD=E6=95=B0=EF=BC=8C=E5=85=BC=E5=AE=B9=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=89=B9=E6=AE=8A=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/conn.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/server/conn.go b/server/conn.go index 555a39e..41376e5 100644 --- a/server/conn.go +++ b/server/conn.go @@ -14,6 +14,7 @@ import ( "github.com/panjf2000/gnet" "github.com/xtaci/kcp-go/v5" "io" + "math" "net" "net/http" "os" @@ -83,6 +84,26 @@ func newWebsocketConn(server *Server, ws *websocket.Conn, ip string) *Conn { return c } +// NewOfflineConn 创建一个离线连接 +func NewOfflineConn(server *Server) *Conn { + addr := &net.TCPAddr{ + IP: net.ParseIP(random.IPv4()), + Port: random.Int(65536, math.MaxInt), + } + c := &Conn{ + ctx: server.ctx, + connection: &connection{ + server: server, + remoteAddr: addr, + ip: addr.String(), + data: map[any]any{}, + openTime: time.Now(), + offline: true, + }, + } + return c +} + // newBotConn 创建一个适用于测试等情况的机器人连接 func newBotConn(server *Server) *Conn { ip, port := random.NetIP(), random.Port() @@ -132,6 +153,7 @@ type connection struct { delay time.Duration fluctuation time.Duration botWriter atomic.Pointer[io.Writer] + offline bool } // Ticker 获取定时器 @@ -257,6 +279,9 @@ func (slf *Conn) PushUniqueAsyncMessage(name string, caller func() error, callba // Write 向连接中写入数据 func (slf *Conn) Write(packet []byte, callback ...func(err error)) { + if slf.offline { + return + } if slf.gw != nil { slf.gw(packet) return @@ -333,6 +358,10 @@ func (slf *Conn) init() { // Close 关闭连接 func (slf *Conn) Close(err ...error) { + if slf.offline { + slf.server.dispatcherMgr.UnBindProducer(slf.GetID()) + return + } slf.mu.Lock() if slf.closed { if slf.ticker != nil {