feat: server.Server 将记录在线的连接信息,可获取到在线连接和计数等

This commit is contained in:
kercylan98 2023-07-11 10:48:40 +08:00
parent 6962cf4989
commit 8368fe0770
2 changed files with 50 additions and 18 deletions

View File

@ -123,6 +123,7 @@ func (slf *event) OnConnectionClosedEvent(conn *Conn, err any) {
handle(slf.Server, conn, err) handle(slf.Server, conn, err)
} }
conn.Close() conn.Close()
slf.Server.online.Delete(conn.GetID())
} }
// RegConnectionOpenedEvent 在连接打开后将立刻执行被注册的事件处理函数 // RegConnectionOpenedEvent 在连接打开后将立刻执行被注册的事件处理函数
@ -135,6 +136,7 @@ func (slf *event) RegConnectionOpenedEvent(handle ConnectionOpenedEventHandle) {
} }
func (slf *event) OnConnectionOpenedEvent(conn *Conn) { func (slf *event) OnConnectionOpenedEvent(conn *Conn) {
slf.Server.online.Set(conn.GetID(), conn)
for _, handle := range slf.connectionOpenedEventHandles { for _, handle := range slf.connectionOpenedEventHandles {
handle(slf.Server, conn) handle(slf.Server, conn)
} }

View File

@ -33,6 +33,7 @@ func New(network Network, options ...Option) *Server {
runtime: &runtime{messagePoolSize: DefaultMessageBufferSize, messageChannelSize: DefaultMessageChannelSize}, runtime: &runtime{messagePoolSize: DefaultMessageBufferSize, messageChannelSize: DefaultMessageChannelSize},
option: &option{}, option: &option{},
network: network, network: network,
online: synchronization.NewMap[string, *Conn](),
closeChannel: make(chan struct{}, 1), closeChannel: make(chan struct{}, 1),
systemSignal: make(chan os.Signal, 1), systemSignal: make(chan os.Signal, 1),
} }
@ -77,6 +78,7 @@ type Server struct {
network Network // 网络类型 network Network // 网络类型
addr string // 侦听地址 addr string // 侦听地址
systemSignal chan os.Signal // 系统信号 systemSignal chan os.Signal // 系统信号
online *synchronization.Map[string, *Conn] // 在线连接
ginServer *gin.Engine // HTTP模式下的路由器 ginServer *gin.Engine // HTTP模式下的路由器
httpServer *http.Server // HTTP模式下的服务器 httpServer *http.Server // HTTP模式下的服务器
grpcServer *grpc.Server // GRPC模式下的服务器 grpcServer *grpc.Server // GRPC模式下的服务器
@ -330,6 +332,33 @@ func (slf *Server) Run(addr string) error {
return nil 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 是否为生产模式 // IsProd 是否为生产模式
func (slf *Server) IsProd() bool { func (slf *Server) IsProd() bool {
return slf.prod 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 { func (slf *Server) GRPCServer() *grpc.Server {
if slf.grpcServer == nil { if slf.grpcServer == nil {
panic(ErrNetworkOnlySupportGRPC) panic(ErrNetworkOnlySupportGRPC)