NetClientComponentSystem.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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(Root.Instance.Scene, new NetClientComponentOnRead() {Session = session, Message = 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 (self.DomainScene().SceneType != SceneType.Benchmark)
  53. {
  54. session.AddComponent<SessionIdleCheckerComponent>();
  55. }
  56. NetServices.Instance.CreateChannel(self.ServiceId, session.Id, realIPEndPoint);
  57. return session;
  58. }
  59. public static Session Create(this NetClientComponent self, IPEndPoint routerIPEndPoint, IPEndPoint realIPEndPoint, uint localConn)
  60. {
  61. long channelId = localConn;
  62. Session session = self.AddChildWithId<Session, int>(channelId, self.ServiceId);
  63. session.RemoteAddress = realIPEndPoint;
  64. if (self.DomainScene().SceneType != SceneType.Benchmark)
  65. {
  66. session.AddComponent<SessionIdleCheckerComponent>();
  67. }
  68. NetServices.Instance.CreateChannel(self.ServiceId, session.Id, routerIPEndPoint);
  69. return session;
  70. }
  71. }
  72. }