tanghai hace 1 año
padre
commit
4bd4110b9c
Se han modificado 23 ficheros con 426 adiciones y 500 borrados
  1. 0 1
      DotNet/Loader/Init.cs
  2. 1 1
      Unity/Assets/Scripts/Hotfix/Client.meta
  3. 1 1
      Unity/Assets/Scripts/Hotfix/Server.meta
  4. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Message.meta
  5. 14 0
      Unity/Assets/Scripts/Hotfix/Server/Message/A2NetInner_MessageHandler.cs
  6. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Message/A2NetInner_MessageHandler.cs.meta
  7. 16 0
      Unity/Assets/Scripts/Hotfix/Server/Message/A2NetInner_RequestHandler.cs
  8. 11 0
      Unity/Assets/Scripts/Hotfix/Server/Message/A2NetInner_RequestHandler.cs.meta
  9. 8 0
      Unity/Assets/Scripts/Hotfix/Share.meta
  10. 1 1
      Unity/Assets/Scripts/Model/Generate/Server/ConfigPartial/StartProcessConfig.cs
  11. 0 455
      Unity/Assets/Scripts/Model/Generate/Server/Message/ActorLocationMessage_S_20001.cs
  12. 8 0
      Unity/Assets/Scripts/Model/Server/Message.meta
  13. 0 0
      Unity/Assets/Scripts/Model/Server/Message/A2NetInner_Message.cs
  14. 11 0
      Unity/Assets/Scripts/Model/Server/Message/A2NetInner_Message.cs.meta
  15. 84 0
      Unity/Assets/Scripts/Model/Server/Message/MessageSender.cs
  16. 0 0
      Unity/Assets/Scripts/Model/Server/Message/MessageSender.cs.meta
  17. 266 0
      Unity/Assets/Scripts/Model/Server/Message/ProcessOuterSender.cs
  18. 0 0
      Unity/Assets/Scripts/Model/Server/Message/ProcessOuterSender.cs.meta
  19. 0 14
      Unity/Assets/Scripts/Model/Server/Module/Message/MessageSender.cs
  20. 0 19
      Unity/Assets/Scripts/Model/Server/Module/Message/ProcessOuterSender.cs
  21. 0 3
      Unity/Assets/Scripts/Model/Server/Module/NetInner.meta
  22. 0 3
      Unity/Assets/Scripts/Model/Server/Module/NetInner/A2NetInner_Message.cs.meta
  23. 3 0
      Unity/Unity.sln.DotSettings

+ 0 - 1
DotNet/Loader/Init.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Threading;
 using CommandLine;
 
 namespace ET

+ 1 - 1
Unity/Assets/Scripts/Loader/Plugins.meta → Unity/Assets/Scripts/Hotfix/Client.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: f3622259112f64aaeb03ea4c8e36cb92
+guid: d4f2a5223e6e841148bf77ca6851fb4d
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module.meta → Unity/Assets/Scripts/Hotfix/Server.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 50b89103390beda43874b94fdde62cbf
+guid: 3a1c4d09a2340451da31b5ef24e6bc19
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module/Message.meta → Unity/Assets/Scripts/Hotfix/Server/Message.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 28793f12e3c15f140bd4d4d713d5782d
+guid: 7129414fd5355413183dc00d908211fa
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 14 - 0
Unity/Assets/Scripts/Hotfix/Server/Message/A2NetInner_MessageHandler.cs

@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+
+namespace ET.Server
+{
+    [MessageHandler(SceneType.NetInner)]
+    public class A2NetInner_MessageHandler: MessageHandler<Scene, A2NetInner_Message>
+    {
+        protected override async ETTask Run(Scene root, A2NetInner_Message innerMessage)
+        {
+            root.GetComponent<ProcessOuterSender>().Send(innerMessage.ActorId, innerMessage.MessageObject);
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 1 - 1
Unity/Assets/Scripts/Model/Generate/Server/Message/ActorLocationMessage_S_20001.cs.meta → Unity/Assets/Scripts/Hotfix/Server/Message/A2NetInner_MessageHandler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: ec14864da4d214eec83ad255beb9592b
+guid: 202f2e129fe674d80a36a4fcb8338eed
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

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

@@ -0,0 +1,16 @@
+using System.Collections.Generic;
+
+namespace ET.Server
+{
+    [MessageHandler(SceneType.NetInner)]
+    public class A2NetInner_RequestHandler: MessageHandler<Scene, A2NetInner_Request, A2NetInner_Response>
+    {
+        protected override async ETTask Run(Scene root, A2NetInner_Request request, A2NetInner_Response response)
+        {
+            int rpcId = request.RpcId;
+            IResponse res = await root.GetComponent<ProcessOuterSender>().Call(request.ActorId, request.MessageObject, false);
+            res.RpcId = rpcId;
+            response.MessageObject = res;
+        }
+    }
+}

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

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

+ 8 - 0
Unity/Assets/Scripts/Hotfix/Share.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cbd2f4a312d744dba87bb9b23f224d79
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
Unity/Assets/Scripts/Model/Generate/Server/ConfigPartial/StartProcessConfig.cs

@@ -1,4 +1,4 @@
-using System.Net;
+ using System.Net;
 
 namespace ET
 {

+ 0 - 455
Unity/Assets/Scripts/Model/Generate/Server/Message/ActorLocationMessage_S_20001.cs

@@ -1,455 +0,0 @@
-using MemoryPack;
-using System.Collections.Generic;
-
-namespace ET
-{
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectQueryRequest)]
-    [ResponseType(nameof(ObjectQueryResponse))]
-    public partial class ObjectQueryRequest : MessageObject, IRequest
-    {
-        public static ObjectQueryRequest Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectQueryRequest>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public long Key { get; set; }
-
-        [MemoryPackOrder(2)]
-        public long InstanceId { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Key = default;
-            this.InstanceId = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectAddRequest)]
-    [ResponseType(nameof(ObjectAddResponse))]
-    public partial class ObjectAddRequest : MessageObject, IRequest
-    {
-        public static ObjectAddRequest Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectAddRequest>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Type { get; set; }
-
-        [MemoryPackOrder(2)]
-        public long Key { get; set; }
-
-        [MemoryPackOrder(3)]
-        public ActorId ActorId { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Type = default;
-            this.Key = default;
-            this.ActorId = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectAddResponse)]
-    public partial class ObjectAddResponse : MessageObject, IResponse
-    {
-        public static ObjectAddResponse Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectAddResponse>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Error { get; set; }
-
-        [MemoryPackOrder(2)]
-        public string Message { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Error = default;
-            this.Message = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectLockRequest)]
-    [ResponseType(nameof(ObjectLockResponse))]
-    public partial class ObjectLockRequest : MessageObject, IRequest
-    {
-        public static ObjectLockRequest Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectLockRequest>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Type { get; set; }
-
-        [MemoryPackOrder(2)]
-        public long Key { get; set; }
-
-        [MemoryPackOrder(3)]
-        public ActorId ActorId { get; set; }
-
-        [MemoryPackOrder(4)]
-        public int Time { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Type = default;
-            this.Key = default;
-            this.ActorId = default;
-            this.Time = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectLockResponse)]
-    public partial class ObjectLockResponse : MessageObject, IResponse
-    {
-        public static ObjectLockResponse Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectLockResponse>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Error { get; set; }
-
-        [MemoryPackOrder(2)]
-        public string Message { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Error = default;
-            this.Message = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectUnLockRequest)]
-    [ResponseType(nameof(ObjectUnLockResponse))]
-    public partial class ObjectUnLockRequest : MessageObject, IRequest
-    {
-        public static ObjectUnLockRequest Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectUnLockRequest>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Type { get; set; }
-
-        [MemoryPackOrder(2)]
-        public long Key { get; set; }
-
-        [MemoryPackOrder(3)]
-        public ActorId OldActorId { get; set; }
-
-        [MemoryPackOrder(4)]
-        public ActorId NewActorId { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Type = default;
-            this.Key = default;
-            this.OldActorId = default;
-            this.NewActorId = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectUnLockResponse)]
-    public partial class ObjectUnLockResponse : MessageObject, IResponse
-    {
-        public static ObjectUnLockResponse Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectUnLockResponse>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Error { get; set; }
-
-        [MemoryPackOrder(2)]
-        public string Message { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Error = default;
-            this.Message = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectRemoveRequest)]
-    [ResponseType(nameof(ObjectRemoveResponse))]
-    public partial class ObjectRemoveRequest : MessageObject, IRequest
-    {
-        public static ObjectRemoveRequest Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectRemoveRequest>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Type { get; set; }
-
-        [MemoryPackOrder(2)]
-        public long Key { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Type = default;
-            this.Key = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectRemoveResponse)]
-    public partial class ObjectRemoveResponse : MessageObject, IResponse
-    {
-        public static ObjectRemoveResponse Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectRemoveResponse>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Error { get; set; }
-
-        [MemoryPackOrder(2)]
-        public string Message { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Error = default;
-            this.Message = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectGetRequest)]
-    [ResponseType(nameof(ObjectGetResponse))]
-    public partial class ObjectGetRequest : MessageObject, IRequest
-    {
-        public static ObjectGetRequest Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectGetRequest>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Type { get; set; }
-
-        [MemoryPackOrder(2)]
-        public long Key { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Type = default;
-            this.Key = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectGetResponse)]
-    public partial class ObjectGetResponse : MessageObject, IResponse
-    {
-        public static ObjectGetResponse Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectGetResponse>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Error { get; set; }
-
-        [MemoryPackOrder(2)]
-        public string Message { get; set; }
-
-        [MemoryPackOrder(3)]
-        public int Type { get; set; }
-
-        [MemoryPackOrder(4)]
-        public ActorId ActorId { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Error = default;
-            this.Message = default;
-            this.Type = default;
-            this.ActorId = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    [MemoryPackable]
-    [Message(ActorLocationMessage.ObjectQueryResponse)]
-    public partial class ObjectQueryResponse : MessageObject, IResponse
-    {
-        public static ObjectQueryResponse Create(bool isFromPool = false)
-        {
-            return ObjectPool.Fetch<ObjectQueryResponse>(isFromPool);
-        }
-
-        [MemoryPackOrder(0)]
-        public int RpcId { get; set; }
-
-        [MemoryPackOrder(1)]
-        public int Error { get; set; }
-
-        [MemoryPackOrder(2)]
-        public string Message { get; set; }
-
-        [MemoryPackOrder(3)]
-        public byte[] Entity { get; set; }
-
-        public override void Dispose()
-        {
-            if (!this.IsFromPool)
-            {
-                return;
-            }
-
-            this.RpcId = default;
-            this.Error = default;
-            this.Message = default;
-            this.Entity = default;
-
-            ObjectPool.Recycle(this);
-        }
-    }
-
-    public static class ActorLocationMessage
-    {
-        public const ushort ObjectQueryRequest = 20002;
-        public const ushort ObjectAddRequest = 20003;
-        public const ushort ObjectAddResponse = 20004;
-        public const ushort ObjectLockRequest = 20005;
-        public const ushort ObjectLockResponse = 20006;
-        public const ushort ObjectUnLockRequest = 20007;
-        public const ushort ObjectUnLockResponse = 20008;
-        public const ushort ObjectRemoveRequest = 20009;
-        public const ushort ObjectRemoveResponse = 20010;
-        public const ushort ObjectGetRequest = 20011;
-        public const ushort ObjectGetResponse = 20012;
-        public const ushort ObjectQueryResponse = 20013;
-    }
-}

+ 8 - 0
Unity/Assets/Scripts/Model/Server/Message.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3e08e979a5e9643d1b43af471ea3782a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/NetInner/A2NetInner_Message.cs → Unity/Assets/Scripts/Model/Server/Message/A2NetInner_Message.cs


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

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

+ 84 - 0
Unity/Assets/Scripts/Model/Server/Message/MessageSender.cs

@@ -0,0 +1,84 @@
+using System;
+using System.Collections.Generic;
+
+namespace ET.Server
+{
+    [FriendOf(typeof(MessageSender))]
+    public static partial class MessageSenderSystem
+    {
+        public static void Send(this MessageSender self, ActorId actorId, IMessage message)
+        {
+            Fiber fiber = self.Fiber();
+            // 如果发向同一个进程,则扔到消息队列中
+            if (actorId.Process == fiber.Process)
+            {
+                fiber.Root.GetComponent<ProcessInnerSender>().Send(actorId, message);
+                return;
+            }
+            
+            // 发给NetInner纤程
+            A2NetInner_Message a2NetInnerMessage = A2NetInner_Message.Create();
+            a2NetInnerMessage.FromAddress = fiber.Address;
+            a2NetInnerMessage.ActorId = actorId;
+            a2NetInnerMessage.MessageObject = message;
+
+            MessageQueue.Instance.Send(new ActorId(fiber.Process, SceneType.NetInner), a2NetInnerMessage);
+        }
+
+        private static int GetRpcId(this MessageSender self)
+        {
+            return ++self.RpcId;
+        }
+
+        public static async ETTask<IResponse> Call(
+                this MessageSender self,
+                ActorId actorId,
+                IRequest request,
+                bool needException = true
+        )
+        {
+            if (actorId == default)
+            {
+                throw new Exception($"actor id is 0: {request}");
+            }
+            Fiber fiber = self.Fiber();
+
+            IResponse response;
+            if (fiber.Process == actorId.Process)
+            {
+                response = await fiber.Root.GetComponent<ProcessInnerSender>().Call(actorId, request, needException: needException);
+            }
+            else
+            {
+                // 发给NetInner纤程
+                A2NetInner_Request a2NetInner_Request = A2NetInner_Request.Create();
+                a2NetInner_Request.ActorId = actorId;
+                a2NetInner_Request.MessageObject = request;
+            
+                using A2NetInner_Response a2NetInnerResponse = await fiber.Root.GetComponent<ProcessInnerSender>().Call(
+                    new ActorId(fiber.Process, SceneType.NetInner), a2NetInner_Request) as A2NetInner_Response;
+                response = a2NetInnerResponse.MessageObject;
+            }
+            
+            if (response.Error == ErrorCore.ERR_MessageTimeout)
+            {
+                throw new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {actorId} {request}, response: {response}");
+            }
+            if (needException && ErrorCore.IsRpcNeedThrowException(response.Error))
+            {
+                throw new RpcException(response.Error, $"Rpc error: actorId: {actorId} {request}, response: {response}");
+            }
+            return response;
+        }
+    }
+    
+    [ComponentOf(typeof(Scene))]
+    public class MessageSender: Entity, IAwake, IDestroy
+    {
+        public const long TIMEOUT_TIME = 40 * 1000;
+
+        public int RpcId;
+
+        public readonly Dictionary<int, MessageSenderStruct> requestCallback = new();
+    }
+}

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Message/MessageSender.cs.meta → Unity/Assets/Scripts/Model/Server/Message/MessageSender.cs.meta


+ 266 - 0
Unity/Assets/Scripts/Model/Server/Message/ProcessOuterSender.cs

@@ -0,0 +1,266 @@
+using System;
+using System.Collections.Generic;
+using System.Net;
+
+namespace ET.Server
+{
+    [EntitySystemOf(typeof(ProcessOuterSender))]
+    public static partial class ProcessOuterSenderSystem
+    {
+        [EntitySystem]
+        private static void Awake(this ProcessOuterSender self, IPEndPoint address)
+        {
+            switch (self.InnerProtocol)
+            {
+                case NetworkProtocol.TCP:
+                {
+                    self.AService = new TService(address, ServiceType.Inner);
+                    break;
+                }
+                case NetworkProtocol.KCP:
+                {
+                    self.AService = new KService(address, NetworkProtocol.UDP, ServiceType.Inner);
+                    break;
+                }
+            }
+                
+            self.AService.AcceptCallback = self.OnAccept;
+            self.AService.ReadCallback = self.OnRead;
+            self.AService.ErrorCallback = self.OnError;
+        }
+        
+        
+        [EntitySystem]
+        private static void Update(this ProcessOuterSender self)
+        {
+            self.AService.Update();
+        }
+
+        [EntitySystem]
+        private static void Destroy(this ProcessOuterSender self)
+        {
+            self.AService.Dispose();
+        }
+
+        private static void OnRead(this ProcessOuterSender self, long channelId, MemoryBuffer memoryBuffer)
+        {
+            Session session = self.GetChild<Session>(channelId);
+            if (session == null)
+            {
+                return;
+            }
+            
+            session.LastRecvTime = TimeInfo.Instance.ClientFrameTime();
+
+            (ActorId actorId, object message) = MessageSerializeHelper.ToMessage(self.AService, memoryBuffer);
+            
+            if (message is IResponse response)
+            {
+                self.HandleIActorResponse(response);
+                return;
+            }
+
+            Fiber fiber = self.Fiber();
+            int fromProcess = actorId.Process;
+            actorId.Process = fiber.Process;
+
+            switch (message)
+            {
+                case ILocationRequest:
+                case IRequest:
+                {
+                    CallInner().Coroutine();
+                    break;
+
+                    async ETTask CallInner()
+                    {
+                        IRequest req = (IRequest)message;
+                        int rpcId = req.RpcId;
+                        // 注意这里都不能抛异常,因为这里只是中转消息
+                        IResponse res = await fiber.Root.GetComponent<ProcessInnerSender>().Call(actorId, req, false);
+                        // 注意这里的response会在该协程执行完之后由ProcessInnerSender dispose。
+                        actorId.Process = fromProcess;
+                        res.RpcId = rpcId;
+                        self.Send(actorId, res);
+                        ((MessageObject)res).Dispose();
+                    }
+                }
+                default:
+                {
+                    fiber.Root.GetComponent<ProcessInnerSender>().Send(actorId, (IMessage)message);
+                    break;
+                }
+            }
+        }
+
+        private static void OnError(this ProcessOuterSender self, long channelId, int error)
+        {
+            Session session = self.GetChild<Session>(channelId);
+            if (session == null)
+            {
+                return;
+            }
+
+            session.Error = error;
+            session.Dispose();
+        }
+
+        // 这个channelId是由CreateAcceptChannelId生成的
+        private static void OnAccept(this ProcessOuterSender self, long channelId, IPEndPoint ipEndPoint)
+        {
+            Session session = self.AddChildWithId<Session, AService>(channelId, self.AService);
+            session.RemoteAddress = ipEndPoint;
+            //session.AddComponent<SessionIdleCheckerComponent, int, int, int>(NetThreadComponent.checkInteral, NetThreadComponent.recvMaxIdleTime, NetThreadComponent.sendMaxIdleTime);
+        }
+
+        private static Session CreateInner(this ProcessOuterSender self, long channelId, IPEndPoint ipEndPoint)
+        {
+            Session session = self.AddChildWithId<Session, AService>(channelId, self.AService);
+            session.RemoteAddress = ipEndPoint;
+            self.AService.Create(channelId, session.RemoteAddress);
+
+            //session.AddComponent<InnerPingComponent>();
+            //session.AddComponent<SessionIdleCheckerComponent, int, int, int>(NetThreadComponent.checkInteral, NetThreadComponent.recvMaxIdleTime, NetThreadComponent.sendMaxIdleTime);
+
+            return session;
+        }
+
+        // 内网actor session,channelId是进程号
+        private static Session Get(this ProcessOuterSender self, long channelId)
+        {
+            Session session = self.GetChild<Session>(channelId);
+            if (session != null)
+            {
+                return session;
+            }
+
+            IPEndPoint ipEndPoint = StartProcessConfigCategory.Instance.Get((int) channelId).IPEndPoint;
+            session = self.CreateInner(channelId, ipEndPoint);
+            return session;
+        }
+
+        private static void HandleIActorResponse(this ProcessOuterSender self, IResponse response)
+        {
+            if (!self.requestCallback.Remove(response.RpcId, out MessageSenderStruct actorMessageSender))
+            {
+                return;
+            }
+            Run(actorMessageSender, response);
+        }
+
+        private static void Run(MessageSenderStruct self, IResponse response)
+        {
+            if (response.Error == ErrorCore.ERR_MessageTimeout)
+            {
+                self.SetException(new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.RequestType.FullName}, response: {response}"));
+                return;
+            }
+
+            if (self.NeedException && ErrorCore.IsRpcNeedThrowException(response.Error))
+            {
+                self.SetException(new RpcException(response.Error, $"Rpc error: actorId: {self.ActorId} request: {self.RequestType.FullName}, response: {response}"));
+                return;
+            }
+
+            self.SetResult(response);
+        }
+
+        public static void Send(this ProcessOuterSender self, ActorId actorId, IMessage message)
+        {
+            self.SendInner(actorId, message as MessageObject);
+        }
+
+        private static void SendInner(this ProcessOuterSender 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}");
+            }
+            
+            StartProcessConfig startProcessConfig = StartProcessConfigCategory.Instance.Get(actorId.Process);
+            Session session = self.Get(startProcessConfig.Id);
+            actorId.Process = fiber.Process;
+            session.Send(actorId, message);
+        }
+
+        private static int GetRpcId(this ProcessOuterSender self)
+        {
+            return ++self.RpcId;
+        }
+
+        public static async ETTask<IResponse> Call(this ProcessOuterSender self, ActorId actorId, IRequest iRequest, bool needException = true)
+        {
+            if (actorId == default)
+            {
+                throw new Exception($"actor id is 0: {iRequest}");
+            }
+            Fiber fiber = self.Fiber();
+            
+            int rpcId = self.GetRpcId();
+
+            iRequest.RpcId = rpcId;
+
+            Type requestType = iRequest.GetType();
+            MessageSenderStruct messageSenderStruct = new(actorId, requestType, needException);
+            self.requestCallback.Add(rpcId, messageSenderStruct);
+            
+            self.SendInner(actorId, iRequest as MessageObject);
+
+            async ETTask Timeout()
+            {
+                await fiber.Root.GetComponent<TimerComponent>().WaitAsync(ProcessOuterSender.TIMEOUT_TIME);
+                if (!self.requestCallback.Remove(rpcId, out MessageSenderStruct action))
+                {
+                    return;
+                }
+                
+                if (needException)
+                {
+                    action.SetException(new Exception($"actor sender timeout: {requestType.FullName}"));
+                }
+                else
+                {
+                    IResponse response = MessageHelper.CreateResponse(requestType, rpcId, ErrorCore.ERR_Timeout);
+                    action.SetResult(response);
+                }
+            }
+
+            Timeout().Coroutine();
+
+            long beginTime = TimeInfo.Instance.ServerFrameTime();
+
+            IResponse response = await messageSenderStruct.Wait();
+
+            long endTime = TimeInfo.Instance.ServerFrameTime();
+
+            long costTime = endTime - beginTime;
+            if (costTime > 200)
+            {
+                Log.Warning($"actor rpc time > 200: {costTime} {requestType.FullName}");
+            }
+
+            return response;
+        }
+    }
+    
+    [ComponentOf(typeof(Scene))]
+    public class ProcessOuterSender: Entity, IAwake<IPEndPoint>, IUpdate, IDestroy
+    {
+        public const long TIMEOUT_TIME = 40 * 1000;
+        
+        public int RpcId;
+
+        public readonly Dictionary<int, MessageSenderStruct> requestCallback = new();
+        
+        public AService AService;
+        
+        public NetworkProtocol InnerProtocol = NetworkProtocol.KCP;
+    }
+}

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Message/ProcessOuterSender.cs.meta → Unity/Assets/Scripts/Model/Server/Message/ProcessOuterSender.cs.meta


+ 0 - 14
Unity/Assets/Scripts/Model/Server/Module/Message/MessageSender.cs

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

+ 0 - 19
Unity/Assets/Scripts/Model/Server/Module/Message/ProcessOuterSender.cs

@@ -1,19 +0,0 @@
-using System.Collections.Generic;
-using System.Net;
-
-namespace ET.Server
-{
-    [ComponentOf(typeof(Scene))]
-    public class ProcessOuterSender: Entity, IAwake<IPEndPoint>, IUpdate, IDestroy
-    {
-        public const long TIMEOUT_TIME = 40 * 1000;
-        
-        public int RpcId;
-
-        public readonly Dictionary<int, MessageSenderStruct> requestCallback = new();
-        
-        public AService AService;
-        
-        public NetworkProtocol InnerProtocol = NetworkProtocol.KCP;
-    }
-}

+ 0 - 3
Unity/Assets/Scripts/Model/Server/Module/NetInner.meta

@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 89b0725638d94c1e9c36b262da2e447c
-timeCreated: 1688535488

+ 0 - 3
Unity/Assets/Scripts/Model/Server/Module/NetInner/A2NetInner_Message.cs.meta

@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 49cfb0bef9f14131b988f817eff4313b
-timeCreated: 1688535429

+ 3 - 0
Unity/Unity.sln.DotSettings

@@ -364,6 +364,8 @@ II.2.12 &lt;HandlesEvent /&gt;&#xD;
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/EventHandlerPatternLong/@EntryValue">$object$_On$event$</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=4a98fdf6_002D7d98_002D4f5a_002Dafeb_002Dea44ad98c70c/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=f9fce829_002De6f4_002D4cb2_002D80f1_002D5497c44f51df/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/VBNaming/EventHandlerPatternLong/@EntryValue">$object$_On$event$</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/UserRules/=NAMESPACE_005FALIAS/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/UserRules/=XAML_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
@@ -422,6 +424,7 @@ II.2.12 &lt;HandlesEvent /&gt;&#xD;
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002EJavaScript_002ECodeStyle_002ESettingsUpgrade_002EJsCodeFormatterSettingsUpgrader/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002EJavaScript_002ECodeStyle_002ESettingsUpgrade_002EJsParsFormattingSettingsUpgrader/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002EJavaScript_002ECodeStyle_002ESettingsUpgrade_002EJsWrapperSettingsUpgrader/@EntryIndexedValue">True</s:Boolean>