////////////////////////////////////////////////////////////////////////// // // 文件:Assets/Code/Scripts/Gameplay/Net/Client/NetManager.cs // 作者:Xoen Xie // 时间:2023/07/18 // 描述:网络管理 // 说明: // ////////////////////////////////////////////////////////////////////////// using System; using Framework; using PhxhSDK; using UnityEngine; namespace Gameplay.Net { public sealed class NetManager : Singlenton, IUpdatable, IInitable { public NetClient mClient { get; private set; } private uint m_nClientID; private IMessage []m_MessagePool; public RC4Cipher Rc4Cipher { get; private set; } public void Init() { DebugUtil.Log("NetManager Init start"); InitPools(); m_nClientID = 1; } public void Release() { DebugUtil.Log("NetManager Release start"); CloseClient(); } public void CloseClient() { if (mClient != null) { mClient.Release(); mClient = null; } } public NetClient CreateNetClient(string sIP, int nPort) { if (mClient != null) { DebugUtil.Log("CreateNetClient mClient.Release"); mClient.Release(); } mClient = new NetClient(); mClient.mID = m_nClientID++; if (!mClient.Create(sIP, nPort)) { mClient.Release(); mClient = null; } mClient.Connect(); DebugUtil.Log("IP: " + sIP + " Port: " + nPort); return mClient; } public void SendMessage(IMessage message) { if (mClient == null) { DebugUtil.LogWarning("NetManager.SendMessage mClient == null, message={0}", message.ID); return; } mClient.SendMessage(message); } public void Update(float deltaTime) { if (mClient != null) mClient.Update(); } private void InitPools() { m_MessagePool = new IMessage[(int)NLDMID.MSGID.Max]; // MESSAGE_START m_MessagePool[(int)NLDMID.MSGID.CltGtHandshake] = new MSG_Clt_Gt_Handshake(); m_MessagePool[(int)NLDMID.MSGID.GtCltHandshake] = new MSG_Gt_Clt_Handshake(); m_MessagePool[(int)NLDMID.MSGID.CltGtHeartbeat] = new MSG_Clt_Gt_Heartbeat(); m_MessagePool[(int)NLDMID.MSGID.GtCltHeartbeat] = new MSG_Gt_Clt_Heartbeat(); m_MessagePool[(int)NLDMID.MSGID.GtCltDisconnect] = new MSG_Gt_Clt_Disconnect(); m_MessagePool[(int)NLDMID.MSGID.CltLLogin] = new MSG_Clt_L_Login(); m_MessagePool[(int)NLDMID.MSGID.LCltLoginResult] = new MSG_L_Clt_LoginResult(); m_MessagePool[(int)NLDMID.MSGID.GCltLoginResult] = new MSG_G_Clt_LoginResult(); m_MessagePool[(int)NLDMID.MSGID.GCltOpResult] = new MSG_G_Clt_OpResult(); m_MessagePool[(int)NLDMID.MSGID.GCltActorBase] = new MSG_G_Clt_ActorBase(); m_MessagePool[(int)NLDMID.MSGID.GCltActorItem] = new MSG_G_Clt_ActorItem(); m_MessagePool[(int)NLDMID.MSGID.GCltActorCharacter] = new MSG_G_Clt_ActorCharacter(); m_MessagePool[(int)NLDMID.MSGID.CltGCharacterUpgrade] = new MSG_Clt_G_CharacterUpgrade(); m_MessagePool[(int)NLDMID.MSGID.GCltActorLogic] = new MSG_G_Clt_ActorLogic(); m_MessagePool[(int)NLDMID.MSGID.GCltActorTask] = new MSG_G_Clt_ActorTask(); m_MessagePool[(int)NLDMID.MSGID.CltGSetNickname] = new MSG_Clt_G_SetNickname(); m_MessagePool[(int)NLDMID.MSGID.GCltActorLevel] = new MSG_G_Clt_ActorLevel(); m_MessagePool[(int)NLDMID.MSGID.CltGEnterLevel] = new MSG_Clt_G_EnterLevel(); m_MessagePool[(int)NLDMID.MSGID.CltGExitLevel] = new MSG_Clt_G_ExitLevel(); m_MessagePool[(int)NLDMID.MSGID.GCltActorRaffle] = new MSG_G_Clt_ActorRaffle(); m_MessagePool[(int)NLDMID.MSGID.CltGRaffle] = new MSG_Clt_G_Raffle(); m_MessagePool[(int)NLDMID.MSGID.GCltItemList] = new MSG_G_Clt_ItemList(); m_MessagePool[(int)NLDMID.MSGID.CltGGroupReward] = new MSG_Clt_G_GroupReward(); m_MessagePool[(int)NLDMID.MSGID.CltGVehicleUpgrade] = new MSG_Clt_G_VehicleUpgrade(); m_MessagePool[(int)NLDMID.MSGID.GCltActorTeam] = new MSG_G_Clt_ActorTeam(); m_MessagePool[(int)NLDMID.MSGID.CltGCreateTeam] = new MSG_Clt_G_CreateTeam(); m_MessagePool[(int)NLDMID.MSGID.CltGUseItem] = new MSG_Clt_G_UseItem(); m_MessagePool[(int)NLDMID.MSGID.CltGTestInit] = new MSG_Clt_G_TestInit(); m_MessagePool[(int)NLDMID.MSGID.CltGGiftCode] = new MSG_Clt_G_GiftCode(); m_MessagePool[(int)NLDMID.MSGID.MlCltMailInfo] = new MSG_Ml_Clt_MailInfo(); m_MessagePool[(int)NLDMID.MSGID.CltMlMailRequest] = new MSG_Clt_Ml_MailRequest(); m_MessagePool[(int)NLDMID.MSGID.MlCltMailData] = new MSG_Ml_Clt_MailData(); m_MessagePool[(int)NLDMID.MSGID.CltMlOpenMail] = new MSG_Clt_Ml_OpenMail(); m_MessagePool[(int)NLDMID.MSGID.MlCltNewGlobalMail] = new MSG_Ml_Clt_NewGlobalMail(); m_MessagePool[(int)NLDMID.MSGID.GCltLoginKey] = new MSG_G_Clt_LoginKey(); m_MessagePool[(int)NLDMID.MSGID.CltGRelogin] = new MSG_Clt_G_Relogin(); m_MessagePool[(int)NLDMID.MSGID.CltMlClaimMailItems] = new MSG_Clt_Ml_ClaimMailItems(); m_MessagePool[(int)NLDMID.MSGID.CltMlDeleteMail] = new MSG_Clt_Ml_DeleteMail(); m_MessagePool[(int)NLDMID.MSGID.CltGTaskClaim] = new MSG_Clt_G_TaskClaim(); m_MessagePool[(int)NLDMID.MSGID.CltGGetShopContent] = new MSG_Clt_G_GetShopContent(); m_MessagePool[(int)NLDMID.MSGID.GCltShopDatas] = new MSG_G_Clt_ShopDatas(); m_MessagePool[(int)NLDMID.MSGID.CltGShopPurchase] = new MSG_Clt_G_ShopPurchase(); m_MessagePool[(int)NLDMID.MSGID.GCltActorPlayerSkill] = new MSG_G_Clt_ActorPlayerSkill(); m_MessagePool[(int)NLDMID.MSGID.CltGPlayerSkillUpgrade] = new MSG_Clt_G_PlayerSkillUpgrade(); m_MessagePool[(int)NLDMID.MSGID.CltGSetDefenceTeamForPvp] = new MSG_Clt_G_SetDefenceTeamForPvp(); m_MessagePool[(int)NLDMID.MSGID.CltMgPvpInformation] = new MSG_Clt_Mg_PvpInformation(); m_MessagePool[(int)NLDMID.MSGID.GCltPvpInformation] = new MSG_G_Clt_PvpInformation(); m_MessagePool[(int)NLDMID.MSGID.CltGPvpStart] = new MSG_Clt_G_PvpStart(); m_MessagePool[(int)NLDMID.MSGID.CltGPvpResult] = new MSG_Clt_G_PvpResult(); m_MessagePool[(int)NLDMID.MSGID.GCltActorPvp] = new MSG_G_Clt_ActorPvp(); m_MessagePool[(int)NLDMID.MSGID.GCltPvpDefenceData] = new MSG_G_Clt_PvpDefenceData(); m_MessagePool[(int)NLDMID.MSGID.CltMgPvpOrderList] = new MSG_Clt_Mg_PvpOrderList(); m_MessagePool[(int)NLDMID.MSGID.MgCltPvpOrderListData] = new MSG_Mg_Clt_PvpOrderListData(); m_MessagePool[(int)NLDMID.MSGID.CltGPatioExchange] = new MSG_Clt_G_PatioExchange(); m_MessagePool[(int)NLDMID.MSGID.CltGInAppPurchase] = new MSG_Clt_G_InAppPurchase(); m_MessagePool[(int)NLDMID.MSGID.GCltActorPurchase] = new MSG_G_Clt_ActorPurchase(); m_MessagePool[(int)NLDMID.MSGID.CltGExchangeItem] = new MSG_Clt_G_ExchangeItem(); m_MessagePool[(int)NLDMID.MSGID.CltGNewGuideProgress] = new MSG_Clt_G_NewGuideProgress(); m_MessagePool[(int)NLDMID.MSGID.CltGSetHeadicon] = new MSG_Clt_G_SetHeadicon(); m_MessagePool[(int)NLDMID.MSGID.CltGBuyAlbum] = new MSG_Clt_G_BuyAlbum(); m_MessagePool[(int)NLDMID.MSGID.CltGAdultAuth] = new MSG_Clt_G_AdultAuth(); m_MessagePool[(int)NLDMID.MSGID.CltGLevelSweep] = new MSG_Clt_G_LevelSweep(); m_MessagePool[(int)NLDMID.MSGID.GCltHorseLight] = new MSG_G_Clt_HorseLight(); m_MessagePool[(int)NLDMID.MSGID.CltGSetActorBase] = new MSG_Clt_G_SetActorBase(); m_MessagePool[(int)NLDMID.MSGID.CltGStringCheck] = new MSG_Clt_G_StringCheck(); m_MessagePool[(int)NLDMID.MSGID.CltGInAppPurchaseTest] = new MSG_Clt_G_InAppPurchaseTest(); m_MessagePool[(int)NLDMID.MSGID.CltGVehicleDevelopment] = new MSG_Clt_G_VehicleDevelopment(); m_MessagePool[(int)NLDMID.MSGID.CltGVehicleBuyPaint] = new MSG_Clt_G_VehicleBuyPaint(); m_MessagePool[(int)NLDMID.MSGID.CltGVehicleSetPaint] = new MSG_Clt_G_VehicleSetPaint(); m_MessagePool[(int)NLDMID.MSGID.LCltNldToken] = new MSG_L_Clt_NldToken(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionList] = new MSG_Clt_Lg_LegionList(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionListData] = new MSG_Lg_Clt_LegionListData(); m_MessagePool[(int)NLDMID.MSGID.CltLgCreateLegion] = new MSG_Clt_Lg_CreateLegion(); m_MessagePool[(int)NLDMID.MSGID.CltLgUpdateLegion] = new MSG_Clt_Lg_UpdateLegion(); m_MessagePool[(int)NLDMID.MSGID.CltLgJoinLegion] = new MSG_Clt_Lg_JoinLegion(); m_MessagePool[(int)NLDMID.MSGID.CltLgExamineJoinLegion] = new MSG_Clt_Lg_ExamineJoinLegion(); m_MessagePool[(int)NLDMID.MSGID.CltLgQuitLegion] = new MSG_Clt_Lg_QuitLegion(); m_MessagePool[(int)NLDMID.MSGID.CltLgUpdateMember] = new MSG_Clt_Lg_UpdateMember(); m_MessagePool[(int)NLDMID.MSGID.CltLgDismissMember] = new MSG_Clt_Lg_DismissMember(); m_MessagePool[(int)NLDMID.MSGID.CltLgGetMyLegionInfo] = new MSG_Clt_Lg_GetMyLegionInfo(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionBase] = new MSG_Lg_Clt_LegionBase(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionMember] = new MSG_Lg_Clt_LegionMember(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionLog] = new MSG_Lg_Clt_LegionLog(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionApply] = new MSG_Lg_Clt_LegionApply(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionPart] = new MSG_Clt_Lg_LegionPart(); m_MessagePool[(int)NLDMID.MSGID.CltGCheckCharacter] = new MSG_Clt_G_CheckCharacter(); m_MessagePool[(int)NLDMID.MSGID.GCltActorLegion] = new MSG_G_Clt_ActorLegion(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionBattleSignUp] = new MSG_Clt_Lg_LegionBattleSignUp(); m_MessagePool[(int)NLDMID.MSGID.CltGBattlePassReward] = new MSG_Clt_G_BattlePassReward(); m_MessagePool[(int)NLDMID.MSGID.CltBEnterLegionBattlefield] = new MSG_Clt_B_EnterLegionBattlefield(); m_MessagePool[(int)NLDMID.MSGID.CltGBuyBattlePassLevel] = new MSG_Clt_G_BuyBattlePassLevel(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldInfo] = new MSG_B_Clt_LegionBattlefieldInfo(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefield] = new MSG_B_Clt_LegionBattlefield(); m_MessagePool[(int)NLDMID.MSGID.LgCltJoinedLegion] = new MSG_Lg_Clt_JoinedLegion(); m_MessagePool[(int)NLDMID.MSGID.LgCltLoseLegion] = new MSG_Lg_Clt_LoseLegion(); m_MessagePool[(int)NLDMID.MSGID.CltBEnterLegionBattlefieldOk] = new MSG_Clt_B_EnterLegionBattlefieldOk(); m_MessagePool[(int)NLDMID.MSGID.CltBLegionBattleCommand] = new MSG_Clt_B_LegionBattleCommand(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldBuilding] = new MSG_B_Clt_LegionBattlefieldBuilding(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldActor] = new MSG_B_Clt_LegionBattlefieldActor(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldActorUpdate] = new MSG_B_Clt_LegionBattlefieldActorUpdate(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldActorCommand] = new MSG_B_Clt_LegionBattlefieldActorCommand(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldCombatStart] = new MSG_B_Clt_LegionBattlefieldCombatStart(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldCombatEnd] = new MSG_B_Clt_LegionBattlefieldCombatEnd(); m_MessagePool[(int)NLDMID.MSGID.CltBLegionBattleCaptainOrder] = new MSG_Clt_B_LegionBattleCaptainOrder(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattleCaptainOrder] = new MSG_B_Clt_LegionBattleCaptainOrder(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldBuildingUpdate] = new MSG_B_Clt_LegionBattlefieldBuildingUpdate(); m_MessagePool[(int)NLDMID.MSGID.CltBLegionBattleLog] = new MSG_Clt_B_LegionBattleLog(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattleLog] = new MSG_B_Clt_LegionBattleLog(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionPostHiring] = new MSG_Clt_Lg_LegionPostHiring(); m_MessagePool[(int)NLDMID.MSGID.CltLgMercenarySignUp] = new MSG_Clt_Lg_MercenarySignUp(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionMercenaryApply] = new MSG_Clt_Lg_LegionMercenaryApply(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionMercenaryApprove] = new MSG_Clt_Lg_LegionMercenaryApprove(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionMercenaryHire] = new MSG_Clt_Lg_LegionMercenaryHire(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionMercenaryHireDatas] = new MSG_Clt_Lg_LegionMercenaryHireDatas(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionMercenaryHireDatas] = new MSG_Lg_Clt_LegionMercenaryHireDatas(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionMercenarySignUpDatas] = new MSG_Clt_Lg_LegionMercenarySignUpDatas(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionMercenarySignUpDatas] = new MSG_Lg_Clt_LegionMercenarySignUpDatas(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattleStatus] = new MSG_B_Clt_LegionBattleStatus(); m_MessagePool[(int)NLDMID.MSGID.CltBExitLegionBattlefield] = new MSG_Clt_B_ExitLegionBattlefield(); m_MessagePool[(int)NLDMID.MSGID.CltBGetLegionBattleTeams] = new MSG_Clt_B_GetLegionBattleTeams(); m_MessagePool[(int)NLDMID.MSGID.BCltGetLegionBattleTeams] = new MSG_B_Clt_GetLegionBattleTeams(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionMercenarySearch] = new MSG_Clt_Lg_LegionMercenarySearch(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionMercenarySearch] = new MSG_Lg_Clt_LegionMercenarySearch(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionMercenaryActor] = new MSG_Lg_Clt_LegionMercenaryActor(); m_MessagePool[(int)NLDMID.MSGID.CltGRefreshShop] = new MSG_Clt_G_RefreshShop(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattleEnd] = new MSG_B_Clt_LegionBattleEnd(); m_MessagePool[(int)NLDMID.MSGID.CltGClaimMonthlyPassReward] = new MSG_Clt_G_ClaimMonthlyPassReward(); m_MessagePool[(int)NLDMID.MSGID.CltLgLegionMercenaryDatas] = new MSG_Clt_Lg_LegionMercenaryDatas(); m_MessagePool[(int)NLDMID.MSGID.LgCltLegionMercenaryDatas] = new MSG_Lg_Clt_LegionMercenaryDatas(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldHexes] = new MSG_B_Clt_LegionBattlefieldHexes(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionCombatRecords] = new MSG_B_Clt_LegionCombatRecords(); m_MessagePool[(int)NLDMID.MSGID.CltGSign] = new MSG_Clt_G_Sign(); m_MessagePool[(int)NLDMID.MSGID.CltBSetLegionBattleTeamLock] = new MSG_Clt_B_SetLegionBattleTeamLock(); m_MessagePool[(int)NLDMID.MSGID.CltBSelectLegionBattleTeam] = new MSG_Clt_B_SelectLegionBattleTeam(); m_MessagePool[(int)NLDMID.MSGID.BCltLegionBattlefieldBuildingScore] = new MSG_B_Clt_LegionBattlefieldBuildingScore(); // MESSAGE_END } public IMessage GetMessage(NLDMID.MSGID id) { return m_MessagePool[(int)id]; } // 服务器当前时间戳:毫秒 public ulong ServerTimeMS { get { return m_ServerTimeStart + (PhxhSDK.Utils.GetTimeStampMilliseconds() - m_ClientTimeStart); } } // 服务器当前时间戳:秒 public uint ServerTime { get { return (uint)(ServerTimeMS / 1000); } } // 服务器发送心跳的时间 private ulong m_ServerTimeStart; // 服务器发送心跳时,客户端的时间 private ulong m_ClientTimeStart; // 消息从客户端 ——> 服务器 -->客户端的总时间的一半 public uint RTT { get; private set; } public void SetTime(ulong clientTime, ulong serverTime) { m_ServerTimeStart = serverTime; // 服务器回复心跳的时间 ulong current = PhxhSDK.Utils.GetTimeStampMilliseconds(); ulong timePass = current - clientTime; RTT = (uint)(timePass / 2); m_ClientTimeStart = current - RTT; } } }