解决冲突

This commit is contained in:
sk 2024-09-19 18:28:35 +08:00
parent 25b48cb708
commit 3ade451006
1 changed files with 89 additions and 53 deletions

View File

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