From 8368fe0770fb98a81a9588aef63fd2cc8b0e77c4 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 11 Jul 2023 10:48:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20server.Server=20=E5=B0=86=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=9C=A8=E7=BA=BF=E7=9A=84=E8=BF=9E=E6=8E=A5=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E5=8F=AF=E8=8E=B7=E5=8F=96=E5=88=B0=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E8=BF=9E=E6=8E=A5=E5=92=8C=E8=AE=A1=E6=95=B0=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/event.go | 2 ++ server/server.go | 66 +++++++++++++++++++++++++++++++++++------------- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/server/event.go b/server/event.go index b7583aa..02b2402 100644 --- a/server/event.go +++ b/server/event.go @@ -123,6 +123,7 @@ func (slf *event) OnConnectionClosedEvent(conn *Conn, err any) { handle(slf.Server, conn, err) } conn.Close() + slf.Server.online.Delete(conn.GetID()) } // RegConnectionOpenedEvent 在连接打开后将立刻执行被注册的事件处理函数 @@ -135,6 +136,7 @@ func (slf *event) RegConnectionOpenedEvent(handle ConnectionOpenedEventHandle) { } func (slf *event) OnConnectionOpenedEvent(conn *Conn) { + slf.Server.online.Set(conn.GetID(), conn) for _, handle := range slf.connectionOpenedEventHandles { handle(slf.Server, conn) } diff --git a/server/server.go b/server/server.go index 1317f74..81e59bb 100644 --- a/server/server.go +++ b/server/server.go @@ -33,6 +33,7 @@ func New(network Network, options ...Option) *Server { runtime: &runtime{messagePoolSize: DefaultMessageBufferSize, messageChannelSize: DefaultMessageChannelSize}, option: &option{}, network: network, + online: synchronization.NewMap[string, *Conn](), closeChannel: make(chan struct{}, 1), systemSignal: make(chan os.Signal, 1), } @@ -71,24 +72,25 @@ func New(network Network, options ...Option) *Server { // Server 网络服务器 type Server struct { - *event // 事件 - *runtime // 运行时 - *option // 可选项 - network Network // 网络类型 - addr string // 侦听地址 - systemSignal chan os.Signal // 系统信号 - ginServer *gin.Engine // HTTP模式下的路由器 - httpServer *http.Server // HTTP模式下的服务器 - grpcServer *grpc.Server // GRPC模式下的服务器 - gServer *gNet // TCP或UDP模式下的服务器 - isRunning bool // 是否正在运行 - isShutdown atomic.Bool // 是否已关闭 - closeChannel chan struct{} // 关闭信号 - ants *ants.Pool // 协程池 - messagePool *synchronization.Pool[*Message] // 消息池 - messageChannel chan *Message // 消息管道 - multiple *MultipleServer // 多服务器模式下的服务器 - multipleRuntimeErrorChan chan error // 多服务器模式下的运行时错误 + *event // 事件 + *runtime // 运行时 + *option // 可选项 + network Network // 网络类型 + addr string // 侦听地址 + systemSignal chan os.Signal // 系统信号 + online *synchronization.Map[string, *Conn] // 在线连接 + ginServer *gin.Engine // HTTP模式下的路由器 + httpServer *http.Server // HTTP模式下的服务器 + grpcServer *grpc.Server // GRPC模式下的服务器 + gServer *gNet // TCP或UDP模式下的服务器 + isRunning bool // 是否正在运行 + isShutdown atomic.Bool // 是否已关闭 + closeChannel chan struct{} // 关闭信号 + ants *ants.Pool // 协程池 + messagePool *synchronization.Pool[*Message] // 消息池 + messageChannel chan *Message // 消息管道 + multiple *MultipleServer // 多服务器模式下的服务器 + multipleRuntimeErrorChan chan error // 多服务器模式下的运行时错误 } // Run 使用特定地址运行服务器 @@ -330,6 +332,33 @@ func (slf *Server) Run(addr string) error { return nil } +// GetOnlineCount 获取在线人数 +func (slf *Server) GetOnlineCount() int { + return slf.online.Size() +} + +// GetOnline 获取在线连接 +func (slf *Server) GetOnline(id string) *Conn { + return slf.online.Get(id) +} + +// GetOnlineAll 获取所有在线连接 +func (slf *Server) GetOnlineAll() map[string]*Conn { + return slf.online.Map() +} + +// IsOnline 是否在线 +func (slf *Server) IsOnline(id string) bool { + return slf.online.Exist(id) +} + +// CloseConn 关闭连接 +func (slf *Server) CloseConn(id string) { + if conn, exist := slf.online.GetExist(id); exist { + conn.Close() + } +} + // IsProd 是否为生产模式 func (slf *Server) IsProd() bool { return slf.prod @@ -425,6 +454,7 @@ func (slf *Server) shutdown(err error, stack ...string) { } } +// GRPCServer 当网络类型为 NetworkGRPC 时将被允许获取 grpc 服务器,否则将会发生 panic func (slf *Server) GRPCServer() *grpc.Server { if slf.grpcServer == nil { panic(ErrNetworkOnlySupportGRPC)