public static async ETTask Login(Scene clientScene, string account, string password) { try { // 创建一个ETModel层的Session R2C_Login r2CLogin; Session session = null; try { clientScene.RemoveComponent <RouterAddressComponent>(); // 获取路由跟realmDispatcher地址 RouterAddressComponent routerAddressComponent = clientScene.GetComponent <RouterAddressComponent>(); if (routerAddressComponent == null) { routerAddressComponent = clientScene.AddComponent <RouterAddressComponent, string, int>(ConstValue.RouterHttpHost, ConstValue.RouterHttpPort); await routerAddressComponent.Init(); clientScene.AddComponent <NetKcpComponent, AddressFamily, int>(routerAddressComponent.RouterManagerIPAddress.AddressFamily, CallbackType.SessionStreamDispatcherClientOuter); } IPEndPoint realmAddress = routerAddressComponent.GetRealmAddress(account); session = await RouterHelper.CreateRouterSession(clientScene, realmAddress); { r2CLogin = (R2C_Login)await session.Call(new C2R_Login() { Account = account, Password = password }); } } finally { session?.Dispose(); } // 创建一个gate Session,并且保存到SessionComponent中 Session gateSession = await RouterHelper.CreateRouterSession(clientScene, NetworkHelper.ToIPEndPoint(r2CLogin.Address)); clientScene.AddComponent <SessionComponent>().Session = gateSession; G2C_LoginGate g2CLoginGate = (G2C_LoginGate)await gateSession.Call( new C2G_LoginGate() { Key = r2CLogin.Key, GateId = r2CLogin.GateId }); Log.Debug("登陆gate成功!"); await Game.EventSystem.PublishAsync(clientScene, new EventType.LoginFinish()); } catch (Exception e) { Log.Error(e); } }
private static async ETTask CheckAsync(RouterCheckComponent self) { Session session = self.GetParent <Session>(); long instanceId = self.InstanceId; while (true) { if (self.InstanceId != instanceId) { return; } await TimerComponent.Instance.WaitAsync(1000); if (self.InstanceId != instanceId) { return; } long time = TimeHelper.ClientFrameTime(); if (time - session.LastRecvTime < 7 * 1000) { continue; } try { long sessionId = session.Id; uint localConn = 0; uint remoteConn = 0; KService service = session.AService as KService; KChannel kChannel = service.Get(sessionId); if (kChannel == null) { Log.Warning($"not found remoteConn: {sessionId}"); continue; } localConn = kChannel.LocalConn; remoteConn = kChannel.RemoteConn; IPEndPoint realAddress = self.GetParent <Session>().RemoteAddress; Log.Info($"get recvLocalConn start: {self.ClientScene().Id} {realAddress} {localConn} {remoteConn}"); (uint recvLocalConn, IPEndPoint routerAddress) = await RouterHelper.GetRouterAddress(self.ClientScene(), realAddress, localConn, remoteConn); if (recvLocalConn == 0) { Log.Error($"get recvLocalConn fail: {self.ClientScene().Id} {routerAddress} {realAddress} {localConn} {remoteConn}"); continue; } Log.Info($"get recvLocalConn ok: {self.ClientScene().Id} {routerAddress} {realAddress} {recvLocalConn} {localConn} {remoteConn}"); session.LastRecvTime = TimeHelper.ClientNow(); ((KService)session.AService).ChangeAddress(sessionId, routerAddress); } catch (Exception e) { Log.Error(e); } } }