瀏覽代碼

【优化】增加tcp支持

johnclot69 1 年之前
父節點
當前提交
16caab9436

+ 7 - 5
DotNet/Hotfix/Helper/SceneFactory.cs

@@ -18,8 +18,10 @@ namespace ET.Server
                     // 云服务器中,一般来说router要单独部署,不过大家经常放在一起,那么下面要修改
                     // startSceneConfig.OuterIPPort改成startSceneConfig.InnerIPOutPort
                     // 然后云服务器防火墙把端口映射过来
-                    scene.AddComponent<RouterComponent, IPEndPoint, string>(startSceneConfig.InnerIPOutPort,
-                        startSceneConfig.StartProcessConfig.InnerIP
+                    scene.AddComponent<RouterComponent, IPEndPoint, string, NetworkProtocol>(
+                        startSceneConfig.InnerIPOutPort,
+                        startSceneConfig.StartProcessConfig.InnerIP,
+                        NetworkProtocol.TCP
                     );
                     break;
                 case SceneType.RouterManager: // 正式发布请用CDN代替RouterManager
@@ -27,14 +29,14 @@ namespace ET.Server
                     scene.AddComponent<HttpComponent, string>($"http://+:{startSceneConfig.OuterPort}/");
                     break;
                 case SceneType.Realm:
-                    scene.AddComponent<NetServerComponent, IPEndPoint>(startSceneConfig.InnerIPOutPort);
+                    scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.InnerIPOutPort, NetworkProtocol.KCP);
                     scene.AddComponent<UserSessionComponent>();
                     break;
                 case SceneType.Game:
                     ConstGame.GameServerId = startSceneConfig.Id;
                     ConstGame.GameServerUUID = System.Guid.NewGuid().ToString();
 
-                    scene.AddComponent<NetServerComponent, IPEndPoint>(startSceneConfig.InnerIPOutPort);
+                    scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.InnerIPOutPort, NetworkProtocol.KCP);
                     scene.AddComponent<GameTokenInfoComponent>();
                     scene.AddComponent<GamePlayerComponent>();
                     scene.AddComponent<GameMapComponent>();
@@ -50,7 +52,7 @@ namespace ET.Server
                     break;
                 case SceneType.BenchmarkServer:
                     scene.AddComponent<BenchmarkServerComponent>();
-                    scene.AddComponent<NetServerComponent, IPEndPoint>(startSceneConfig.OuterIPPort);
+                    scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.OuterIPPort, NetworkProtocol.KCP);
                     break;
                 case SceneType.BenchmarkClient:
                     scene.AddComponent<BenchmarkClientComponent>();

+ 16 - 9
DotNet/Hotfix/Module/Message/NetInnerComponentSystem.cs

@@ -7,12 +7,13 @@ namespace ET.Server
     public static class NetInnerComponentSystem
     {
         [ObjectSystem]
-        public class NetInnerComponentAwakeSystem: AwakeSystem<NetInnerComponent>
+        public class NetInnerComponentAwakeSystem: AwakeSystem<NetInnerComponent, NetworkProtocol>
         {
-            protected override void Awake(NetInnerComponent self)
+            protected override void Awake(NetInnerComponent self, NetworkProtocol protocol)
             {
+                self.InnerProtocol = protocol;
                 NetInnerComponent.Instance = self;
-            
+
                 switch (self.InnerProtocol)
                 {
                     case NetworkProtocol.TCP:
@@ -26,19 +27,20 @@ namespace ET.Server
                         break;
                     }
                 }
-                
+
                 NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
                 NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);
             }
         }
 
         [ObjectSystem]
-        public class NetInnerComponentAwake1System: AwakeSystem<NetInnerComponent, IPEndPoint>
+        public class NetInnerComponentAwake1System: AwakeSystem<NetInnerComponent, IPEndPoint, NetworkProtocol>
         {
-            protected override void Awake(NetInnerComponent self, IPEndPoint address)
+            protected override void Awake(NetInnerComponent self, IPEndPoint address, NetworkProtocol protocol)
             {
+                self.InnerProtocol = protocol;
                 NetInnerComponent.Instance = self;
-                
+
                 switch (self.InnerProtocol)
                 {
                     case NetworkProtocol.TCP:
@@ -52,7 +54,7 @@ namespace ET.Server
                         break;
                     }
                 }
-                
+
                 NetServices.Instance.RegisterAcceptCallback(self.ServiceId, self.OnAccept);
                 NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
                 NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);
@@ -75,7 +77,7 @@ namespace ET.Server
             {
                 return;
             }
-            
+
             session.LastRecvTime = TimeHelper.ClientFrameTime();
 
             self.HandleMessage(actorId, message);
@@ -131,5 +133,10 @@ namespace ET.Server
             session = self.CreateInner(channelId, ipEndPoint);
             return session;
         }
+
+        public static NetworkProtocol GetProtocol(this NetInnerComponent self)
+        {
+            return self.InnerProtocol;
+        }
     }
 }

+ 15 - 3
DotNet/Hotfix/Module/Message/NetServerComponentSystem.cs

@@ -6,11 +6,23 @@ namespace ET.Server
     public static class NetServerComponentSystem
     {
         [ObjectSystem]
-        public class AwakeSystem: AwakeSystem<NetServerComponent, IPEndPoint>
+        public class AwakeSystem: AwakeSystem<NetServerComponent, IPEndPoint, NetworkProtocol>
         {
-            protected override void Awake(NetServerComponent self, IPEndPoint address)
+            protected override void Awake(NetServerComponent self, IPEndPoint address, NetworkProtocol protocol)
             {
-                self.ServiceId = NetServices.Instance.AddService(new KService(address, ServiceType.Outer));
+                switch (protocol)
+                {
+                    case NetworkProtocol.KCP:
+                    {
+                        self.ServiceId = NetServices.Instance.AddService(new KService(address, ServiceType.Outer));
+                        break;
+                    }
+                    case NetworkProtocol.TCP:
+                    {
+                        self.ServiceId = NetServices.Instance.AddService(new TService(address, ServiceType.Outer));
+                        break;
+                    }
+                }
                 NetServices.Instance.RegisterAcceptCallback(self.ServiceId, self.OnAccept);
                 NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
                 NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);

+ 58 - 21
DotNet/Hotfix/Module/Router/RouterComponentSystem.cs

@@ -10,35 +10,72 @@ namespace ET.Server
     public static class RouterComponentSystem
     {
         [ObjectSystem]
-        public class RandomGeneratorponentAwakeSystem: AwakeSystem<RouterComponent, IPEndPoint, string>
+        public class RandomGeneratorponentAwakeSystem: AwakeSystem<RouterComponent, IPEndPoint, string, NetworkProtocol>
         {
-            protected override void Awake(RouterComponent self, IPEndPoint ipEndPoint, string innerIP)
+            protected override void Awake(RouterComponent self, IPEndPoint ipEndPoint, string innerIP, NetworkProtocol protocol)
             {
-                self.OuterSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
-                self.OuterSocket.Bind(new IPEndPoint(IPAddress.Any, ipEndPoint.Port));
-                if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+                switch (protocol)
                 {
-                    self.OuterSocket.SendBufferSize = 16 * Kcp.OneM;
-                    self.OuterSocket.ReceiveBufferSize = 16 * Kcp.OneM;
-                }
+                    case NetworkProtocol.KCP:
+                    {
+                        self.OuterSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+                        self.OuterSocket.Bind(new IPEndPoint(IPAddress.Any, ipEndPoint.Port));
 
-                self.InnerSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
-                self.InnerSocket.Bind(new IPEndPoint(IPAddress.Any, 0));
+                        if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+                        {
+                            self.OuterSocket.SendBufferSize = 16 * Kcp.OneM;
+                            self.OuterSocket.ReceiveBufferSize = 16 * Kcp.OneM;
+                        }
 
-                if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
-                {
-                    self.InnerSocket.SendBufferSize = 16 * Kcp.OneM;
-                    self.InnerSocket.ReceiveBufferSize = 16 * Kcp.OneM;
+                        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                        {
+                            const uint IOC_IN = 0x80000000;
+                            const uint IOC_VENDOR = 0x18000000;
+                            uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
+
+                            self.OuterSocket.IOControl((int) SIO_UDP_CONNRESET, new[] { Convert.ToByte(false) }, null);
+                            // self.InnerSocket.IOControl((int) SIO_UDP_CONNRESET, new[] { Convert.ToByte(false) }, null);
+                        }
+                        break;
+                    }
+                    case NetworkProtocol.TCP:
+                    {
+                        self.OuterSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
+                        self.OuterSocket.Bind(new IPEndPoint(IPAddress.Any, ipEndPoint.Port));
+                        break;
+                    }
                 }
 
-                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                NetworkProtocol innerProtocol = NetInnerComponent.Instance.GetProtocol();
+                switch (innerProtocol)
                 {
-                    const uint IOC_IN = 0x80000000;
-                    const uint IOC_VENDOR = 0x18000000;
-                    uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
+                    case NetworkProtocol.KCP:
+                    {
+                        self.InnerSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+                        self.InnerSocket.Bind(new IPEndPoint(IPAddress.Any, 0));
+
+                        if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+                        {
+                            self.InnerSocket.SendBufferSize = 16 * Kcp.OneM;
+                            self.InnerSocket.ReceiveBufferSize = 16 * Kcp.OneM;
+                        }
+
+                        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                        {
+                            const uint IOC_IN = 0x80000000;
+                            const uint IOC_VENDOR = 0x18000000;
+                            uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
 
-                    self.OuterSocket.IOControl((int) SIO_UDP_CONNRESET, new[] { Convert.ToByte(false) }, null);
-                    self.InnerSocket.IOControl((int) SIO_UDP_CONNRESET, new[] { Convert.ToByte(false) }, null);
+                            self.InnerSocket.IOControl((int) SIO_UDP_CONNRESET, new[] { Convert.ToByte(false) }, null);
+                        }
+                        break;
+                    }
+                    case NetworkProtocol.TCP:
+                    {
+                        self.InnerSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
+                        self.InnerSocket.Bind(new IPEndPoint(IPAddress.Any, 0));
+                        break;
+                    }
                 }
             }
         }
@@ -658,4 +695,4 @@ namespace ET.Server
             routerNode.Dispose();
         }
     }
-}
+}

+ 10 - 4
DotNet/Hotfix/Scenes/EntryEvent2_InitServer.cs

@@ -5,9 +5,9 @@ using ET;
 namespace ET.Server
 {
     [Event(SceneType.Process)]
-    public class EntryEvent2_InitServer: BEvent<ET.EventType.EntryEvent2>
+    public class EntryEvent2_InitServer: BEvent<EventType.EntryEvent2>
     {
-        protected override async ETTask OnEvent(ET.EventType.EntryEvent2 args)
+        protected override async ETTask OnEvent(EventType.EntryEvent2 args)
         {
             Root.Instance.Scene.AddComponent<AIDispatcherComponent>();
             // 发送普通actor消息
@@ -29,7 +29,10 @@ namespace ET.Server
             {
                 case AppType.Server:
                 {
-                    Root.Instance.Scene.AddComponent<NetInnerComponent, IPEndPoint>(processConfig.InnerIPPort);
+                    Root.Instance.Scene.AddComponent<NetInnerComponent, IPEndPoint, NetworkProtocol>(
+                        processConfig.InnerIPPort,
+                        NetworkProtocol.KCP
+                    );
 
                     var processScenes = StartSceneConfigCategory.Instance.GetByProcess(Options.Instance.Process);
                     foreach (StartSceneConfig startConfig in processScenes)
@@ -44,7 +47,10 @@ namespace ET.Server
                     StartMachineConfig startMachineConfig = WatcherHelper.GetThisMachineConfig();
                     WatcherComponent watcherComponent = Root.Instance.Scene.AddComponent<WatcherComponent>();
                     watcherComponent.Start(Options.Instance.CreateScenes);
-                    Root.Instance.Scene.AddComponent<NetInnerComponent, IPEndPoint>(NetworkHelper.ToIPEndPoint($"{startMachineConfig.InnerIP}:{startMachineConfig.WatcherPort}"));
+                    Root.Instance.Scene.AddComponent<NetInnerComponent, IPEndPoint, NetworkProtocol>(
+                        NetworkHelper.ToIPEndPoint($"{startMachineConfig.InnerIP}:{startMachineConfig.WatcherPort}"),
+                        NetworkProtocol.KCP
+                    );
                     break;
                 }
                 case AppType.GameTool:

+ 4 - 4
DotNet/Model/Module/Message/NetInnerComponent.cs

@@ -15,7 +15,7 @@ namespace ET.Server
             this.ActorId = instanceIdStruct.ToLong();
         }
     }
-    
+
     public class NetInnerComponentOnRead
     {
         public long ActorId;
@@ -28,12 +28,12 @@ namespace ET.Server
             return Static;
         }
     }
-    
+
     [ComponentOf(typeof(Scene))]
-    public class NetInnerComponent: Entity, IAwake<IPEndPoint>, IAwake, IDestroy
+    public class NetInnerComponent: Entity, IAwake<NetworkProtocol>, IAwake<IPEndPoint, NetworkProtocol>, IDestroy
     {
         public int ServiceId;
-        
+
         public NetworkProtocol InnerProtocol = NetworkProtocol.KCP;
 
         [StaticField]

+ 2 - 2
DotNet/Model/Module/Message/NetServerComponent.cs

@@ -14,9 +14,9 @@ namespace ET.Server
             return Static;
         }
     }
-    
+
     [ComponentOf(typeof(Scene))]
-    public class NetServerComponent: Entity, IAwake<IPEndPoint>, IDestroy
+    public class NetServerComponent: Entity, IAwake<IPEndPoint, NetworkProtocol>, IDestroy
     {
         public int ServiceId;
     }

+ 3 - 3
DotNet/Model/Module/Router/RouterComponent.cs

@@ -5,9 +5,9 @@ using System.Net.Sockets;
 
 namespace ET.Server
 {
-    
+
     [ComponentOf(typeof(Scene))]
-    public class RouterComponent: Entity, IAwake<IPEndPoint, string>, IDestroy, IUpdate
+    public class RouterComponent: Entity, IAwake<IPEndPoint, string, NetworkProtocol>, IDestroy, IUpdate
     {
         public Socket OuterSocket;
         public Socket InnerSocket;
@@ -22,4 +22,4 @@ namespace ET.Server
 
         public long LastCheckTime = 0;
     }
-}
+}

+ 10 - 5
Unity/Assets/Scripts/Codes/Hotfix/Client/Login/LoginHelper.cs

@@ -25,17 +25,20 @@ namespace ET.Client
                 clientScene.RemoveComponent<SessionComponent>();
 
                 // 获取路由跟realmDispatcher地址
-                var routerAddressComponent =
-                        clientScene.AddComponent<RouterAddressComponent, string, int>(ip, port);
+                var routerAddressComponent = clientScene.AddComponent<RouterAddressComponent, string, int>(ip, port);
                 await routerAddressComponent.Init();
 
-                clientScene.AddComponent<NetClientComponent, AddressFamily>(routerAddressComponent.RouterManagerIPAddress.AddressFamily);
+                clientScene.AddComponent<NetClientComponent, AddressFamily, NetworkProtocol>(
+                    routerAddressComponent.RouterManagerIPAddress.AddressFamily,
+                    NetworkProtocol.KCP
+                );
                 //如果有多个网关地址,则通过roomid弄点花样模拟随机获取一个地址
                 IPEndPoint realmAddress = routerAddressComponent.GetRealmAddress( strRoomid );
 
                 // 登陆验证
                 R2C_Login r2CLogin;
-                using (Session session = await RouterHelper.CreateRouterSession(clientScene, realmAddress))
+                using (Session session = clientScene.GetComponent<NetClientComponent>().Create(realmAddress))
+                // using (Session session = await RouterHelper.CreateRouterSession(clientScene, realmAddress))
                 {
                     r2CLogin = (R2C_Login)await session.Call(new C2R_Login() { RoomId = strRoomid } );
                 }
@@ -47,7 +50,8 @@ namespace ET.Client
                 }
 
                 // 创建一个gate Session,并且保存到SessionComponent中
-                Session gateSession = await RouterHelper.CreateRouterSession(clientScene, NetworkHelper.ToIPEndPoint(r2CLogin.Address[0]));
+                Session gateSession = clientScene.GetComponent<NetClientComponent>().Create(NetworkHelper.ToIPEndPoint(r2CLogin.Address[0]));
+                // Session gateSession = await RouterHelper.CreateRouterSession(clientScene, NetworkHelper.ToIPEndPoint(r2CLogin.Address[0]));
 
                 // 登陆gate
                 G2C_LoginGame g2CLoginGate = (G2C_LoginGame)await gateSession.Call(new C2G_LoginGame() { Token = r2CLogin.Token });
@@ -59,6 +63,7 @@ namespace ET.Client
                 }
 
                 // 保存账号信息
+                gateSession.AddComponent<PingComponent>();
                 clientScene.AddComponent<SessionComponent>().Session = gateSession;
                 var player = clientScene.GetComponent<PlayerComponent>();
                 player.Token = r2CLogin.Token;

+ 15 - 3
Unity/Assets/Scripts/Codes/Hotfix/Client/Module/Message/NetClientComponentSystem.cs

@@ -7,11 +7,23 @@ namespace ET.Client
     public static class NetClientComponentSystem
     {
         [ObjectSystem]
-        public class AwakeSystem: AwakeSystem<NetClientComponent, AddressFamily>
+        public class AwakeSystem: AwakeSystem<NetClientComponent, AddressFamily, NetworkProtocol>
         {
-            protected override void Awake(NetClientComponent self, AddressFamily addressFamily)
+            protected override void Awake(NetClientComponent self, AddressFamily addressFamily, NetworkProtocol protocol)
             {
-                self.ServiceId = NetServices.Instance.AddService(new KService(addressFamily, ServiceType.Outer));
+                switch (protocol)
+                {
+                    case NetworkProtocol.KCP:
+                    {
+                        self.ServiceId = NetServices.Instance.AddService(new KService(addressFamily, ServiceType.Outer));
+                        break;
+                    }
+                    case NetworkProtocol.TCP:
+                    {
+                        self.ServiceId = NetServices.Instance.AddService(new TService(addressFamily, ServiceType.Outer));
+                        break;
+                    }
+                }
                 NetServices.Instance.RegisterReadCallback(self.ServiceId, self.OnRead);
                 NetServices.Instance.RegisterErrorCallback(self.ServiceId, self.OnError);
             }

+ 2 - 2
Unity/Assets/Scripts/Codes/Model/Client/Message/NetClientComponent.cs

@@ -15,9 +15,9 @@ namespace ET.Client
             return Static;
         }
     }
-    
+
     [ComponentOf(typeof(Scene))]
-    public class NetClientComponent: Entity, IAwake<AddressFamily>, IDestroy
+    public class NetClientComponent: Entity, IAwake<AddressFamily, NetworkProtocol>, IDestroy
     {
         public int ServiceId;
     }