Prechádzať zdrojové kódy

ActorInnerComponent 进程内Actor消息发送
ActorOuterComponent 进程外Actor消息发送
ServerSenderComponent,对上面两者的封装,如果是进程内,则调用ActorInnerComponent发送,
如果是进程外,则把消息发到NetInner纤程,由NetInner纤程使用ActorOuterComponent发送,
也就是说,只有NetInner纤程有ActorOuterComponent组件

tanghai 2 rokov pred
rodič
commit
9e9e2d6188
53 zmenil súbory, kde vykonal 488 pridanie a 206 odobranie
  1. 1 0
      Unity/Assets/Scripts/Core/Network/ErrorCore.cs
  2. 4 4
      Unity/Assets/Scripts/Hotfix/Client/Demo/Main/ClientSenderCompnentSystem.cs
  3. 1 1
      Unity/Assets/Scripts/Hotfix/Client/Demo/NetClient/FiberInit_NetClient.cs
  4. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Demo/Gate/C2G_LoginGateHandler.cs
  5. 2 1
      Unity/Assets/Scripts/Hotfix/Server/Demo/Gate/FiberInit_Gate.cs
  6. 2 2
      Unity/Assets/Scripts/Hotfix/Server/Demo/Gate/NetServerComponentOnReadEvent.cs
  7. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Demo/Map/Transfer/TransferHelper.cs
  8. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Demo/MessageHelper.cs
  9. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Demo/Realm/C2R_LoginHandler.cs
  10. 2 1
      Unity/Assets/Scripts/Hotfix/Server/Demo/Realm/FiberInit_Realm.cs
  11. 1 1
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Gate/C2G_MatchHandler.cs
  12. 2 1
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/FiberInit_Map.cs
  13. 1 1
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/Match2Map_GetRoomHandler.cs
  14. 2 1
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Match/FiberInit_Match.cs
  15. 1 1
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Match/MatchComponentSystem.cs
  16. 2 1
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/FiberInit_RoomRoot.cs
  17. 6 6
      Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/ActorLocationSenderComponentSystem.cs
  18. 2 2
      Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/ActorMessageLocationHandler.cs
  19. 2 1
      Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/FiberInit_Location.cs
  20. 5 5
      Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/LocationProxyComponentSystem.cs
  21. 1 6
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_MessageHandler.cs
  22. 13 0
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_RequestHandler.cs
  23. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_RequestHandler.cs.meta
  24. 123 0
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/ActorOuterComponentSystem.cs
  25. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/ActorOuterComponentSystem.cs.meta
  26. 22 0
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/NetInnerComponentOnReadEvent.cs
  27. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/NetInnerComponentOnReadEvent.cs.meta
  28. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/NetInnerComponentSystem.cs
  29. 48 0
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/ServerSenderComponentSystem.cs
  30. 11 0
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/ServerSenderComponentSystem.cs.meta
  31. 0 17
      Unity/Assets/Scripts/Hotfix/Server/Module/NetInner/ActorSenderInvoker_SendToNetInner.cs
  32. 4 2
      Unity/Assets/Scripts/Hotfix/Server/Module/NetInner/FiberInit_NetInner.cs
  33. 0 3
      Unity/Assets/Scripts/Hotfix/Server/Module/Router/FiberInit_Router.cs
  34. 0 3
      Unity/Assets/Scripts/Hotfix/Server/Module/Router/FiberInit_RouterManager.cs
  35. 7 2
      Unity/Assets/Scripts/Hotfix/Share/Demo/EntryEvent1_InitShare.cs
  36. 37 84
      Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorInnerComponentSystem.cs
  37. 11 0
      Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorInnerComponentSystem.cs.meta
  38. 1 1
      Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorMessageHandler.cs
  39. 3 3
      Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorRecverComponentSystem.cs
  40. 1 1
      Unity/Assets/Scripts/Hotfix/Share/Module/Actor/MailBoxType_OrderedMessageHandler.cs
  41. 0 4
      Unity/Assets/Scripts/HotfixView/Client/Demo/EntryEvent3_InitClient.cs
  42. 4 4
      Unity/Assets/Scripts/Model/Client/Demo/Main/ClientSenderCompnent.cs
  43. 28 0
      Unity/Assets/Scripts/Model/Server/Module/Message/ActorOuterComponent.cs
  44. 11 0
      Unity/Assets/Scripts/Model/Server/Module/Message/ActorOuterComponent.cs.meta
  45. 6 0
      Unity/Assets/Scripts/Model/Server/Module/Message/NetInnerComponent.cs
  46. 20 0
      Unity/Assets/Scripts/Model/Server/Module/Message/ServerSenderComponent.cs
  47. 11 0
      Unity/Assets/Scripts/Model/Server/Module/Message/ServerSenderComponent.cs.meta
  48. 37 6
      Unity/Assets/Scripts/Model/Server/Module/NetInner/A2NetInner_Message.cs
  49. 14 0
      Unity/Assets/Scripts/Model/Share/Module/Actor/ActorInnerComponent.cs
  50. 11 0
      Unity/Assets/Scripts/Model/Share/Module/Actor/ActorInnerComponent.cs.meta
  51. 1 5
      Unity/Assets/Scripts/Model/Share/Module/Actor/ActorMessageSender.cs
  52. 0 27
      Unity/Assets/Scripts/Model/Share/Module/Actor/ActorSenderComponent.cs
  53. 19 1
      Unity/Assets/Scripts/Model/Share/Module/Message/Session.cs

+ 1 - 0
Unity/Assets/Scripts/Core/Network/ErrorCore.cs

@@ -61,6 +61,7 @@
         public const int ERR_Exception = 200000;
 
         public const int ERR_Cancel = 200001;
+        public const int ERR_Timeout = 200002;
 
         public static bool IsRpcNeedThrowException(int error)
         {

+ 4 - 4
Unity/Assets/Scripts/Hotfix/Client/Demo/Main/ClientSenderCompnentSystem.cs

@@ -6,7 +6,7 @@
         [EntitySystem]
         private static void Awake(this ClientSenderCompnent self)
         {
-            self.ActorSender = self.Root().GetComponent<ActorSenderComponent>();
+            self.ActorInner = self.Root().GetComponent<ActorInnerComponent>();
         }
         
         [EntitySystem]
@@ -23,7 +23,7 @@
             self.fiberId = await FiberManager.Instance.Create(SchedulerType.ThreadPool, 0, SceneType.NetClient, "");
             self.netClientActorId = new ActorId(self.Fiber().Process, self.fiberId);
             
-            NetClient2Main_Login response =await self.ActorSender.Call(self.netClientActorId, new Main2NetClient_Login() {Account = account, Password = password}) as NetClient2Main_Login;
+            NetClient2Main_Login response =await self.ActorInner.Call(self.netClientActorId, new Main2NetClient_Login() {Account = account, Password = password}) as NetClient2Main_Login;
             return response.PlayerId;
         }
         
@@ -31,14 +31,14 @@
         {
             A2NetClient_Message a2NetClientMessage = A2NetClient_Message.Create();
             a2NetClientMessage.MessageObject = message;
-            self.ActorSender.Send(self.netClientActorId, a2NetClientMessage);
+            self.ActorInner.Send(self.netClientActorId, a2NetClientMessage);
         }
         
         public static async ETTask<IResponse> Call(this ClientSenderCompnent self, IRequest request, bool needException = true)
         {
             A2NetClient_Request a2NetClientRequest = A2NetClient_Request.Create();
             a2NetClientRequest.MessageObject = request;
-            A2NetClient_Response response = await self.ActorSender.Call(self.netClientActorId, a2NetClientRequest, needException) as A2NetClient_Response;
+            A2NetClient_Response response = await self.ActorInner.Call(self.netClientActorId, a2NetClientRequest, needException: needException) as A2NetClient_Response;
             return response.MessageObject;
         }
     }

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Client/Demo/NetClient/FiberInit_NetClient.cs

@@ -7,7 +7,7 @@
         {
             Scene root = fiberInit.Fiber.Root;
             root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetClient);
+            root.AddComponent<ActorInnerComponent>();
             root.AddComponent<ActorRecverComponent>();
             await ETTask.CompletedTask;
         }

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Demo/Gate/C2G_LoginGateHandler.cs

@@ -59,7 +59,7 @@ namespace ET.Server
             Fiber fiber = player.Fiber();
             await fiber.WaitFrameFinish();
             
-            using Room2G_Reconnect room2GateReconnect = await fiber.Root.GetComponent<ActorSenderComponent>().Call(
+            using Room2G_Reconnect room2GateReconnect = await fiber.Root.GetComponent<ActorInnerComponent>().Call(
                 player.GetComponent<PlayerRoomComponent>().RoomActorId,
                 new G2Room_Reconnect() { PlayerId = player.Id }) as Room2G_Reconnect;
             G2C_Reconnect g2CReconnect = new() { StartTime = room2GateReconnect.StartTime, Frame = room2GateReconnect.Frame };

+ 2 - 1
Unity/Assets/Scripts/Hotfix/Server/Demo/Gate/FiberInit_Gate.cs

@@ -9,7 +9,8 @@ namespace ET.Server
         {
             Scene root = fiberInit.Fiber.Root;
             root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
+            root.AddComponent<ActorInnerComponent>();
+            root.AddComponent<ServerSenderComponent>();
             root.AddComponent<ActorRecverComponent>();
             root.AddComponent<PlayerComponent>();
             root.AddComponent<GateSessionKeyComponent>();

+ 2 - 2
Unity/Assets/Scripts/Hotfix/Server/Demo/Gate/NetServerComponentOnReadEvent.cs

@@ -23,7 +23,7 @@
                     Player player = session.GetComponent<SessionPlayerComponent>().Player;
                     ActorId roomActorId = player.GetComponent<PlayerRoomComponent>().RoomActorId;
                     frameMessage.PlayerId = player.Id;
-                    root.GetComponent<ActorSenderComponent>().Send(roomActorId, frameMessage);
+                    root.GetComponent<ActorInnerComponent>().Send(roomActorId, frameMessage);
                     break;
                 }
                 case IActorRoom actorRoom:
@@ -31,7 +31,7 @@
                     Player player = session.GetComponent<SessionPlayerComponent>().Player;
                     ActorId roomActorId = player.GetComponent<PlayerRoomComponent>().RoomActorId;
                     actorRoom.PlayerId = player.Id;
-                    root.GetComponent<ActorSenderComponent>().Send(roomActorId, actorRoom);
+                    root.GetComponent<ActorInnerComponent>().Send(roomActorId, actorRoom);
                     break;
                 }
                 case IActorLocationMessage actorLocationMessage:

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Demo/Map/Transfer/TransferHelper.cs

@@ -33,7 +33,7 @@ namespace ET.Server
             unit.Dispose();
             
             await root.GetComponent<LocationProxyComponent>().Lock(LocationType.Unit, unitId, request.OldActorId);
-            await root.GetComponent<ActorSenderComponent>().Call(sceneInstanceId, request);
+            await root.GetComponent<ActorInnerComponent>().Call(sceneInstanceId, request);
         }
     }
 }

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Demo/MessageHelper.cs

@@ -43,7 +43,7 @@ namespace ET.Server
         /// </summary>
         public static void SendActor(Scene root, ActorId actorId, IActorMessage message)
         {
-            root.GetComponent<ActorSenderComponent>().Send(actorId, message);
+            root.GetComponent<ActorInnerComponent>().Send(actorId, message);
         }
     }
 }

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Demo/Realm/C2R_LoginHandler.cs

@@ -14,7 +14,7 @@ namespace ET.Server
 			Log.Debug($"gate address: {config}");
 			
 			// 向gate请求一个key,客户端可以拿着这个key连接gate
-			G2R_GetLoginKey g2RGetLoginKey = (G2R_GetLoginKey) await session.Fiber().Root.GetComponent<ActorSenderComponent>().Call(
+			G2R_GetLoginKey g2RGetLoginKey = (G2R_GetLoginKey) await session.Fiber().Root.GetComponent<ActorInnerComponent>().Call(
 				config.ActorId, new R2G_GetLoginKey() {Account = request.Account});
 
 			response.Address = config.InnerIPPort.ToString();

+ 2 - 1
Unity/Assets/Scripts/Hotfix/Server/Demo/Realm/FiberInit_Realm.cs

@@ -9,7 +9,8 @@ namespace ET.Server
         {
             Scene root = fiberInit.Fiber.Root;
             root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
+            root.AddComponent<ActorInnerComponent>();
+            root.AddComponent<ServerSenderComponent>();
             root.AddComponent<ActorRecverComponent>();
             StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.Get(root.Fiber.Id);
             root.AddComponent<NetServerComponent, IPEndPoint>(startSceneConfig.InnerIPPort);

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/LockStep/Gate/C2G_MatchHandler.cs

@@ -9,7 +9,7 @@
 
 			StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.Match;
 
-			await session.Root().GetComponent<ActorSenderComponent>().Call(startSceneConfig.ActorId,
+			await session.Root().GetComponent<ActorInnerComponent>().Call(startSceneConfig.ActorId,
 				new G2Match_Match() { Id = player.Id });
 		}
 	}

+ 2 - 1
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/FiberInit_Map.cs

@@ -9,7 +9,8 @@ namespace ET.Server
         {
             Scene root = fiberInit.Fiber.Root;
             root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
+            root.AddComponent<ActorInnerComponent>();
+            root.AddComponent<ServerSenderComponent>();
             root.AddComponent<ActorRecverComponent>();
             root.AddComponent<UnitComponent>();
             root.AddComponent<AOIManagerComponent>();

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/Match2Map_GetRoomHandler.cs

@@ -17,7 +17,7 @@ namespace ET.Server
 			// 发送消息给房间纤程,初始化
 			RoomManager2Room_Init roomManager2RoomInit = RoomManager2Room_Init.Create();
 			roomManager2RoomInit.PlayerIds.AddRange(request.PlayerIds);
-			await root.GetComponent<ActorSenderComponent>().Call(roomRootActorId, roomManager2RoomInit);
+			await root.GetComponent<ActorInnerComponent>().Call(roomRootActorId, roomManager2RoomInit);
 			
 			response.ActorId = roomRootActorId;
 			await ETTask.CompletedTask;

+ 2 - 1
Unity/Assets/Scripts/Hotfix/Server/LockStep/Match/FiberInit_Match.cs

@@ -9,7 +9,8 @@ namespace ET.Server
         {
             Scene root = fiberInit.Fiber.Root;
             root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
+            root.AddComponent<ActorInnerComponent>();
+            root.AddComponent<ServerSenderComponent>();
             root.AddComponent<ActorRecverComponent>();
             root.AddComponent<MatchComponent>();
             root.AddComponent<LocationProxyComponent>();

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/LockStep/Match/MatchComponentSystem.cs

@@ -32,7 +32,7 @@ namespace ET.Server
             self.waitMatchPlayers.Clear();
 
             Scene root = self.Root();
-            Map2Match_GetRoom map2MatchGetRoom = await root.GetComponent<ActorSenderComponent>().Call(
+            Map2Match_GetRoom map2MatchGetRoom = await root.GetComponent<ActorInnerComponent>().Call(
                 startSceneConfig.ActorId, match2MapGetRoom) as Map2Match_GetRoom;
 
             Match2G_NotifyMatchSuccess match2GNotifyMatchSuccess = new() { ActorId = map2MatchGetRoom.ActorId };

+ 2 - 1
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/FiberInit_RoomRoot.cs

@@ -9,7 +9,8 @@ namespace ET.Server
         {
             Scene root = fiberInit.Fiber.Root;
             root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
+            root.AddComponent<ActorInnerComponent>();
+            root.AddComponent<ServerSenderComponent>();
             root.AddComponent<ActorRecverComponent>();
             Room room = root.AddChild<Room>();
             root.AddComponent<LocationProxyComponent>();

+ 6 - 6
Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/ActorLocationSenderComponentSystem.cs

@@ -105,7 +105,7 @@ namespace ET.Server
             if (actorLocationSender.ActorId != default)
             {
                 actorLocationSender.LastSendOrRecvTime = self.Fiber().TimeInfo.ServerNow();
-                root.GetComponent<ActorSenderComponent>().Send(actorLocationSender.ActorId, message);
+                root.GetComponent<ActorInnerComponent>().Send(actorLocationSender.ActorId, message);
                 return;
             }
             
@@ -129,7 +129,7 @@ namespace ET.Server
                 }
                 
                 actorLocationSender.LastSendOrRecvTime = self.Fiber().TimeInfo.ServerNow();
-                root.GetComponent<ActorSenderComponent>().Send(actorLocationSender.ActorId, message);
+                root.GetComponent<ActorInnerComponent>().Send(actorLocationSender.ActorId, message);
             }
         }
 
@@ -144,7 +144,7 @@ namespace ET.Server
             if (actorLocationSender.ActorId != default)
             {
                 actorLocationSender.LastSendOrRecvTime = self.Fiber().TimeInfo.ServerNow();
-                return await root.GetComponent<ActorSenderComponent>().Call(actorLocationSender.ActorId, request);
+                return await root.GetComponent<ActorInnerComponent>().Call(actorLocationSender.ActorId, request);
             }
             
             long instanceId = actorLocationSender.InstanceId;
@@ -168,7 +168,7 @@ namespace ET.Server
             }
 
             actorLocationSender.LastSendOrRecvTime = self.Fiber().TimeInfo.ServerNow();
-            return await root.GetComponent<ActorSenderComponent>().Call(actorLocationSender.ActorId, request);
+            return await root.GetComponent<ActorInnerComponent>().Call(actorLocationSender.ActorId, request);
         }
 
         public static void Send(this ActorLocationSenderOneType self, long entityId, IActorLocationMessage message)
@@ -183,7 +183,7 @@ namespace ET.Server
             Scene root = self.Root();
             
             // 先序列化好
-            int rpcId = root.GetComponent<ActorSenderComponent>().GetRpcId();
+            int rpcId = root.GetComponent<ActorInnerComponent>().GetRpcId();
             iActorRequest.RpcId = rpcId;
             
             long actorLocationSenderInstanceId = actorLocationSender.InstanceId;
@@ -242,7 +242,7 @@ namespace ET.Server
                     actorLocationSender.Error = ErrorCore.ERR_NotFoundActor;
                     return ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
                 }
-                IActorResponse response = await root.GetComponent<ActorSenderComponent>().Call(actorLocationSender.ActorId, rpcId, iActorRequest, false);
+                IActorResponse response = await root.GetComponent<ActorInnerComponent>().Call(actorLocationSender.ActorId, rpcId, iActorRequest, needException: false);
                 if (actorLocationSender.InstanceId != instanceId)
                 {
                     throw new RpcException(ErrorCore.ERR_ActorLocationSenderTimeout3, $"{iActorRequest}");

+ 2 - 2
Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/ActorMessageLocationHandler.cs

@@ -22,7 +22,7 @@ namespace ET.Server
             }
             
             ActorResponse response = new() {RpcId = message.RpcId};
-            entity.Root().GetComponent<ActorSenderComponent>().Reply(fromAddress, response);
+            entity.Root().GetComponent<ActorInnerComponent>().Reply(fromAddress, response);
 
             await this.Run(e, message);
         }
@@ -75,7 +75,7 @@ namespace ET.Server
                     response.Message = exception.ToString();
                 }
                 response.RpcId = rpcId;
-                entity.Root().GetComponent<ActorSenderComponent>().Reply(fromAddress, response);
+                entity.Root().GetComponent<ActorInnerComponent>().Reply(fromAddress, response);
             }
             catch (Exception e)
             {

+ 2 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/FiberInit_Location.cs

@@ -9,7 +9,8 @@ namespace ET.Server
         {
             Scene root = fiberInit.Fiber.Root;
             root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
+            root.AddComponent<ActorInnerComponent>();
+            root.AddComponent<ServerSenderComponent>();
             root.AddComponent<ActorRecverComponent>();
             root.AddComponent<LocationManagerComoponent>();
 

+ 5 - 5
Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/LocationProxyComponentSystem.cs

@@ -12,28 +12,28 @@ namespace ET.Server
         public static async ETTask Add(this LocationProxyComponent self, int type, long key, ActorId actorId)
         {
             Log.Info($"location proxy add {key}, {actorId} {self.Fiber().TimeInfo.ServerNow()}");
-            await self.Root().GetComponent<ActorSenderComponent>().Call(GetLocationSceneId(key),
+            await self.Root().GetComponent<ActorInnerComponent>().Call(GetLocationSceneId(key),
                 new ObjectAddRequest() { Type = type, Key = key, ActorId = actorId });
         }
 
         public static async ETTask Lock(this LocationProxyComponent self, int type, long key, ActorId actorId, int time = 60000)
         {
             Log.Info($"location proxy lock {key}, {actorId} {self.Fiber().TimeInfo.ServerNow()}");
-            await self.Root().GetComponent<ActorSenderComponent>().Call(GetLocationSceneId(key),
+            await self.Root().GetComponent<ActorInnerComponent>().Call(GetLocationSceneId(key),
                 new ObjectLockRequest() { Type = type, Key = key, ActorId = actorId, Time = time });
         }
 
         public static async ETTask UnLock(this LocationProxyComponent self, int type, long key, ActorId oldActorId, ActorId newActorId)
         {
             Log.Info($"location proxy unlock {key}, {newActorId} {self.Fiber().TimeInfo.ServerNow()}");
-            await self.Root().GetComponent<ActorSenderComponent>().Call(GetLocationSceneId(key),
+            await self.Root().GetComponent<ActorInnerComponent>().Call(GetLocationSceneId(key),
                 new ObjectUnLockRequest() { Type = type, Key = key, OldActorId = oldActorId, NewActorId = newActorId });
         }
 
         public static async ETTask Remove(this LocationProxyComponent self, int type, long key)
         {
             Log.Info($"location proxy add {key}, {self.Fiber().TimeInfo.ServerNow()}");
-            await self.Root().GetComponent<ActorSenderComponent>().Call(GetLocationSceneId(key),
+            await self.Root().GetComponent<ActorInnerComponent>().Call(GetLocationSceneId(key),
                 new ObjectRemoveRequest() { Type = type, Key = key });
         }
 
@@ -46,7 +46,7 @@ namespace ET.Server
 
             // location server配置到共享区,一个大战区可以配置N多个location server,这里暂时为1
             ObjectGetResponse response =
-                    (ObjectGetResponse) await self.Root().GetComponent<ActorSenderComponent>().Call(GetLocationSceneId(key),
+                    (ObjectGetResponse) await self.Root().GetComponent<ActorInnerComponent>().Call(GetLocationSceneId(key),
                         new ObjectGetRequest() { Type = type, Key = key });
             return response.ActorId;
         }

+ 1 - 6
Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_MessageHandler.cs

@@ -7,12 +7,7 @@ namespace ET.Server
     {
         protected override async ETTask Run(Scene root, A2NetInner_Message innerMessage)
         {
-            int process = innerMessage.ActorId.Process;
-            StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.NetInners[process];
-            Session session = root.GetComponent<NetInnerComponent>().Get(startSceneConfig.Id);
-            ActorId actorId = innerMessage.ActorId;
-            actorId.Address = innerMessage.FromAddress;
-            session.Send(actorId, innerMessage.MessageObject);
+            root.GetComponent<ActorOuterComponent>().Send(innerMessage.ActorId, innerMessage.MessageObject);
             await ETTask.CompletedTask;
         }
     }

+ 13 - 0
Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_RequestHandler.cs

@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+
+namespace ET.Server
+{
+    [ActorMessageHandler(SceneType.NetInner)]
+    public class A2NetInner_RequestHandler: ActorMessageHandler<Scene, A2NetInner_Request, A2NetInner_Response>
+    {
+        protected override async ETTask Run(Scene root, A2NetInner_Request request, A2NetInner_Response response)
+        {
+            response.MessageObject = await root.GetComponent<ActorOuterComponent>().Call(request.ActorId, request.MessageObject);
+        }
+    }
+}

+ 1 - 1
Unity/Assets/Scripts/Model/Share/Module/Actor/ActorSenderComponent.cs.meta → Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_RequestHandler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 02927fca8cdebf144b0e5cc8d0e333d4
+guid: fd158674e3aca934cb0bf40359f60577
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 123 - 0
Unity/Assets/Scripts/Hotfix/Server/Module/Message/ActorOuterComponentSystem.cs

@@ -0,0 +1,123 @@
+using System;
+
+namespace ET.Server
+{
+    public static class ActorOuterComponentSystem
+    {
+        [EntitySystem]
+        private static void Awake(this ActorOuterComponent self)
+        {
+            self.NetInnerComponent = self.Root().GetComponent<NetInnerComponent>();
+        }
+        
+        public static void HandleIActorResponse(this ActorOuterComponent self, IActorResponse response)
+        {
+            ActorMessageSender actorMessageSender;
+            if (!self.requestCallback.TryGetValue(response.RpcId, out actorMessageSender))
+            {
+                return;
+            }
+
+            self.requestCallback.Remove(response.RpcId);
+            
+            Run(actorMessageSender, response);
+        }
+        
+        private static void Run(ActorMessageSender self, IActorResponse response)
+        {
+            if (response.Error == ErrorCore.ERR_ActorTimeout)
+            {
+                self.Tcs.SetException(new Exception($"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
+                return;
+            }
+
+            if (self.NeedException && ErrorCore.IsRpcNeedThrowException(response.Error))
+            {
+                self.Tcs.SetException(new Exception($"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
+                return;
+            }
+
+            self.Tcs.SetResult(response);
+        }
+        
+        public static void Reply(this ActorOuterComponent self, Address fromAddress, IActorResponse message)
+        {
+            self.SendInner(new ActorId(fromAddress, 0), message as MessageObject);
+        }
+
+        public static void Send(this ActorOuterComponent self, ActorId actorId, IActorMessage message)
+        {
+            self.SendInner(actorId, message as MessageObject);
+        }
+
+        private static void SendInner(this ActorOuterComponent self, ActorId actorId, MessageObject message)
+        {
+            if (actorId == default)
+            {
+                throw new Exception($"actor id is 0: {message}");
+            }
+
+            Fiber fiber = self.Fiber();
+            // 如果发向同一个进程,则报错
+            if (actorId.Process == fiber.Process)
+            {
+                throw new Exception($"actor is the same process: {fiber.Process} {actorId.Process}");
+            }
+            
+            StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.NetInners[actorId.Process];
+            Session session = self.NetInnerComponent.GetComponent<NetInnerComponent>().Get(startSceneConfig.Process);
+            actorId.Process = fiber.Process;
+            session.Send(actorId, message);
+        }
+
+        private static int GetRpcId(this ActorOuterComponent self)
+        {
+            return ++self.RpcId;
+        }
+
+        public static async ETTask<IActorResponse> Call(this ActorOuterComponent self, ActorId actorId, IActorRequest iActorRequest, bool needException = true)
+        {
+            if (actorId == default)
+            {
+                throw new Exception($"actor id is 0: {iActorRequest}");
+            }
+
+            int rpcId = self.GetRpcId();
+            
+            var tcs = ETTask<IActorResponse>.Create(true);
+
+            Fiber fiber = self.Fiber();
+            self.requestCallback.Add(self.RpcId, new ActorMessageSender(actorId, iActorRequest, tcs, needException));
+            
+            self.SendInner(actorId, iActorRequest as MessageObject);
+            
+            async ETTask Timeout()
+            {
+                await fiber.TimerComponent.WaitAsync(ActorOuterComponent.TIMEOUT_TIME);
+                if (!self.requestCallback.TryGetValue(rpcId, out ActorMessageSender action))
+                {
+                    return;
+                }
+
+                self.requestCallback.Remove(rpcId);
+                action.Tcs.SetException(new Exception($"actor sender timeout: {iActorRequest}"));
+            }
+            
+            Timeout().Coroutine();
+            
+            long beginTime = fiber.TimeInfo.ServerFrameTime();
+
+            IActorResponse response = await tcs;
+            
+            long endTime = fiber.TimeInfo.ServerFrameTime();
+
+            long costTime = endTime - beginTime;
+            if (costTime > 200)
+            {
+                Log.Warning($"actor rpc time > 200: {costTime} {iActorRequest}");
+            }
+            
+            return response;
+        }
+    }
+}

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/NetInner/ActorSenderInvoker_SendToNetInner.cs.meta → Unity/Assets/Scripts/Hotfix/Server/Module/Message/ActorOuterComponentSystem.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: ad3ed8874566f7844941f265f495a009
+guid: 5950c6f1f1733d846864c5f87cc48038
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 22 - 0
Unity/Assets/Scripts/Hotfix/Server/Module/Message/NetInnerComponentOnReadEvent.cs

@@ -0,0 +1,22 @@
+namespace ET.Server
+{
+    [Event(SceneType.NetInner)]
+    public class NetInnerComponentOnReadEvent: AEvent<Scene, NetInnerComponentOnRead>
+    {
+        protected override async ETTask Run(Scene root, NetInnerComponentOnRead args)
+        {
+            ActorId actorId = args.ActorId;
+            object message = args.Message;
+
+            if (message is IActorResponse iActorResponse)
+            {
+                root.GetComponent<ActorOuterComponent>().HandleIActorResponse(iActorResponse);
+                return;
+            }
+            
+            ActorMessageQueue.Instance.Send(actorId, (MessageObject)message);
+
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorSenderComponentSystem.cs.meta → Unity/Assets/Scripts/Hotfix/Server/Module/Message/NetInnerComponentOnReadEvent.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 66b4fda03211ca04b8a447175a229ec3
+guid: 042bdacd2dd78854c80b8e827b0a5ad0
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/Message/NetInnerComponentSystem.cs

@@ -51,7 +51,7 @@ namespace ET.Server
             
             session.LastRecvTime = self.Fiber().TimeInfo.ClientFrameTime();
 
-            self.HandleMessage(actorId, message);
+            EventSystem.Instance.Publish(self.Scene(), new NetInnerComponentOnRead() {ActorId = actorId, Message = message});
         }
 
         private static void HandleMessage(this NetInnerComponent self, ActorId actorId, object message)

+ 48 - 0
Unity/Assets/Scripts/Hotfix/Server/Module/Message/ServerSenderComponentSystem.cs

@@ -0,0 +1,48 @@
+using System;
+
+namespace ET.Server
+{
+
+    public static class ServerSenderComponentSystem
+    {
+        public static void Send(this ServerSenderComponent self, ActorId actorId, IActorMessage message)
+        {
+            Fiber fiber = self.Fiber();
+            if (actorId.Process == fiber.Process)
+            {
+                self.ActorInnerComponent.Send(actorId, message);
+                return;
+            }
+
+            // 发给NetInner纤程
+            A2NetInner_Message a2NetInnerMessage = A2NetInner_Message.Create();
+            a2NetInnerMessage.FromAddress = fiber.Address;
+            a2NetInnerMessage.ActorId = actorId;
+            a2NetInnerMessage.MessageObject = message;
+
+            StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.NetInners[fiber.Process];
+            self.ActorInnerComponent.Send(startSceneConfig.ActorId, a2NetInnerMessage);
+        }
+
+
+        public static async ETTask<IActorResponse> Call(this ServerSenderComponent self, ActorId actorId, IActorRequest request, bool needException = true)
+        {
+            Fiber fiber = self.Fiber();
+            if (actorId.Process == fiber.Process)
+            {
+                return await self.ActorInnerComponent.Call(actorId, request, needException);
+            }
+
+            // 发给NetInner纤程
+            A2NetInner_Request a2NetInner_Request = A2NetInner_Request.Create();
+            a2NetInner_Request.ActorId = actorId;
+            a2NetInner_Request.MessageObject = request;
+            a2NetInner_Request.FromAddress = fiber.Address;
+
+            StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.NetInners[fiber.Process];
+            A2NetInner_Response response = await self.ActorInnerComponent.Call(startSceneConfig.ActorId, a2NetInner_Request, needException: needException) as A2NetInner_Response;
+            return response.MessageObject;
+        }
+    }
+}
+

+ 11 - 0
Unity/Assets/Scripts/Hotfix/Server/Module/Message/ServerSenderComponentSystem.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b5758614a7d40cf42a6b3b91b791bbb3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 0 - 17
Unity/Assets/Scripts/Hotfix/Server/Module/NetInner/ActorSenderInvoker_SendToNetInner.cs

@@ -1,17 +0,0 @@
-namespace ET.Server
-{
-    [Invoke((long)SceneType.NetInner)]
-    public class ActorSenderInvoker_SendToNetInner: AInvokeHandler<ActorSenderInvoker>
-    {
-        public override void Handle(ActorSenderInvoker args)
-        {
-            A2NetInner_Message netInnerMessage = A2NetInner_Message.Create();
-            netInnerMessage.FromAddress = args.Fiber.Address;
-            netInnerMessage.ActorId = args.ActorId;
-            netInnerMessage.MessageObject = args.MessageObject;
-            // 扔到Net纤程
-            StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.NetInners[args.Fiber.Process];
-            ActorMessageQueue.Instance.Send(startSceneConfig.ActorId, netInnerMessage);
-        }
-    }
-}

+ 4 - 2
Unity/Assets/Scripts/Hotfix/Server/Module/NetInner/FiberInit_NetInner.cs

@@ -9,10 +9,12 @@ namespace ET.Server
         {
             Scene root = fiberInit.Fiber.Root;
             root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
-            root.AddComponent<ActorRecverComponent>();
+            
             StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.Get(fiberInit.Fiber.Id);
             root.AddComponent<NetInnerComponent, IPEndPoint>(startSceneConfig.InnerIPPort);
+            root.AddComponent<ActorOuterComponent>();
+            root.AddComponent<ActorInnerComponent>();
+            root.AddComponent<ActorRecverComponent>();
 
             await ETTask.CompletedTask;
         }

+ 0 - 3
Unity/Assets/Scripts/Hotfix/Server/Module/Router/FiberInit_Router.cs

@@ -8,9 +8,6 @@ namespace ET.Server
         public override async ETTask Handle(FiberInit fiberInit)
         {
             Scene root = fiberInit.Fiber.Root;
-            root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
-            root.AddComponent<ActorRecverComponent>();
             StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.Get((int)root.Id);
             
             // 开发期间使用OuterIPPort,云服务器因为本机没有OuterIP,所以要改成InnerIPPort,然后在云防火墙中端口映射到InnerIPPort

+ 0 - 3
Unity/Assets/Scripts/Hotfix/Server/Module/Router/FiberInit_RouterManager.cs

@@ -8,9 +8,6 @@ namespace ET.Server
         public override async ETTask Handle(FiberInit fiberInit)
         {
             Scene root = fiberInit.Fiber.Root;
-            root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetInner);
-            root.AddComponent<ActorRecverComponent>();
             StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.Get((int)root.Id);
             root.AddComponent<HttpComponent, string>($"http://*:{startSceneConfig.Port}/");
 

+ 7 - 2
Unity/Assets/Scripts/Hotfix/Share/Demo/EntryEvent1_InitShare.cs

@@ -3,10 +3,15 @@ namespace ET
     [Event(SceneType.Main)]
     public class EntryEvent1_InitShare: AEvent<Scene, EventType.EntryEvent1>
     {
-        protected override async ETTask Run(Scene scene, EventType.EntryEvent1 args)
+        protected override async ETTask Run(Scene root, EventType.EntryEvent1 args)
         {
-            scene.AddComponent<ObjectWait>();
             await World.Instance.AddSingleton<ConfigComponent>().LoadAsync();
+            
+            root.AddComponent<ObjectWait>();
+            root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
+            root.AddComponent<ActorInnerComponent>();
+            root.AddComponent<ActorRecverComponent>();
+            
             await ETTask.CompletedTask;
         }
     }

+ 37 - 84
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorSenderComponentSystem.cs → Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorInnerComponentSystem.cs

@@ -4,40 +4,22 @@ using System.IO;
 
 namespace ET
 {
-    [FriendOf(typeof(ActorSenderComponent))]
-    public static partial class ActorSenderComponentSystem
+    [FriendOf(typeof(ActorInnerComponent))]
+    public static partial class ActorInnerComponentSystem
     {
-        [Invoke(TimerInvokeType.ActorMessageSenderChecker)]
-        public class ActorMessageSenderChecker: ATimer<ActorSenderComponent>
+        public static void HandleIActorResponse(this ActorInnerComponent self, IActorResponse response)
         {
-            protected override void Run(ActorSenderComponent self)
+            ActorMessageSender actorMessageSender;
+            if (!self.requestCallback.TryGetValue(response.RpcId, out actorMessageSender))
             {
-                try
-                {
-                    self.Check();
-                }
-                catch (Exception e)
-                {
-                    Log.Error($"move timer error: {self.Id}\n{e}");
-                }
+                return;
             }
-        }
-    
-        [EntitySystem]
-        private static void Awake(this ActorSenderComponent self, SceneType sceneType)
-        {
-            self.SceneType = sceneType;
-            self.TimeoutCheckTimer = self.Fiber().TimerComponent.NewRepeatedTimer(1000, TimerInvokeType.ActorMessageSenderChecker, self);
+
+            self.requestCallback.Remove(response.RpcId);
+            
+            Run(actorMessageSender, response);
         }
         
-        [EntitySystem]
-        private static void Destroy(this ActorSenderComponent self)
-        {
-            self.Fiber().TimerComponent.Remove(ref self.TimeoutCheckTimer);
-            self.TimeoutCheckTimer = 0;
-            self.TimeoutActorMessageSenders.Clear();
-        }
-
         private static void Run(ActorMessageSender self, IActorResponse response)
         {
             if (response.Error == ErrorCore.ERR_ActorTimeout)
@@ -54,50 +36,18 @@ namespace ET
 
             self.Tcs.SetResult(response);
         }
-
-        private static void Check(this ActorSenderComponent self)
-        {
-            long timeNow = self.Fiber().TimeInfo.ServerNow();
-            foreach ((int key, ActorMessageSender value) in self.requestCallback)
-            {
-                // 因为是顺序发送的,所以,检测到第一个不超时的就退出
-                if (timeNow < value.CreateTime + ActorSenderComponent.TIMEOUT_TIME)
-                {
-                    break;
-                }
-
-                self.TimeoutActorMessageSenders.Add(key);
-            }
-
-            foreach (int rpcId in self.TimeoutActorMessageSenders)
-            {
-                ActorMessageSender actorMessageSender = self.requestCallback[rpcId];
-                self.requestCallback.Remove(rpcId);
-                try
-                {
-                    IActorResponse response = ActorHelper.CreateResponse(actorMessageSender.Request, ErrorCore.ERR_ActorTimeout);
-                    Run(actorMessageSender, response);
-                }
-                catch (Exception e)
-                {
-                    Log.Error(e.ToString());
-                }
-            }
-
-            self.TimeoutActorMessageSenders.Clear();
-        }
         
-        public static void Reply(this ActorSenderComponent self, Address fromAddress, IActorResponse message)
+        public static void Reply(this ActorInnerComponent self, Address fromAddress, IActorResponse message)
         {
             self.SendInner(new ActorId(fromAddress, 0), message as MessageObject);
         }
 
-        public static void Send(this ActorSenderComponent self, ActorId actorId, IActorMessage message)
+        public static void Send(this ActorInnerComponent self, ActorId actorId, IActorMessage message)
         {
             self.SendInner(actorId, message as MessageObject);
         }
 
-        private static void SendInner(this ActorSenderComponent self, ActorId actorId, MessageObject message)
+        private static void SendInner(this ActorInnerComponent self, ActorId actorId, MessageObject message)
         {
             if (actorId == default)
             {
@@ -106,22 +56,21 @@ namespace ET
 
             Fiber fiber = self.Fiber();
             // 如果发向同一个进程,则扔到消息队列中
-            if (actorId.Process == fiber.Process)
+            if (actorId.Process != fiber.Process)
             {
-                ActorMessageQueue.Instance.Send(fiber.Address, actorId, message);
-                return;
+                throw new Exception($"actor is not the same process: {fiber.Process} {actorId.Process}");
             }
             
-            EventSystem.Instance.Invoke((long)self.SceneType, new ActorSenderInvoker() {Fiber = fiber, ActorId = actorId, MessageObject = message});
+            ActorMessageQueue.Instance.Send(fiber.Address, actorId, message);
         }
 
-        public static int GetRpcId(this ActorSenderComponent self)
+        public static int GetRpcId(this ActorInnerComponent self)
         {
             return ++self.RpcId;
         }
 
         public static async ETTask<IActorResponse> Call(
-                this ActorSenderComponent self,
+                this ActorInnerComponent self,
                 ActorId actorId,
                 IActorRequest request,
                 bool needException = true
@@ -138,7 +87,7 @@ namespace ET
         }
         
         public static async ETTask<IActorResponse> Call(
-                this ActorSenderComponent self,
+                this ActorInnerComponent self,
                 ActorId actorId,
                 int rpcId,
                 IActorRequest iActorRequest,
@@ -153,12 +102,29 @@ namespace ET
             var tcs = ETTask<IActorResponse>.Create(true);
 
             Fiber fiber = self.Fiber();
-            self.requestCallback.Add(rpcId, new ActorMessageSender(actorId, iActorRequest, tcs, needException, fiber.TimeInfo.ServerFrameTime()));
+            self.requestCallback.Add(rpcId, new ActorMessageSender(actorId, iActorRequest, tcs, needException));
             
             self.SendInner(actorId, iActorRequest as MessageObject);
 
+            
+            async ETTask Timeout()
+            {
+                await fiber.TimerComponent.WaitAsync(ActorInnerComponent.TIMEOUT_TIME);
+                if (!self.requestCallback.TryGetValue(rpcId, out ActorMessageSender action))
+                {
+                    return;
+                }
+
+                self.requestCallback.Remove(rpcId);
+                action.Tcs.SetException(new Exception($"actor sender timeout: {iActorRequest}"));
+            }
+            
+            Timeout().Coroutine();
+            
             long beginTime = fiber.TimeInfo.ServerFrameTime();
+
             IActorResponse response = await tcs;
+            
             long endTime = fiber.TimeInfo.ServerFrameTime();
 
             long costTime = endTime - beginTime;
@@ -169,18 +135,5 @@ namespace ET
             
             return response;
         }
-
-        public static void HandleIActorResponse(this ActorSenderComponent self, IActorResponse response)
-        {
-            ActorMessageSender actorMessageSender;
-            if (!self.requestCallback.TryGetValue(response.RpcId, out actorMessageSender))
-            {
-                return;
-            }
-
-            self.requestCallback.Remove(response.RpcId);
-            
-            Run(actorMessageSender, response);
-        }
     }
 }

+ 11 - 0
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorInnerComponentSystem.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a3593790376775349b6ec86801e7bb0f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorMessageHandler.cs

@@ -78,7 +78,7 @@ namespace ET
                 }
                 
                 response.RpcId = rpcId;
-                entity.Root().GetComponent<ActorSenderComponent>().Reply(fromAddress, response);
+                entity.Root().GetComponent<ActorInnerComponent>().Reply(fromAddress, response);
             }
             catch (Exception e)
             {

+ 3 - 3
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/ActorRecverComponentSystem.cs

@@ -22,12 +22,12 @@
             Fiber fiber = self.Fiber();
             ActorMessageQueue.Instance.Fetch(fiber.Id, 1000, self.list);
 
-            ActorSenderComponent actorSenderComponent = fiber.Root.GetComponent<ActorSenderComponent>();
+            ActorInnerComponent actorInnerComponent = fiber.Root.GetComponent<ActorInnerComponent>();
             foreach (ActorMessageInfo actorMessageInfo in self.list)
             {
                 if (actorMessageInfo.MessageObject is IActorResponse response)
                 {
-                    actorSenderComponent.HandleIActorResponse(response);
+                    actorInnerComponent.HandleIActorResponse(response);
                     continue;
                 }
 
@@ -41,7 +41,7 @@
                     if (message is IActorRequest request)
                     {
                         IActorResponse resp = ActorHelper.CreateResponse(request, ErrorCore.ERR_NotFoundActor);
-                        actorSenderComponent.Reply(actorId.Address, resp);
+                        actorInnerComponent.Reply(actorId.Address, resp);
                     }
                     return;
                 }

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/MailBoxType_OrderedMessageHandler.cs

@@ -29,7 +29,7 @@
                     if (messageObject is IActorRequest request)
                     {
                         IActorResponse resp = ActorHelper.CreateResponse(request, ErrorCore.ERR_NotFoundActor);
-                        mailBoxComponent.Root().GetComponent<ActorSenderComponent>().Reply(args.FromAddress, resp);
+                        mailBoxComponent.Root().GetComponent<ActorInnerComponent>().Reply(args.FromAddress, resp);
                     }
                     return;
                 }

+ 0 - 4
Unity/Assets/Scripts/HotfixView/Client/Demo/EntryEvent3_InitClient.cs

@@ -10,10 +10,6 @@ namespace ET.Client
         {
             World.Instance.AddSingleton<UIEventComponent>();
             
-            root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            root.AddComponent<ActorSenderComponent, SceneType>(SceneType.NetClient);
-            root.AddComponent<ActorRecverComponent>();
-
             GlobalComponent globalComponent = root.AddComponent<GlobalComponent>();
             root.AddComponent<UIGlobalComponent>();
             root.AddComponent<UIComponent>();

+ 4 - 4
Unity/Assets/Scripts/Model/Client/Demo/Main/ClientSenderCompnent.cs

@@ -7,17 +7,17 @@
 
         public ActorId netClientActorId;
 
-        private EntityRef<ActorSenderComponent> actorSender;
+        private EntityRef<ActorInnerComponent> actorInner;
 
-        public ActorSenderComponent ActorSender
+        public ActorInnerComponent ActorInner
         {
             get
             {
-                return this.actorSender;
+                return this.actorInner;
             }
             set
             {
-                this.actorSender = value;
+                this.actorInner = value;
             }
         }
     }

+ 28 - 0
Unity/Assets/Scripts/Model/Server/Module/Message/ActorOuterComponent.cs

@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+
+namespace ET.Server
+{
+    [ComponentOf(typeof(Scene))]
+    public class ActorOuterComponent: Entity, IAwake
+    {
+        public const long TIMEOUT_TIME = 40 * 1000;
+        
+        public int RpcId;
+
+        public readonly Dictionary<int, ActorMessageSender> requestCallback = new();
+
+        private EntityRef<NetInnerComponent> netInnerComponent;
+
+        public NetInnerComponent NetInnerComponent
+        {
+            get
+            {
+                return this.netInnerComponent;
+            }
+            set
+            {
+                this.netInnerComponent = value;
+            }
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Model/Server/Module/Message/ActorOuterComponent.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 11d2abb5f986c5b44b5b58bfae58908f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 6 - 0
Unity/Assets/Scripts/Model/Server/Module/Message/NetInnerComponent.cs

@@ -3,6 +3,12 @@ using System.Net;
 
 namespace ET.Server
 {
+    public struct NetInnerComponentOnRead
+    {
+        public ActorId ActorId;
+        public object Message;
+    }
+    
     [ComponentOf(typeof(Scene))]
     public class NetInnerComponent: Entity, IAwake<IPEndPoint>, IDestroy, IUpdate
     {

+ 20 - 0
Unity/Assets/Scripts/Model/Server/Module/Message/ServerSenderComponent.cs

@@ -0,0 +1,20 @@
+namespace ET.Server
+{
+    [ComponentOf(typeof(Scene))]
+    public class ServerSenderComponent: Entity, IAwake
+    {
+        private EntityRef<ActorInnerComponent> actorInnerComponent;
+
+        public ActorInnerComponent ActorInnerComponent
+        {
+            get
+            {
+                return this.actorInnerComponent;
+            }
+            set
+            {
+                this.actorInnerComponent = value;
+            }
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Model/Server/Module/Message/ServerSenderComponent.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b6425cccf0e3f6f4ebafdeb632948d50
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 37 - 6
Unity/Assets/Scripts/Model/Server/Module/NetInner/A2NetInner_Message.cs

@@ -20,27 +20,58 @@ namespace ET
         
         public Address FromAddress;
         public ActorId ActorId;
-        public MessageObject MessageObject;
+        public IActorMessage MessageObject;
     }
     
-    [Message(1)]
-    public class A2NetInner_Request: MessageObject, IActorMessage
+    [Message(2)]
+    public class A2NetInner_Request: MessageObject, IActorRequest
     {
-        public static A2NetInner_Message Create()
+        public static A2NetInner_Request Create()
         {
-            return ObjectPool.Instance.Fetch(typeof(A2NetInner_Message)) as A2NetInner_Message;
+            return ObjectPool.Instance.Fetch(typeof(A2NetInner_Request)) as A2NetInner_Request;
         }
 
         public override void Dispose()
         {
+            this.RpcId = default;
             this.FromAddress = default;
             this.ActorId = default;
+            this.MessageObject = default;
             
             ObjectPool.Instance.Recycle(this);
         }
         
+        public int RpcId { get; set; }
         public Address FromAddress;
         public ActorId ActorId;
-        public MessageObject MessageObject;
+        public IActorRequest MessageObject;
+    }
+    
+    [Message(1)]
+    public class A2NetInner_Response: MessageObject, IActorResponse
+    {
+        public static A2NetInner_Response Create()
+        {
+            return ObjectPool.Instance.Fetch(typeof(A2NetInner_Response)) as A2NetInner_Response;
+        }
+
+        public override void Dispose()
+        {
+            this.ActorId = default;
+
+            this.RpcId = default;
+            this.Error = default;
+            this.Message = default;
+            
+            ObjectPool.Instance.Recycle(this);
+        }
+        
+        public int Error { get; set; }
+        public string Message { get; set; }
+        public int RpcId { get; set; }
+        
+        public ActorId ActorId;
+        public IActorResponse MessageObject;
+
     }
 }

+ 14 - 0
Unity/Assets/Scripts/Model/Share/Module/Actor/ActorInnerComponent.cs

@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+
+namespace ET
+{
+    [ComponentOf(typeof(Scene))]
+    public class ActorInnerComponent: Entity, IAwake, IDestroy
+    {
+        public const long TIMEOUT_TIME = 40 * 1000;
+
+        public int RpcId;
+
+        public readonly Dictionary<int, ActorMessageSender> requestCallback = new();
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Model/Share/Module/Actor/ActorInnerComponent.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d74a2fe39353d9c498e360f72bca8080
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 5
Unity/Assets/Scripts/Model/Share/Module/Actor/ActorMessageSender.cs

@@ -6,9 +6,6 @@ namespace ET
     public readonly struct ActorMessageSender
     {
         public ActorId ActorId { get; }
-
-        // 最近接收或者发送消息的时间
-        public long CreateTime { get; }
         
         public IActorRequest Request { get; }
 
@@ -16,11 +13,10 @@ namespace ET
 
         public ETTask<IActorResponse> Tcs { get; }
 
-        public ActorMessageSender(ActorId actorId, IActorRequest iActorRequest, ETTask<IActorResponse> tcs, bool needException, long createTime)
+        public ActorMessageSender(ActorId actorId, IActorRequest iActorRequest, ETTask<IActorResponse> tcs, bool needException)
         {
             this.ActorId = actorId;
             this.Request = iActorRequest;
-            this.CreateTime = createTime;
             this.Tcs = tcs;
             this.NeedException = needException;
         }

+ 0 - 27
Unity/Assets/Scripts/Model/Share/Module/Actor/ActorSenderComponent.cs

@@ -1,27 +0,0 @@
-using System.Collections.Generic;
-
-namespace ET
-{
-    public struct ActorSenderInvoker
-    {
-        public Fiber Fiber;
-        public ActorId ActorId;
-        public MessageObject MessageObject;
-    }
-    
-    [ComponentOf(typeof(Scene))]
-    public class ActorSenderComponent: Entity, IAwake<SceneType>, IDestroy
-    {
-        public const long TIMEOUT_TIME = 40 * 1000;
-
-        public int RpcId;
-
-        public readonly SortedDictionary<int, ActorMessageSender> requestCallback = new();
-
-        public long TimeoutCheckTimer;
-
-        public List<int> TimeoutActorMessageSenders = new();
-
-        public SceneType SceneType;
-    }
-}

+ 19 - 1
Unity/Assets/Scripts/Model/Share/Module/Message/Session.cs

@@ -100,13 +100,31 @@ namespace ET
             return ret;
         }
 
-        public static async ETTask<IResponse> Call(this Session self, IRequest request)
+        public static async ETTask<IResponse> Call(this Session self, IRequest request, int time = 0)
         {
             int rpcId = ++Session.RpcId;
             RpcInfo rpcInfo = new(request);
             self.requestCallbacks[rpcId] = rpcInfo;
             request.RpcId = rpcId;
             self.Send(request);
+
+            if (time > 0)
+            {
+                async ETTask Timeout()
+                {
+                    await self.Fiber().TimerComponent.WaitAsync(time);
+                    if (!self.requestCallbacks.TryGetValue(rpcId, out RpcInfo action))
+                    {
+                        return;
+                    }
+
+                    self.requestCallbacks.Remove(rpcId);
+                    action.Tcs.SetException(new Exception($"session call timeout: {request} {time}"));
+                }
+                
+                Timeout().Coroutine();
+            }
+
             return await rpcInfo.Tcs;
         }