package srvlib import ( "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" ) /* 所有连接(一般是玩家客户端连接) sid->session */ var ( SessionAttributeClientSession = &ClientSessionMgr{} ClientSessionMgrSington = &ClientSessionMgr{sessions: make(map[int64]*netlib.Session)} ) type ClientSessionMgr struct { sessions map[int64]*netlib.Session //keys=>sessionid } func (csm *ClientSessionMgr) RegisteSession(s *netlib.Session) bool { attr := s.GetAttribute(SessionAttributeClientSession) if attr == nil { sid := NewSessionId(s) s.SetAttribute(SessionAttributeClientSession, sid) csm.sessions[sid.Get()] = s logger.Logger.Tracef("ClientSessionMgr(%p).RegisteSession client session %v registe", csm, sid.Get()) } return true } func (csm *ClientSessionMgr) UnregisteSession(s *netlib.Session) bool { attr := s.GetAttribute(SessionAttributeClientSession) if attr != nil { if sid, ok := attr.(SessionId); ok { delete(csm.sessions, sid.Get()) logger.Logger.Tracef("ClientSessionMgr(%p).UnregisteSession client session %v unregiste", csm, sid.Get()) } } return true } func (csm *ClientSessionMgr) GetSession(srvId int64) *netlib.Session { if s, exist := csm.sessions[srvId]; exist { return s } return nil } func (csm *ClientSessionMgr) GetSessions() map[int64]*netlib.Session { return csm.sessions } func (csm *ClientSessionMgr) Broadcast(packetid int, pack interface{}) { for _, s := range csm.sessions { s.Send(packetid, pack) } } func (csm *ClientSessionMgr) Count() int { return len(csm.sessions) } func (csm *ClientSessionMgr) CloseAll() { logger.Logger.Tracef("ClientSessionMgr(%p).CloseAll!!!!!!!!!!!! session's cnt=%v", csm, len(csm.sessions)) for _, s := range csm.sessions { s.Close() } }