NetClientComponentSystem.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System.Net;
  2. using System.Net.Sockets;
  3. namespace ET.Client
  4. {
  5. [FriendOf(typeof(NetClientComponent))]
  6. public static class NetClientComponentSystem
  7. {
  8. [ObjectSystem]
  9. public class AwakeSystem: AwakeSystem<NetClientComponent, AddressFamily>
  10. {
  11. protected override void Awake(NetClientComponent self, AddressFamily addressFamily)
  12. {
  13. self.ServiceId = NetServices.Instance.AddService(new KService(addressFamily, ServiceType.Outer));
  14. NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
  15. NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);
  16. }
  17. }
  18. [ObjectSystem]
  19. public class DestroySystem: DestroySystem<NetClientComponent>
  20. {
  21. protected override void Destroy(NetClientComponent self)
  22. {
  23. NetServices.Instance.RemoveService(self.ServiceId);
  24. }
  25. }
  26. private static void OnRead(this NetClientComponent self, long channelId, long actorId, object message)
  27. {
  28. Session session = self.GetChild<Session>(channelId);
  29. if (session == null)
  30. {
  31. return;
  32. }
  33. session.LastRecvTime = TimeHelper.ClientNow();
  34. OpcodeHelper.LogMsg(self.DomainZone(), message);
  35. EventSystem.Instance.Publish(NetClientComponentOnRead.Clone(session, message));
  36. }
  37. private static void OnError(this NetClientComponent self, long channelId, int error)
  38. {
  39. Session session = self.GetChild<Session>(channelId);
  40. if (session == null)
  41. {
  42. return;
  43. }
  44. session.Error = error;
  45. session.Dispose();
  46. }
  47. public static Session Create(this NetClientComponent self, IPEndPoint realIPEndPoint)
  48. {
  49. long channelId = NetServices.Instance.CreateConnectChannelId();
  50. Session session = self.AddChildWithId<Session, int>(channelId, self.ServiceId);
  51. session.RemoteAddress = realIPEndPoint;
  52. #if !UNITY
  53. if (self.DomainScene().SceneType != SceneType.Benchmark)
  54. {
  55. session.AddComponent<SessionIdleCheckerComponent>();
  56. }
  57. #endif
  58. NetServices.Instance.CreateChannel(self.ServiceId, session.Id, realIPEndPoint);
  59. return session;
  60. }
  61. public static Session Create(this NetClientComponent self, IPEndPoint routerIPEndPoint, IPEndPoint realIPEndPoint, uint localConn)
  62. {
  63. long channelId = localConn;
  64. Session session = self.AddChildWithId<Session, int>(channelId, self.ServiceId);
  65. session.RemoteAddress = realIPEndPoint;
  66. #if !UNITY
  67. if (self.DomainScene().SceneType != SceneType.Benchmark)
  68. {
  69. session.AddComponent<SessionIdleCheckerComponent>();
  70. }
  71. #endif
  72. NetServices.Instance.CreateChannel(self.ServiceId, session.Id, routerIPEndPoint);
  73. return session;
  74. }
  75. }
  76. }