Explorar el Código

整理网络代码

tanghai hace 3 años
padre
commit
7dabee634b

+ 2 - 1
.gitignore

@@ -56,7 +56,8 @@ Server/.DS_Store
 /Unity/Assets/Bundles/Code/Code.pdb.bytes
 /Unity/Assets/Bundles/Code/Code.pdb.bytes.meta
 /Unity/Assembly-CSharp.csproj
-/Unity/Assets/Config/Excel/~$*.xlsx
+~$*.xlsx
+~$*.xlsx.meta
 /.vscode
 /Unity/UserSettings/Search.settings
 /Unity/Unity.Hotfix.csproj

+ 1 - 1
DotNet/Core/DotNet.Core.csproj

@@ -18,7 +18,7 @@
       <DefineConstants>DOTNET</DefineConstants>
       <OutputPath>..\..\Bin\</OutputPath>
       <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-      <Optimize>true</Optimize>
+      <Optimize>false</Optimize>
     </PropertyGroup>
 
     <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">  

+ 1 - 1
DotNet/Model/DotNet.Model.csproj

@@ -14,7 +14,7 @@
         <OutputPath>..\..\Bin\</OutputPath> 
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
         <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-        <Optimize>true</Optimize>
+        <Optimize>false</Optimize>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> 
         <DefineConstants>DOTNET</DefineConstants>

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Client/Demo/Router/RouterHelper.cs

@@ -45,7 +45,7 @@ namespace ET.Client
             
             using Socket socket = new Socket(routerAddress.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
             
-            int count = 30;
+            int count = 10;
             byte[] sendCache = new byte[512];
             byte[] recvCache = new byte[512];
 

+ 4 - 5
Unity/Assets/Scripts/Codes/Hotfix/Client/Module/Message/NetClientComponentSystem.cs

@@ -11,8 +11,7 @@ namespace ET.Client
         {
             protected override void Awake(NetClientComponent self, AddressFamily addressFamily)
             {
-                KService kService = new KService(addressFamily, ServiceType.Outer);
-                self.ServiceId = NetThreadComponent.Instance.Add(kService);
+                self.ServiceId = NetServices.Instance.AddService(new KService(addressFamily, ServiceType.Outer));
                 NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
                 NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);
             }
@@ -23,7 +22,7 @@ namespace ET.Client
         {
             protected override void Destroy(NetClientComponent self)
             {
-                NetThreadComponent.Instance.Remove(self.ServiceId);
+                NetServices.Instance.RemoveService(self.ServiceId);
             }
         }
 
@@ -63,7 +62,7 @@ namespace ET.Client
             {
                 session.AddComponent<SessionIdleCheckerComponent>();
             }
-            NetServices.Instance.GetChannel(self.ServiceId, session.Id, realIPEndPoint);
+            NetServices.Instance.CreateChannel(self.ServiceId, session.Id, realIPEndPoint);
 
             return session;
         }
@@ -77,7 +76,7 @@ namespace ET.Client
             {
                 session.AddComponent<SessionIdleCheckerComponent>();
             }
-            NetServices.Instance.GetChannel(self.ServiceId, session.Id, routerIPEndPoint);
+            NetServices.Instance.CreateChannel(self.ServiceId, session.Id, routerIPEndPoint);
 
             return session;
         }

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Benchmark/BenchmarkClientComponentSystem.cs

@@ -27,7 +27,7 @@ namespace ET.Server
             NetClientComponent netClientComponent = scene.AddComponent<NetClientComponent, AddressFamily>(AddressFamily.InterNetwork);
 
             using Session session = netClientComponent.Create(StartSceneConfigCategory.Instance.BenchmarkServer.OuterIPPort);
-            List<ETTask<IResponse>> list = new List<ETTask<IResponse>>(100000);
+            List<ETTask<IResponse>> list = new List<ETTask<IResponse>>(10000);
             for (int j = 0; j < 100000000; ++j)
             {
                 list.Clear();

+ 35 - 21
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Message/NetInnerComponentSystem.cs

@@ -13,8 +13,20 @@ namespace ET.Server
             {
                 NetInnerComponent.Instance = self;
             
-                KService kService = new KService(AddressFamily.InterNetwork, ServiceType.Inner);
-                self.ServiceId = NetThreadComponent.Instance.Add(kService);
+                switch (self.InnerProtocol)
+                {
+                    case NetworkProtocol.TCP:
+                    {
+                        self.ServiceId = NetServices.Instance.AddService(new TService(AddressFamily.InterNetwork, ServiceType.Inner));
+                        break;
+                    }
+                    case NetworkProtocol.KCP:
+                    {
+                        self.ServiceId = NetServices.Instance.AddService(new KService(AddressFamily.InterNetwork, ServiceType.Inner));
+                        break;
+                    }
+                }
+                
                 NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
                 NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);
             }
@@ -26,9 +38,21 @@ namespace ET.Server
             protected override void Awake(NetInnerComponent self, IPEndPoint address)
             {
                 NetInnerComponent.Instance = self;
-
-                KService kService = new KService(address, ServiceType.Inner);
-                self.ServiceId = NetThreadComponent.Instance.Add(kService);
+                
+                switch (self.InnerProtocol)
+                {
+                    case NetworkProtocol.TCP:
+                    {
+                        self.ServiceId = NetServices.Instance.AddService(new TService(address, ServiceType.Inner));
+                        break;
+                    }
+                    case NetworkProtocol.KCP:
+                    {
+                        self.ServiceId = NetServices.Instance.AddService(new KService(address, ServiceType.Inner));
+                        break;
+                    }
+                }
+                
                 NetServices.Instance.RegisterAcceptCallback(self.ServiceId, self.OnAccept);
                 NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
                 NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);
@@ -40,7 +64,7 @@ namespace ET.Server
         {
             protected override void Destroy(NetInnerComponent self)
             {
-                NetThreadComponent.Instance.Remove(self.ServiceId);
+                NetServices.Instance.RemoveService(self.ServiceId);
             }
         }
 
@@ -79,22 +103,11 @@ namespace ET.Server
             //session.AddComponent<SessionIdleCheckerComponent, int, int, int>(NetThreadComponent.checkInteral, NetThreadComponent.recvMaxIdleTime, NetThreadComponent.sendMaxIdleTime);
         }
 
-        // 这个channelId是由CreateConnectChannelId生成的
-        public static Session Create(this NetInnerComponent self, IPEndPoint ipEndPoint)
-        {
-            uint localConn = NetServices.Instance.CreateRandomLocalConn();
-            long channelId = NetServices.Instance.CreateConnectChannelId(localConn);
-            Session session = self.CreateInner(channelId, ipEndPoint);
-            return session;
-        }
-
         private static Session CreateInner(this NetInnerComponent self, long channelId, IPEndPoint ipEndPoint)
         {
             Session session = self.AddChildWithId<Session, int>(channelId, self.ServiceId);
-
             session.RemoteAddress = ipEndPoint;
-
-            NetServices.Instance.GetChannel(self.ServiceId, channelId, ipEndPoint);
+            NetServices.Instance.CreateChannel(self.ServiceId, channelId, ipEndPoint);
 
             //session.AddComponent<InnerPingComponent>();
             //session.AddComponent<SessionIdleCheckerComponent, int, int, int>(NetThreadComponent.checkInteral, NetThreadComponent.recvMaxIdleTime, NetThreadComponent.sendMaxIdleTime);
@@ -106,12 +119,13 @@ namespace ET.Server
         public static Session Get(this NetInnerComponent self, long channelId)
         {
             Session session = self.GetChild<Session>(channelId);
-            if (session == null)
+            if (session != null)
             {
-                IPEndPoint ipEndPoint = StartProcessConfigCategory.Instance.Get((int) channelId).InnerIPPort;
-                session = self.CreateInner(channelId, ipEndPoint);
+                return session;
             }
 
+            IPEndPoint ipEndPoint = StartProcessConfigCategory.Instance.Get((int) channelId).InnerIPPort;
+            session = self.CreateInner(channelId, ipEndPoint);
             return session;
         }
     }

+ 2 - 9
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Message/NetServerComponentSystem.cs

@@ -10,8 +10,7 @@ namespace ET.Server
         {
             protected override void Awake(NetServerComponent self, IPEndPoint address)
             {
-                KService kService = new KService(address, ServiceType.Outer);
-                self.ServiceId = NetThreadComponent.Instance.Add(kService);
+                self.ServiceId = NetServices.Instance.AddService(new KService(address, ServiceType.Outer));
                 NetServices.Instance.RegisterAcceptCallback(self.ServiceId, self.OnAccept);
                 NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
                 NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);
@@ -23,7 +22,7 @@ namespace ET.Server
         {
             protected override void Destroy(NetServerComponent self)
             {
-                NetThreadComponent.Instance.Remove(self.ServiceId);
+                NetServices.Instance.RemoveService(self.ServiceId);
             }
         }
 
@@ -53,12 +52,6 @@ namespace ET.Server
                 session.AddComponent<SessionIdleCheckerComponent>();
             }
         }
-
-        public static Session Get(this NetServerComponent self, long id)
-        {
-            Session session = self.GetChild<Session>(id);
-            return session;
-        }
         
         private static void OnRead(this NetServerComponent self, long channelId, long actorId, object message)
         {

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Router/RouterComponentSystem.cs

@@ -317,7 +317,7 @@ namespace ET.Server
                         break;
                     }
 
-                    if (++kcpRouter.SyncCount > 40)
+                    if (++kcpRouter.SyncCount > 10)
                     {
                         self.OnError(kcpRouter.Id, ErrorCore.ERR_KcpRouterSyncCountTooMuchTimes);
                         break;

+ 1 - 13
Unity/Assets/Scripts/Codes/Hotfix/Share/Module/Message/NetThreadComponentSystem.cs

@@ -15,7 +15,6 @@ namespace ET
 
                 // 网络线程
                 self.thread = new Thread(self.NetThreadUpdate);
-                
                 self.thread.Start();
             }
         }
@@ -36,6 +35,7 @@ namespace ET
             {
                 NetThreadComponent.Instance = null;
                 self.isStop = true;
+                self.thread.Join(1000);
             }
         }
 
@@ -54,17 +54,5 @@ namespace ET
                 Thread.Sleep(1);
             }
         }
-
-        public static int Add(this NetThreadComponent self, AService service)
-        {
-            service.Id = ++self.serviceIdGenerator;
-            NetServices.Instance.AddService(service);
-            return service.Id;
-        }
-        
-        public static void Remove(this NetThreadComponent self, int serviceId)
-        {
-            NetServices.Instance.RemoveService(serviceId);
-        }
     }
 }

+ 1 - 3
Unity/Assets/Scripts/Codes/Model/Client/Module/Message/NetClientComponent.cs

@@ -1,6 +1,4 @@
-using System.Net;
-using System.Net.Sockets;
-using ET.Server;
+using System.Net.Sockets;
 
 namespace ET.Client
 {

+ 3 - 4
Unity/Assets/Scripts/Codes/Model/Server/Module/Message/NetInnerComponent.cs

@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Net;
+using System.Net;
 
 namespace ET.Server
 {
@@ -30,6 +27,8 @@ namespace ET.Server
     public class NetInnerComponent: Entity, IAwake<IPEndPoint>, IAwake, IDestroy
     {
         public int ServiceId;
+        
+        public NetworkProtocol InnerProtocol = NetworkProtocol.KCP;
 
         [StaticField]
         public static NetInnerComponent Instance;

+ 1 - 2
Unity/Assets/Scripts/Codes/Model/Share/Module/Message/NetThreadComponent.cs

@@ -7,8 +7,7 @@ namespace ET
     {
         [StaticField]
         public static NetThreadComponent Instance;
-
-        public int serviceIdGenerator;
+        
         public Thread thread;
         public bool isStop;
     }

+ 1 - 1
Unity/Assets/Scripts/Core/Module/Network/AService.cs

@@ -20,7 +20,7 @@ namespace ET
         
         public abstract bool IsDispose();
 
-        public abstract void Get(long id, IPEndPoint address);
+        public abstract void Create(long id, IPEndPoint address);
 
         public abstract void Send(long channelId, long actorId, MemoryStream stream);
     }

+ 3 - 2
Unity/Assets/Scripts/Core/Module/Network/KService.cs

@@ -160,7 +160,7 @@ namespace ET
         // 记录最小时间,不用每次都去MultiMap取第一个值
         private long minTime;
 
-        private List<long> waitRemoveChannels = new List<long>();
+        private readonly List<long> waitRemoveChannels = new List<long>();
 
         public override bool IsDispose()
         {
@@ -292,6 +292,7 @@ namespace ET
                             this.waitConnectChannels.TryGetValue(remoteConn, out kChannel);
                             if (kChannel == null)
                             {
+                                // accept的localConn不能与内网进程号的ChannelId冲突,所以设置为一个大的随机数
                                 localConn = NetServices.Instance.CreateRandomLocalConn();
                                 // 已存在同样的localConn,则不处理,等待下次sync
                                 if (this.localConnChannels.ContainsKey(localConn))
@@ -438,7 +439,7 @@ namespace ET
             return channel;
         }
 
-        public override void Get(long id, IPEndPoint address)
+        public override void Create(long id, IPEndPoint address)
         {
             if (this.idChannels.TryGetValue(id, out KChannel kChannel))
             {

+ 49 - 38
Unity/Assets/Scripts/Core/Module/Network/NetServices.cs

@@ -7,6 +7,13 @@ using System.Threading.Tasks;
 
 namespace ET
 {
+    public enum NetworkProtocol
+    {
+        TCP,
+        KCP,
+        Websocket,
+    }
+    
     public enum NetOp: byte
     {
         AddService = 1,
@@ -14,7 +21,7 @@ namespace ET
         OnAccept = 3,
         OnRead = 4,
         OnError = 5,
-        GetOrCreate = 6,
+        CreateChannel = 6,
         RemoveChannel = 7,
         SendStream = 8,
         SendMessage = 9,
@@ -33,21 +40,34 @@ namespace ET
 
     public class NetServices: Singleton<NetServices>
     {
-        private readonly Dictionary<int, AService> services = new Dictionary<int, AService>();
-
-        private readonly Queue<int> queue = new Queue<int>();
-        
-        // 初始化后不变,所以主线程,网络线程都可以读
-        private readonly DoubleMap<Type, ushort> typeOpcode = new DoubleMap<Type, ushort>();
-
         private readonly ConcurrentQueue<NetOperator> netThreadOperators = new ConcurrentQueue<NetOperator>();
         private readonly ConcurrentQueue<NetOperator> mainThreadOperators = new ConcurrentQueue<NetOperator>();
 
-        private readonly Dictionary<int, Action<long, IPEndPoint>> acceptCallback = new Dictionary<int, Action<long, IPEndPoint>>();
-        private readonly Dictionary<int, Action<long, long, object>> readCallback = new Dictionary<int, Action<long, long, object>>();
-        private readonly Dictionary<int, Action<long, int>> errorCallback = new Dictionary<int, Action<long, int>>();
+        public NetServices()
+        {
+            HashSet<Type> types = EventSystem.Instance.GetTypes(typeof (MessageAttribute));
+            foreach (Type type in types)
+            {
+                object[] attrs = type.GetCustomAttributes(typeof (MessageAttribute), false);
+                if (attrs.Length == 0)
+                {
+                    continue;
+                }
+
+                MessageAttribute messageAttribute = attrs[0] as MessageAttribute;
+                if (messageAttribute == null)
+                {
+                    continue;
+                }
+
+                this.typeOpcode.Add(type, messageAttribute.Opcode);
+            }
+        }
 
 #region 线程安全
+        
+        // 初始化后不变,所以主线程,网络线程都可以读
+        private readonly DoubleMap<Type, ushort> typeOpcode = new DoubleMap<Type, ushort>();
 
         public ushort GetOpcode(Type type)
         {
@@ -59,9 +79,10 @@ namespace ET
             return this.typeOpcode.GetKeyByValue(opcode);
         }
         
+        // 防止与内网进程号的ChannelId冲突,所以设置为一个大的随机数
         public uint CreateRandomLocalConn()
         {
-            return (1u << 30) | RandomGenerator.RandUInt32();
+            return (1u << 31) | RandomGenerator.RandUInt32();
         }
 
 #endregion
@@ -70,33 +91,18 @@ namespace ET
         
 #region 主线程
         
+        private readonly Dictionary<int, Action<long, IPEndPoint>> acceptCallback = new Dictionary<int, Action<long, IPEndPoint>>();
+        private readonly Dictionary<int, Action<long, long, object>> readCallback = new Dictionary<int, Action<long, long, object>>();
+        private readonly Dictionary<int, Action<long, int>> errorCallback = new Dictionary<int, Action<long, int>>();
+        
+        private int serviceIdGenerator;
+        
         // localConn放在低32bit
         private long connectIdGenerater = int.MaxValue;
         public long CreateConnectChannelId(uint localConn)
         {
             return (--this.connectIdGenerater << 32) | localConn;
         }
-        
-        public NetServices()
-        {
-            HashSet<Type> types = EventSystem.Instance.GetTypes(typeof (MessageAttribute));
-            foreach (Type type in types)
-            {
-                object[] attrs = type.GetCustomAttributes(typeof (MessageAttribute), false);
-                if (attrs.Length == 0)
-                {
-                    continue;
-                }
-
-                MessageAttribute messageAttribute = attrs[0] as MessageAttribute;
-                if (messageAttribute == null)
-                {
-                    continue;
-                }
-
-                this.typeOpcode.Add(type, messageAttribute.Opcode);
-            }
-        }
 
         public async Task<(uint, uint)> GetKChannelConn(int serviceId, long channelId)
         {
@@ -124,10 +130,12 @@ namespace ET
             this.netThreadOperators.Enqueue(netOperator);
         }
 
-        public void AddService(AService aService)
+        public int AddService(AService aService)
         {
+            aService.Id = ++this.serviceIdGenerator;
             NetOperator netOperator = new NetOperator() { Op = NetOp.AddService, ServiceId = aService.Id, ChannelId = 0, Object = aService };
             this.netThreadOperators.Enqueue(netOperator);
+            return aService.Id;
         }
         
         public void RemoveService(int serviceId)
@@ -142,9 +150,9 @@ namespace ET
             this.netThreadOperators.Enqueue(netOperator);
         }
 
-        public void GetChannel(int serviceId, long channelId, IPEndPoint address)
+        public void CreateChannel(int serviceId, long channelId, IPEndPoint address)
         {
-            NetOperator netOperator = new NetOperator() { Op = NetOp.GetOrCreate, ServiceId = serviceId, ChannelId = channelId, Object = address};
+            NetOperator netOperator = new NetOperator() { Op = NetOp.CreateChannel, ServiceId = serviceId, ChannelId = channelId, Object = address};
             this.netThreadOperators.Enqueue(netOperator);
         }
 
@@ -219,6 +227,9 @@ namespace ET
 
 #region 网络线程
         
+        private readonly Dictionary<int, AService> services = new Dictionary<int, AService>();
+        private readonly Queue<int> queue = new Queue<int>();
+        
         private void Add(AService aService)
         {
             this.services[aService.Id] = aService;
@@ -268,10 +279,10 @@ namespace ET
                             this.Remove(op.ServiceId);
                             break;
                         }
-                        case NetOp.GetOrCreate:
+                        case NetOp.CreateChannel:
                         {
                             AService service = this.Get(op.ServiceId);
-                            service.Get(op.ChannelId, op.Object as IPEndPoint);
+                            service.Create(op.ChannelId, op.Object as IPEndPoint);
                             break;
                         }
                         case NetOp.RemoveChannel:

+ 1 - 1
Unity/Assets/Scripts/Core/Module/Network/TService.cs

@@ -110,7 +110,7 @@ namespace ET
 			return channel;
 		}
 
-		public override void Get(long id, IPEndPoint address)
+		public override void Create(long id, IPEndPoint address)
 		{
 			if (this.idChannels.TryGetValue(id, out TChannel _))
 			{

+ 1 - 1
Unity/Assets/Scripts/Core/Module/Network/WChannel.cs

@@ -245,7 +245,7 @@ namespace ET
         
         private void OnError(int error)
         {
-            Log.Debug($"WChannel error: {error} {this.RemoteAddress}");
+            Log.Info($"WChannel error: {error} {this.RemoteAddress}");
 			
             long channelId = this.Id;
 			

+ 1 - 1
Unity/Assets/Scripts/Core/Module/Network/WService.cs

@@ -126,7 +126,7 @@ namespace ET
             }
         }
         
-        public override void Get(long id, IPEndPoint address)
+        public override void Create(long id, IPEndPoint address)
         {
             throw new NotImplementedException();
         }