SessionIdleCheckComponent.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. namespace ET
  2. {
  3. [ObjectSystem]
  4. public class SessionIdleCheckerComponentAwakeSystem : AwakeSystem<SessionIdleCheckerComponent, int, int, int>
  5. {
  6. public override void Awake(SessionIdleCheckerComponent self, int checkInteral, int recvMaxIdleTime, int sendMaxIdleTime)
  7. {
  8. self.CheckInterval = checkInteral;
  9. self.RecvMaxIdleTime = recvMaxIdleTime;
  10. self.SendMaxIdleTime = sendMaxIdleTime;
  11. self.RepeatedTimer = TimerComponent.Instance.NewRepeatedTimer(checkInteral, self.Check);
  12. }
  13. }
  14. [ObjectSystem]
  15. public class SessionIdleCheckerComponentLoadSystem : LoadSystem<SessionIdleCheckerComponent>
  16. {
  17. public override void Load(SessionIdleCheckerComponent self)
  18. {
  19. RepeatedTimer repeatedTimer = TimerComponent.Instance.GetRepeatedTimer(self.RepeatedTimer);
  20. if (repeatedTimer != null)
  21. {
  22. repeatedTimer.Callback = (isTimeout) =>
  23. {
  24. self.Check();
  25. };
  26. }
  27. }
  28. }
  29. [ObjectSystem]
  30. public class SessionIdleCheckerComponentDestroySystem : DestroySystem<SessionIdleCheckerComponent>
  31. {
  32. public override void Destroy(SessionIdleCheckerComponent self)
  33. {
  34. self.CheckInterval = 0;
  35. self.RecvMaxIdleTime = 0;
  36. self.SendMaxIdleTime = 0;
  37. TimerComponent.Instance.Remove(self.RepeatedTimer);
  38. self.RepeatedTimer = 0;
  39. }
  40. }
  41. public static class SessionIdleCheckerComponentSystem
  42. {
  43. public static void Check(this SessionIdleCheckerComponent self)
  44. {
  45. Session session = self.GetParent<Session>();
  46. long timeNow = TimeHelper.Now();
  47. if (timeNow - session.LastRecvTime < self.RecvMaxIdleTime && timeNow - session.LastSendTime < self.SendMaxIdleTime)
  48. {
  49. return;
  50. }
  51. session.Error = ErrorCode.ERR_SessionSendOrRecvTimeout;
  52. session.Dispose();
  53. }
  54. }
  55. public class SessionIdleCheckerComponent: Entity
  56. {
  57. public int CheckInterval;
  58. public int RecvMaxIdleTime;
  59. public int SendMaxIdleTime;
  60. public long RepeatedTimer;
  61. }
  62. }