RouterAddressComponentSystem.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Runtime.InteropServices;
  6. namespace ET.Client
  7. {
  8. [FriendOf(typeof(RouterAddressComponent))]
  9. public static class RouterAddressComponentSystem
  10. {
  11. public class RouterAddressComponentAwakeSystem: AwakeSystem<RouterAddressComponent, string, int>
  12. {
  13. protected override void Awake(RouterAddressComponent self, string address, int port)
  14. {
  15. self.RouterManagerHost = address;
  16. self.RouterManagerPort = port;
  17. }
  18. }
  19. public static async ETTask Init(this RouterAddressComponent self)
  20. {
  21. self.AddressFamily = NetworkHelper.GetAddressFamily(self.RouterManagerHost);
  22. await self.GetAllRouter();
  23. }
  24. private static async ETTask GetAllRouter(this RouterAddressComponent self)
  25. {
  26. string url = $"http://{self.RouterManagerHost}:{self.RouterManagerPort}/get_router?v={RandomHelper.RandUInt32()}";
  27. Log.Debug($"start get router info: {url}");
  28. string routerInfo = await HttpClientHelper.Get(url);
  29. Log.Debug($"recv router info: {routerInfo}");
  30. HttpGetRouterResponse httpGetRouterResponse = JsonHelper.FromJson<HttpGetRouterResponse>(routerInfo);
  31. self.Info = httpGetRouterResponse;
  32. Log.Debug($"start get router info finish: {JsonHelper.ToJson(httpGetRouterResponse)}");
  33. // 打乱顺序
  34. RandomHelper.BreakRank(self.Info.Routers);
  35. self.WaitTenMinGetAllRouter().Coroutine();
  36. }
  37. // 等10分钟再获取一次
  38. public static async ETTask WaitTenMinGetAllRouter(this RouterAddressComponent self)
  39. {
  40. await TimerComponent.Instance.WaitAsync(5 * 60 * 1000);
  41. if (self.IsDisposed)
  42. {
  43. return;
  44. }
  45. await self.GetAllRouter();
  46. }
  47. public static string GetAddress(this RouterAddressComponent self)
  48. {
  49. if (self.Info.Routers.Count == 0)
  50. {
  51. return null;
  52. }
  53. return self.Info.Routers[self.RouterIndex++ % self.Info.Routers.Count];
  54. }
  55. public static string GetRealmAddress(this RouterAddressComponent self, string account)
  56. {
  57. int v = account.Mode(self.Info.Realms.Count);
  58. return self.Info.Realms[v];
  59. }
  60. }
  61. }