Browse Source

修改ping系统,将ping包嵌入到idleCheck系统中,不抢占繁忙时的session通信

johnclot69 1 year ago
parent
commit
cb1ff4f2f8

+ 7 - 2
DotNet/Hotfix/Module/Message/NetServerComponentSystem.cs

@@ -48,8 +48,13 @@ namespace ET.Server
             {
                 // 挂上这个组件,5秒就会删除session,所以客户端验证完成要删除这个组件。该组件的作用就是防止外挂一直连接不发消息也不进行权限验证
                 session.AddComponent<SessionAcceptTimeoutComponent>();
-                // 客户端连接,2秒检查一次recv消息,10秒没有消息则断开
-                session.AddComponent<SessionIdleCheckerComponent>();
+                // 客户端连接,检查是否处于空闲,空闲则close
+                if (ConstValue.SessionTimeoutTime > 0)
+                {
+#pragma warning disable CS0162 // 检测到无法访问的代码
+                    session.AddComponent<SessionIdleCheckerComponent>();
+#pragma warning restore CS0162 // 检测到无法访问的代码
+                }
             }
         }
         

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Share/Module/Message/SessionIdleCheckerComponentSystem.cs → DotNet/Hotfix/Module/Session/SessionIdleCheckerComponentSystem.cs

@@ -23,7 +23,7 @@ namespace ET
     {
         protected override void Awake(SessionIdleCheckerComponent self)
         {
-            self.RepeatedTimer = TimerComponent.Instance.NewRepeatedTimer(SessionIdleCheckerComponentSystem.CheckInteral, TimerInvokeType.SessionIdleChecker, self);
+            self.RepeatedTimer = TimerComponent.Instance.NewRepeatedTimer(ConstValue.SessionTimeoutTime / 2 + 100, TimerInvokeType.SessionIdleChecker, self);
         }
     }
 

+ 4 - 2
DotNet/Hotfix/Scenes/Gate/C2G_PingHandler.cs

@@ -1,14 +1,16 @@
 using System;
 
-
 namespace ET.Server
 {
+	/// <summary>
+	/// 心跳消息
+	/// </summary>
 	[MessageHandler(SceneType.Gate)]
 	public class C2G_PingHandler : AMRpcHandler<C2G_Ping, G2C_Ping>
 	{
 		protected override async ETTask Run(Session session, C2G_Ping request, G2C_Ping response)
 		{
-			response.Time = TimeHelper.ServerNow();
+			response.Time = TimeHelper.ClientNow();
 			await ETTask.CompletedTask;
 		}
 	}

+ 0 - 0
Unity/Assets/Scripts/Codes/Model/Share/Module/Message/SessionIdleCheckerComponent.cs → DotNet/Model/Module/Session/SessionIdleCheckerComponent.cs


+ 54 - 0
Unity/Assets/Scripts/Codes/Hotfix/Client/Demo/Session/SessionIdleCheckerComponentSystem.cs

@@ -0,0 +1,54 @@
+using System;
+
+namespace ET.Client
+{
+    [Invoke(TimerInvokeType.SessionIdleChecker)]
+    public class SessionIdleChecker: ATimer<SessionIdleCheckerComponent>
+    {
+        protected override void Run(SessionIdleCheckerComponent self)
+        {
+            try
+            {
+                self.Check();
+            }
+            catch (Exception e)
+            {
+                Log.Error($"idle check error: {self.Id}\n{e}");
+            }
+        }
+    }
+    
+    [ObjectSystem]
+    public class SessionIdleCheckerComponentAwakeSystem: AwakeSystem<SessionIdleCheckerComponent>
+    {
+        protected override void Awake(SessionIdleCheckerComponent self)
+        {
+            self.RepeatedTimer = TimerComponent.Instance.NewRepeatedTimer(ConstValue.SessionTimeoutTime / 2 +100, TimerInvokeType.SessionIdleChecker, self);
+        }
+    }
+
+    [ObjectSystem]
+    public class SessionIdleCheckerComponentDestroySystem: DestroySystem<SessionIdleCheckerComponent>
+    {
+        protected override void Destroy(SessionIdleCheckerComponent self)
+        {
+            TimerComponent.Instance?.Remove(ref self.RepeatedTimer);
+        }
+    }
+
+    public static class SessionIdleCheckerComponentSystem
+    {
+        public static void Check(this SessionIdleCheckerComponent self)
+        {
+            Session session = self.GetParent<Session>();
+            long timeNow = TimeHelper.ClientNow();
+
+            if (timeNow - session.LastRecvTime < ConstValue.SessionTimeoutTime/2 && timeNow - session.LastSendTime < ConstValue.SessionTimeoutTime/2)
+            {
+                return;
+            }
+
+            session.Send(new C2G_Ping());
+        }
+    }
+}

+ 3 - 0
Unity/Assets/Scripts/Codes/Hotfix/Client/Demo/Session/SessionIdleCheckerComponentSystem.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 4c8192ad701e4125816dba5948608289
+timeCreated: 1701865629

+ 6 - 1
Unity/Assets/Scripts/Codes/Hotfix/Share/ConstValue.cs

@@ -1,9 +1,14 @@
 namespace ET
 {
+    /// <summary>
+    /// 静态常量
+    /// </summary>
     public static class ConstValue
     {
         public const string RouterHttpHost = "127.0.0.1";
         public const int RouterHttpPort = 30300;
-        public const int SessionTimeoutTime = 30 * 1000;
+        
+        //session过期时间(毫秒),设置小于等于0时,session永不过期
+        public const int SessionTimeoutTime = 5 * 1000;
     }
 }

+ 8 - 0
Unity/Assets/Scripts/Codes/Model/Client/Demo/Session/SessionIdleCheckerComponent.cs

@@ -0,0 +1,8 @@
+namespace ET.Client
+{
+    [ComponentOf(typeof(Session))]
+    public class SessionIdleCheckerComponent: Entity, IAwake, IDestroy
+    {
+        public long RepeatedTimer;
+    }
+}

+ 3 - 0
Unity/Assets/Scripts/Codes/Model/Client/Demo/Session/SessionIdleCheckerComponent.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: e12a8ed598fd426c922ee8faddc9c235
+timeCreated: 1701865664