/// <summary> /// 有服务来重新注册(其他Server向CenterServer注册用) /// </summary> /// <param name="svrInfo">服务信息</param> public void OnReRegisterSvr(ref PtServerInfo svrInfo) { SvLogger.Info("OnReRegisterSvr Begin: ServerType={0}, ServerName={1}, sessionID={2}.", svrInfo.m_Type, svrInfo.m_Name, m_protoData.m_SessionID); svrInfo.m_SessionID = m_protoData.m_SessionID; int errCode = RegServerManager.Instance.RegServer(ref svrInfo); if (errCode == 0) { ServerCommon.Network.NetworkManager.Instance.OnServerRegist(svrInfo); //注册成功 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, InternalProtocolClientHelper.ReRegisterSvrOK(RegServerManager.Instance.m_SelfSvrInfo)); SvLogger.Info("OnReRegisterSvr OK: ServerType={0}, ServerName={1}, sessionID={2}.", svrInfo.m_Type, svrInfo.m_Name, m_protoData.m_SessionID); InternalProtocolDealDelegate.Instance.OnReregistServer(svrInfo, "Succ"); } else { //注册失败 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, InternalProtocolClientHelper.ReRegisterSvrFail(errCode, "Reregist Center Server Fail!")); SvLogger.Info("OnReRegisterSvr Fail: ServerType={0}, ServerName={1}, sessionID={2}, errCode={3}.", svrInfo.m_Type, svrInfo.m_Name, m_protoData.m_SessionID, errCode); InternalProtocolDealDelegate.Instance.OnReregistServer(svrInfo, "Fail"); } }
/// <summary> /// 显示缓存中数据库访问数量 /// </summary> /// <returns></returns> public void ShowDBAccCountInPool() { if (m_logDbAccPool != null) { SvLogger.Info(string.Format("### Main DBType=LogDB, AccCountInPool={0}.", m_logDbAccPool.GetDBCountInPool())); } if (m_secdDbAccPool != null) { SvLogger.Info(string.Format("### Main DBType=SecdDB, AccCountInPool={0}.", m_secdDbAccPool.GetDBCountInPool())); } for (int i = 0; i < m_gameDBMainConnFlagList.Count; ++i) { DbAccessPool dbPool = GetDBPool(m_gameDBMainConnFlagList[i]); if (dbPool != null) { SvLogger.Info(string.Format("### Main DBType=GameDB, AccCountInPool={0}.", dbPool.GetDBCountInPool())); List <int> childFlagList; m_gameDBChildConnFlagDic.TryGetValue(m_gameDBMainConnFlagList[i], out childFlagList); if (childFlagList != null) { for (int j = 0; j < childFlagList.Count; ++j) { dbPool = GetDBPool(childFlagList[j]); if (dbPool != null) { SvLogger.Info(string.Format("### Child DBFlag={0}, AccCountInPool={1}.", childFlagList[j], dbPool.GetDBCountInPool())); } } } } } }
/// <summary> /// 有服务通知连接(除CenterSrever之外其他服务之间互联验证用) /// </summary> /// <param name="svrinfo">服务信息</param> /// <param name="sessionID"></param> public void OnNotifyConnectorSvr(ref com.tieao.mmo.interval.PtServerInfo svrinfo) { SvLogger.Info("OnNotifyConnectorSvr Begin: ServerType={0}, ServerName={1}, sessionID={2}.", svrinfo.m_Type, svrinfo.m_Name, m_protoData.m_SessionID); svrinfo.m_SessionID = m_protoData.m_SessionID; int errCode = RegServerManager.Instance.RegServer(ref svrinfo); if (errCode == 0) { //连接成功 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, InternalProtocolClientHelper.ConnectSvrSucc(RegServerManager.Instance.m_SelfSvrInfo)); SvLogger.Info("OnNotifyConnectorSvr OK: ServerType={0}, ServerName={1}, sessionID={2}.", svrinfo.m_Type, svrinfo.m_Name, m_protoData.m_SessionID); if (SvrCommCfg.Instance.ServerInfo.m_Type == eServerType.GAMEDATA && svrinfo.m_Type == eServerType.DATABASE) { //通知DBS可以发送数据过来 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, com.tieao.mmo.database4server.server.GDSUpdate2DBSServerHelper.RequestAllPlayerData()); } InternalProtocolDealDelegate.Instance.OnConnectServerSucc(svrinfo, "Succ"); } else { //连接验证失败 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, InternalProtocolClientHelper.ConnectSvrFail(errCode, RegServerManager.Instance.m_SelfSvrInfo)); SvLogger.Info("OnNotifyConnectorSvr Fail: ServerType={0}, ServerName={1}, sessionID={2}, errCode={3}.", svrinfo.m_Type, svrinfo.m_Name, m_protoData.m_SessionID, errCode); InternalProtocolDealDelegate.Instance.OnConnectServerFail(svrinfo, ""); } }
public bool Connect() { CloseConnectionService(); try { m_connService = new ConnectService(OnRecvServerData, OnServerConnectionClose, OnOpenNewServerConnection, OnOpenConnectionWithSvrInfoFail); //m_connService.RegisterInternalProtocolDealer(InternalProtocolDealer.Instance.Parse); bool result = m_connService.Connect(m_ip, m_port); if (result == true) { SvLogger.Info("Start Connect : Address={0}, Port={1}", m_ip, m_port); return(true); } else { m_connService.Channel.Close(); m_connService = null; } return(false); } catch (Exception ex) { SvLogger.Fatal(ex, "OpenConnectionFail : IP={0}, Port={1}, ErrMsg={2}.", m_ip, m_port, ex.Message); } return(false); }
/// <summary> /// 打印协议缓存池中排队协议数 /// </summary> /// <returns></returns> public void ShowProtocolCountInPool() { //SvLogger.Info("*** ShowProtocolCountInPool Before Lock."); lock (m_cachePoolLock) { SvLogger.Info("### Protocol Count In Pool={0}.", m_cachePool.Count); } //SvLogger.Info("*** ShowProtocolCountInPool After Lock."); }
/// <summary> /// 初始化服务 /// </summary> /// <returns></returns> virtual public void InitInstance(string[] args) { //修改引用TITLE if (SvrCommCfg.Instance.ServerInfo.m_Name == "") { SvLogger.Error("ServerName cannot be empty."); } SvLogger.Info("ServerName = {0}.", SvrCommCfg.Instance.ServerInfo.m_Name); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { Process processes = Process.GetCurrentProcess(); PInvoker.SetConsoleTitle(GetAssemblyName() + " - " + processes.Id); SvrCommCfg.Instance.ProcessID = processes.Id; } }
/// <summary> /// 重新向CenterServer注册成功 /// </summary> /// <param name="svrInfo">CenterServer信息</param> public void OnReRegisterSvrOK(ref com.tieao.mmo.interval.PtServerInfo svrInfo) { SvLogger.Info("OnReRegisterSvrOK Begin : ServerType={0}, IP={1}, Port={2}.", svrInfo.m_Type, svrInfo.m_Address, svrInfo.m_Port); svrInfo.m_SessionID = m_protoData.m_SessionID; int errCode = RegServerManager.Instance.RegServer(ref svrInfo); if (errCode != 0) { SvLogger.Error(" RegServer Fail : errCode={0}.", errCode); } InternalProtocolDealDelegate.Instance.OnReregistServerSucc(svrInfo, errCode.ToString()); SvLogger.Info("OnConnectSvrSucc Done."); }
/// <summary> /// 打印协议平均等待时间 /// </summary> public void ShowProtocolWaitingTimeAverage() { //SvLogger.Info("*** ShowProtocolWaitingTimeAverage Before Lock."); lock (m_cachePoolLock) { int aveTime = 0; if (m_protoTotalCount != 0) { aveTime = m_protoTotalWaitTime / m_protoTotalCount; } SvLogger.Info("### Protocol Wait Time Average={0}.", aveTime); SvLogger.Info("### Protocol Count Deal This Minutes={0}.", m_protoTotalCount); m_protoTotalWaitTime = 0; m_protoTotalCount = 0; } //SvLogger.Info("*** ShowProtocolWaitingTimeAverage After Lock."); }
/// <summary> /// 有服务来注册 /// </summary> /// <param name="svrInfo">服务信息</param> /// <param name="sessionID"></param> public void OnRegisterSvr(ref com.tieao.mmo.interval.PtServerInfo svrInfo) { SvLogger.Info("OnRegisterSvr Begin: ServerType={0}, ServerName={1}, sessionID={2}.", svrInfo.m_Type, svrInfo.m_Name, m_protoData.m_SessionID); svrInfo.m_SessionID = m_protoData.m_SessionID; int errCode = RegServerManager.Instance.RegServer(ref svrInfo); if (errCode == 0) { ServerCommon.Network.NetworkManager.Instance.OnServerRegist(svrInfo); PtServerList connectSvrList = null; //注册成功 if (SvrCommCfg.Instance.ServerInfo.m_Type == eServerType.CENTER) { connectSvrList = RegServerManager.Instance.GetServerListWithout(ref svrInfo); } else { connectSvrList = new PtServerList(); } Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, InternalProtocolClientHelper.RegisterSvrOK(RegServerManager.Instance.m_SelfSvrInfo, connectSvrList)); SvLogger.Info("OnRegisterSvr OK: ServerType={0}, ServerName={1}, sessionID={2}.", svrInfo.m_Type, svrInfo.m_Name, m_protoData.m_SessionID); InternalProtocolDealDelegate.Instance.OnRegistServer(svrInfo, "Succ"); if (SvrCommCfg.Instance.ServerInfo.m_Type == eServerType.CENTER) { ByteArray sendData = InternalProtocolClientHelper.ReportServerID(SvrCommCfg.Instance.ServerInfo.m_ServerID); Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, sendData); } } else { //注册失败 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, InternalProtocolClientHelper.RegisterSvrFail(errCode, RegServerManager.Instance.m_SelfSvrInfo)); SvLogger.Info("OnRegisterSvr Fail: ServerType={0}, ServerName={1}, sessionID={2}, ErrCode={3}.", svrInfo.m_Type, svrInfo.m_Name, m_protoData.m_SessionID, errCode); InternalProtocolDealDelegate.Instance.OnRegistServer(svrInfo, "Fail"); } }
/// <summary> /// 连接服务器成功 /// </summary> /// <param name="svrinfo">服务器信息</param> /// <param name="sessionID"></param> public void OnConnectSvrSucc(ref com.tieao.mmo.interval.PtServerInfo svrinfo) { SvLogger.Info("OnConnectSvrSucc Begin : ServerType={0}, IP={1}, Port={2}.", svrinfo.m_Type, svrinfo.m_Address, svrinfo.m_Port); if (Network.NetworkManager.Instance.IsNeedRegistServer(svrinfo.m_Type)) { SvLogger.Info(" RegServer To {2} Server : IP={0}, Port={1}.", svrinfo.m_Address, svrinfo.m_Port, svrinfo.m_Type); if (Network.NetworkManager.Instance.HadRegistedServer(svrinfo.m_Type) == true) { //去重新注册 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, InternalProtocolServerHelper.ReRegisterSvr(SvrCommCfg.Instance.ServerInfo)); } else { //去注册 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, InternalProtocolServerHelper.RegisterSvr(SvrCommCfg.Instance.ServerInfo)); } } else { svrinfo.m_SessionID = m_protoData.m_SessionID; int errCode = RegServerManager.Instance.RegServer(ref svrinfo); if (errCode != 0) { SvLogger.Error(" RegServer Fail!"); } else { if (SvrCommCfg.Instance.ServerInfo.m_Type == eServerType.GAMEDATA && svrinfo.m_Type == eServerType.DATABASE) { //通知DBS可以发送数据过来 Network.NetworkManager.Instance.SendMessageToServer(m_protoData.m_SessionID, com.tieao.mmo.database4server.server.GDSUpdate2DBSServerHelper.RequestAllPlayerData()); } } } InternalProtocolDealDelegate.Instance.OnConnectServerSucc(svrinfo, ""); SvLogger.Info("OnConnectSvrSucc Done."); }
/// <summary> /// 初始化服务实例 /// </summary> /// <returns></returns> public override bool Init(string[] args) { if (base.Init(args) == false) { return(false); } #region 初始化服务配置 //初始化LOG日志配置 SvLogger.Init(XmlConfigure.Instance.GetAppConfigString("LogFile"), XmlConfigure.Instance.GetAppConfigString("LogFileLevel"), XmlConfigure.Instance.GetAppConfigString("LogConsoleLevel")); ServerConfigData.ListenPort = XmlConfigure.Instance.GetAppConfigInt("ListenPort"); ServerConfigData.DBIP = XmlConfigure.Instance.GetAppConfigString("DBIP"); ServerConfigData.DBPort = XmlConfigure.Instance.GetAppConfigInt("DBPort"); ServerConfigData.DBName = XmlConfigure.Instance.GetAppConfigString("DBName"); ServerConfigData.DBUser = XmlConfigure.Instance.GetAppConfigString("DBUser"); ServerConfigData.DBPassword = XmlConfigure.Instance.GetAppConfigString("DBPassword"); ServerConfigData.OSSPath = XmlConfigure.Instance.GetAppConfigString("OSSPath"); ServerConfigData.OSSUser = XmlConfigure.Instance.GetAppConfigString("OSSUser"); ServerConfigData.OSSPassword = XmlConfigure.Instance.GetAppConfigString("OSSPassword"); #endregion #region 网络组更新启动 try { SvLogger.Info("<< Start Network Listen : OutSidePort={0}.", ServerConfigData.ListenPort); ServerCommon.Network.XDNetworkManager.Instance.InitConfig(ServerConfigData.ListenPort); ServerCommon.Network.XDNetworkManager.Instance.StartRun(); } catch (Exception ex) { SvLogger.Fatal(ex, ">> ****** Network Listen Fail! Msg={0}", ex.Message); return(false); } SvLogger.Info(">> Network Listen Succ !!!"); #endregion #region 数据库连接 bool dbConnectBack = false; dbConnectBack = DBAccessCfg.Instance.InitDBConnection(eDbConnFlag.Game, ServerConfigData.DBIP, ServerConfigData.DBPort, ServerConfigData.DBName, ServerConfigData.DBUser, ServerConfigData.DBPassword); if (dbConnectBack == false) { SvLogger.Error("DB Access Config Deal Error!"); return(false); } #endregion #region 从数据库加载服务器组配置数据 //LoadDataFromMySqlManager.Instance.m_OnLoadAllTableSucc = onLoadConfigFromDBFinish; //LoadDataFromMySqlManager.Instance.LoadData(); #endregion return(true); }
/// <summary> /// 连接服务器失败 /// </summary> /// <param name="errcode">错误信息</param> /// <param name="svrinfo">连接的服务器信息</param> public void OnConnectSvrFail(int errcode, ref com.tieao.mmo.interval.PtServerInfo svrinfo) { InternalProtocolDealDelegate.Instance.OnConnectServerFail(svrinfo, ""); SvLogger.Info("OnConnectSvrFail : ServerType={0}, IP={1}, Port={2}, ErrCode={3}.", svrinfo.m_Type, svrinfo.m_Address, svrinfo.m_Port, errcode); }
/// <summary> /// 通知服务器关闭 /// </summary> /// <param name="param">关闭参数</param> /// <param name="sessionID"></param> public void OnShutDownSvr(string param) { //关闭服务 SvLogger.Info("OnShutDownSvr : param={0}", param); BasicService.RecvCenterServerCloseCommand(); }
/// <summary> /// 注册服务成功 /// </summary> /// <param name="svrinfo">注册服务信息</param> /// <param name="regedsvrlist">已经注册的服务信息列表</param> /// <param name="sessionID"></param> public void OnRegisterSvrOK(ref com.tieao.mmo.interval.PtServerInfo svrinfo, ref com.tieao.mmo.interval.PtServerList regedsvrlist) { SvLogger.Info("OnRegisterSvrOK Begin: ServerType={0}, ServerName={1}, RegedServerCount={2}, sessionID={3}.", svrinfo.m_Type, svrinfo.m_Name, regedsvrlist.GetElements().Count, m_protoData.m_SessionID); List <eServerType> connectSvrTypeList = new List <eServerType>(); svrinfo.m_SessionID = m_protoData.m_SessionID; int errCode = RegServerManager.Instance.RegServer(ref svrinfo); if (errCode != 0) { SvLogger.Error(" RegisterFail : ErrCode={0}.", errCode); InternalProtocolDealDelegate.Instance.OnRegistServerSucc(svrinfo, errCode.ToString()); } else { if (svrinfo.m_Type == eServerType.CENTER) { SvrCommCfg.Instance.ServerInfo.m_ServerID = svrinfo.m_ServerID; } switch (RegServerManager.Instance.m_SelfSvrInfo.m_Type) { case eServerType.GATEWAY: { connectSvrTypeList.Add(eServerType.GAME); connectSvrTypeList.Add(eServerType.WORLDBOSS); connectSvrTypeList.Add(eServerType.CHAT); //connectSvrTypeList.Add(eServerType.PUBLIC); } break; case eServerType.GAME: { connectSvrTypeList.Add(eServerType.GATEWAY); connectSvrTypeList.Add(eServerType.PUBLIC); connectSvrTypeList.Add(eServerType.GAMEDATA); connectSvrTypeList.Add(eServerType.RANK); connectSvrTypeList.Add(eServerType.LOG); connectSvrTypeList.Add(eServerType.WORLDBOSS); connectSvrTypeList.Add(eServerType.CHAT); } break; case eServerType.CENTER: { } break; case eServerType.GAMEDATA: { connectSvrTypeList.Add(eServerType.GAME); connectSvrTypeList.Add(eServerType.PUBLIC); connectSvrTypeList.Add(eServerType.DATABASE); connectSvrTypeList.Add(eServerType.LOG); connectSvrTypeList.Add(eServerType.WORLDBOSS); connectSvrTypeList.Add(eServerType.CHAT); } break; case eServerType.PUBLIC: { //connectSvrTypeList.Add(eServerType.GATEWAY); connectSvrTypeList.Add(eServerType.GAME); connectSvrTypeList.Add(eServerType.GAMEDATA); connectSvrTypeList.Add(eServerType.DATABASE); connectSvrTypeList.Add(eServerType.RANK); connectSvrTypeList.Add(eServerType.WORLDBOSS); connectSvrTypeList.Add(eServerType.LOG); connectSvrTypeList.Add(eServerType.CHAT); } break; case eServerType.DATABASE: { connectSvrTypeList.Add(eServerType.PUBLIC); connectSvrTypeList.Add(eServerType.GAMEDATA); connectSvrTypeList.Add(eServerType.LOG); } break; case eServerType.RANK: { connectSvrTypeList.Add(eServerType.GAME); connectSvrTypeList.Add(eServerType.PUBLIC); } break; case eServerType.LOG: { connectSvrTypeList.Add(eServerType.GAME); connectSvrTypeList.Add(eServerType.GAMEDATA); connectSvrTypeList.Add(eServerType.PUBLIC); connectSvrTypeList.Add(eServerType.DATABASE); connectSvrTypeList.Add(eServerType.CHAT); } break; case eServerType.CROSSREALM: break; case eServerType.CROSSREALM_BATTLE: break; case eServerType.PROTAL: break; case eServerType.MONITEORNODE: break; case eServerType.GM: break; case eServerType.PLATFORM_DOCKING: break; case eServerType.MONITEORSERVER: break; case eServerType.WORLDBOSS: { connectSvrTypeList.Add(eServerType.GATEWAY); connectSvrTypeList.Add(eServerType.GAME); connectSvrTypeList.Add(eServerType.GAMEDATA); connectSvrTypeList.Add(eServerType.PUBLIC); connectSvrTypeList.Add(eServerType.LOG); connectSvrTypeList.Add(eServerType.CHAT); } break; case eServerType.CHAT: { connectSvrTypeList.Add(eServerType.GATEWAY); connectSvrTypeList.Add(eServerType.GAME); connectSvrTypeList.Add(eServerType.GAMEDATA); connectSvrTypeList.Add(eServerType.LOG); connectSvrTypeList.Add(eServerType.PUBLIC); connectSvrTypeList.Add(eServerType.WORLDBOSS); } break; case eServerType.COMMANDSENDER: { connectSvrTypeList.Add(eServerType.DATABASE); connectSvrTypeList.Add(eServerType.GAMEDATA); connectSvrTypeList.Add(eServerType.GAME); connectSvrTypeList.Add(eServerType.PUBLIC); connectSvrTypeList.Add(eServerType.RANK); connectSvrTypeList.Add(eServerType.GATEWAY); connectSvrTypeList.Add(eServerType.CHAT); connectSvrTypeList.Add(eServerType.WORLDBOSS); } break; case eServerType.UNKNOW: SvLogger.Error(" This Server Type Unknow!"); break; } for (int i = 0; i < regedsvrlist.GetElements().Count; ++i) { if (connectSvrTypeList.Contains(regedsvrlist.GetElements()[i].m_Type)) { bool result = Network.NetworkManager.Instance.OpenRegServerConnection(regedsvrlist.GetElements()[i]); if (result == true) { SvLogger.Info(" Start To Connect Server : ServerType={0}, IP={1}, Port={2}.", regedsvrlist.GetElements()[i].m_Type.ToString(), regedsvrlist.GetElements()[i].m_Address, regedsvrlist.GetElements()[i].m_Port); } else { SvLogger.Error(" Connect To Server Fail : ServerType={0}, IP={1}, Port={2}.", regedsvrlist.GetElements()[i].m_Type.ToString(), regedsvrlist.GetElements()[i].m_Address, regedsvrlist.GetElements()[i].m_Port); } } } if (Network.NetworkManager.Instance.IsNeedRegistServer(svrinfo.m_Type)) { Network.NetworkManager.Instance.RegistToServerSucc(m_protoData.m_SessionID, ref svrinfo); } InternalProtocolDealDelegate.Instance.OnRegistServerSucc(svrinfo, "0"); } SvLogger.Info("OnRegisterSvrOK Done: ServerType={0}, ServerName={1}, NeedConnectServerCount={2}, sessionID={3}.", svrinfo.m_Type, svrinfo.m_Name, connectSvrTypeList.Count, m_protoData.m_SessionID); }