diff --git a/srvlib/serversessionmgr.go b/srvlib/serversessionmgr.go index dcd333a..01c3e50 100644 --- a/srvlib/serversessionmgr.go +++ b/srvlib/serversessionmgr.go @@ -9,8 +9,7 @@ import ( ) /* - 服务器信息注册,单个服务器可能包含多个服务端口 - 服务器信息->session + 服务器信息注册,单个服务器可能包含多个子服务端口 */ var ( @@ -28,76 +27,95 @@ type ServerSessionMgr struct { listeners []ServerSessionRegisteListener } +// AddListener 添加一个服务器会话注册监听器 func (ssm *ServerSessionMgr) AddListener(l ServerSessionRegisteListener) ServerSessionRegisteListener { ssm.listeners = append(ssm.listeners, l) return l } +// RegisteSession 注册一个新的服务器会话 func (ssm *ServerSessionMgr) RegisteSession(s *netlib.Session) bool { attr := s.GetAttribute(SessionAttributeServerInfo) - if attr != nil { - if srvInfo, ok := attr.(*protocol.SSSrvRegiste); ok && srvInfo != nil { - areaId := int(srvInfo.GetAreaId()) - srvType := int(srvInfo.GetType()) - srvId := int(srvInfo.GetId()) - if a, exist := ssm.sessions[areaId]; !exist { - ssm.sessions[areaId] = make(map[int]map[int]*netlib.Session) - a = ssm.sessions[areaId] - a[srvType] = make(map[int]*netlib.Session) - } else { - if _, exist := a[srvType]; !exist { - a[srvType] = make(map[int]*netlib.Session) - } - } - - if _, exist := ssm.sessions[areaId][srvType][srvId]; !exist { - logger.Logger.Infof("ServerSessionMgr RegisteSession %v", srvInfo) - ssm.sessions[areaId][srvType][srvId] = s - if len(ssm.listeners) != 0 { - for _, l := range ssm.listeners { - l.OnRegiste(s) - } - } - } else { - logger.Logger.Warnf("ServerSessionMgr RegisteSession repeated areaid:%v srvType:%v srvId:%v", areaId, srvType, srvId) - } - } - } else { - logger.Logger.Warnf("ServerSessionMgr.RegisteSession SessionAttributeServerInfo=nil") + if attr == nil { + logger.Logger.Warnf("服务器注册信息为空") + return false } + + srvInfo, ok := attr.(*protocol.SSSrvRegiste) + if !ok || srvInfo == nil { + logger.Logger.Warnf("服务器注册信息错误") + return false + } + + areaId := int(srvInfo.GetAreaId()) + srvType := int(srvInfo.GetType()) + srvId := int(srvInfo.GetId()) + + if _, ok := ssm.sessions[areaId]; !ok { + ssm.sessions[areaId] = make(map[int]map[int]*netlib.Session) + } + if _, ok := ssm.sessions[areaId][srvType]; !ok { + ssm.sessions[areaId][srvType] = make(map[int]*netlib.Session) + } + + session, has := ssm.sessions[areaId][srvType][srvId] + if has && session != nil && session != s { + logger.Logger.Infof("删除旧服务器注册: %v", srvInfo) + ssm.UnregisteSession(session) + } + + logger.Logger.Infof("服务器注册成功:%v", srvInfo) + ssm.sessions[areaId][srvType][srvId] = s + if len(ssm.listeners) != 0 { + for _, l := range ssm.listeners { + l.OnRegiste(s) + } + } + return true } +// UnregisteSession 注销一个服务器会话 func (ssm *ServerSessionMgr) UnregisteSession(s *netlib.Session) bool { attr := s.GetAttribute(SessionAttributeServerInfo) - if attr != nil { - if srvInfo, ok := attr.(*protocol.SSSrvRegiste); ok && srvInfo != nil { - logger.Logger.Infof("ServerSessionMgr UnregisteSession try %v", srvInfo) - areaId := int(srvInfo.GetAreaId()) - srvType := int(srvInfo.GetType()) - srvId := int(srvInfo.GetId()) - if a, exist := ssm.sessions[areaId]; exist { - if b, exist := a[srvType]; exist { - if _, exist := b[srvId]; exist { - logger.Logger.Infof("ServerSessionMgr UnregisteSession %v success", srvInfo) - delete(b, srvId) - if len(ssm.listeners) != 0 { - for _, l := range ssm.listeners { - l.OnUnregiste(s) - } - } - } else { - logger.Logger.Warnf("ServerSessionMgr UnregisteSession found not fit session, area:%v type:%v id:%v", areaId, srvType, srvId) + if attr == nil { + return false + } + + srvInfo, ok := attr.(*protocol.SSSrvRegiste) + if !ok || srvInfo == nil { + return false + } + + logger.Logger.Infof("尝试删除服务器注册:%v", srvInfo) + areaId := int(srvInfo.GetAreaId()) + srvType := int(srvInfo.GetType()) + srvId := int(srvInfo.GetId()) + + if a, exist := ssm.sessions[areaId]; exist { + if b, exist := a[srvType]; exist { + if conn, exist := b[srvId]; exist && s == conn { + logger.Logger.Infof("删除服务器注册成功 %v", srvInfo) + delete(b, srvId) + if len(ssm.listeners) != 0 { + for _, l := range ssm.listeners { + l.OnUnregiste(s) } } + return true + } else { + logger.Logger.Infof("服务器注册信息已经删除") + return false } } - } else { - logger.Logger.Warnf("ServerSessionMgr.UnregisteSession SessionAttributeServerInfo=nil") } - return true + + logger.Logger.Infof("服务器注册信息没找到:%v", srvInfo) + + return false } +// GetSession 根据区域ID、服务器类型和服务器ID获取会话 func (ssm *ServerSessionMgr) GetSession(areaId, srvType, srvId int) *netlib.Session { if a, exist := ssm.sessions[areaId]; exist { if b, exist := a[srvType]; exist { @@ -109,6 +127,7 @@ func (ssm *ServerSessionMgr) GetSession(areaId, srvType, srvId int) *netlib.Sess return nil } +// GetSessions 获取指定区域和服务器类型的所有会话 func (ssm *ServerSessionMgr) GetSessions(areaId, srvType int) (sessions []*netlib.Session) { if a, exist := ssm.sessions[areaId]; exist { if b, exist := a[srvType]; exist { @@ -120,6 +139,7 @@ func (ssm *ServerSessionMgr) GetSessions(areaId, srvType int) (sessions []*netli return } +// GetServerId 获取指定区域和服务器类型的第一个服务器ID func (ssm *ServerSessionMgr) GetServerId(areaId, srvType int) int { if a, exist := ssm.sessions[areaId]; exist { if b, exist := a[srvType]; exist { @@ -131,6 +151,7 @@ func (ssm *ServerSessionMgr) GetServerId(areaId, srvType int) int { return -1 } +// GetServerIdByMaxData 根据最大数据获取指定区域和服务器类型的服务器ID func (ssm *ServerSessionMgr) GetServerIdByMaxData(areaId, srvType int) int { var bestSid int = -1 var data string @@ -149,10 +170,20 @@ func (ssm *ServerSessionMgr) GetServerIdByMaxData(areaId, srvType int) int { return bestSid } +// GetServerIds 获取指定区域和服务器类型的所有服务器ID +// 参数: +// - areaId: 区域ID +// - srvType: 服务器类型 +// +// 返回: +// - ids: 包含所有匹配服务器ID的切片 func (ssm *ServerSessionMgr) GetServerIds(areaId, srvType int) (ids []int) { + // 检查指定区域是否存在 if a, exist := ssm.sessions[areaId]; exist { + // 检查指定服务器类型是否存在 if b, exist := a[srvType]; exist { - for sid, _ := range b { + // 遍历所有匹配的服务器,收集它们的ID + for sid := range b { ids = append(ids, sid) } } @@ -160,9 +191,11 @@ func (ssm *ServerSessionMgr) GetServerIds(areaId, srvType int) (ids []int) { return } +// Broadcast 向指定区域和服务器类型广播消息 func (ssm *ServerSessionMgr) Broadcast(packetid int, pack interface{}, areaId, srvType int) { if areaId >= 0 { if srvType >= 0 { + // 向特定区域和服务器类型广播 if a, exist := ssm.sessions[areaId]; exist { if b, exist := a[srvType]; exist { for _, s := range b { @@ -171,6 +204,7 @@ func (ssm *ServerSessionMgr) Broadcast(packetid int, pack interface{}, areaId, s } } } else { + // 向特定区域的所有服务器类型广播 if a, exist := ssm.sessions[areaId]; exist { for _, b := range a { for _, s := range b { @@ -181,6 +215,7 @@ func (ssm *ServerSessionMgr) Broadcast(packetid int, pack interface{}, areaId, s } } else { if srvType >= 0 { + // 向所有区域的特定服务器类型广播 for _, a := range ssm.sessions { if b, exist := a[srvType]; exist { for _, s := range b { @@ -189,6 +224,7 @@ func (ssm *ServerSessionMgr) Broadcast(packetid int, pack interface{}, areaId, s } } } else { + // 向所有区域的所有服务器类型广播 for _, a := range ssm.sessions { for _, b := range a { for _, s := range b {