Explorar o código

修复CircularBuffer一个bug,KSerivce代码整理

tanghai %!s(int64=8) %!d(string=hai) anos
pai
achega
df38bf1342

+ 1 - 1
Client-Server.sln

@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.27130.0
+VisualStudioVersion = 15.0.27130.2003
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Plugins", "Unity\Unity.Plugins.csproj", "{D1FDB199-0FB7-099D-3771-C6A942E4E326}"
 EndProject

+ 1 - 1
Server/App/NLog.config

@@ -42,7 +42,7 @@
 			fileName="${basedir}/../Logs/Log-${var:appType}-${var:appId}-Error.txt"
 			deleteOldFileOnStartup="false"
 			layout="${longdate} ${var:appTypeFormat} ${var:appIdFormat} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
-		<target name="info" type="ColoredConsole"
+		<target name="error" type="ColoredConsole"
 			layout="${longdate} ${var:appTypeFormat} ${var:appIdFormat} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
 	</targets>
 	

+ 2 - 3
Server/Model/Component/BenchmarkComponent.cs

@@ -19,14 +19,13 @@ namespace Model
 
 		private long time1 = TimeHelper.ClientNow();
 
-		public async void Awake(IPEndPoint ipEndPoint)
+		public void Awake(IPEndPoint ipEndPoint)
 		{
 			try
 			{
 				NetOuterComponent networkComponent = Game.Scene.GetComponent<NetOuterComponent>();
-				for (int i = 0; i < 1000; i++)
+				for (int i = 0; i < 100; i++)
 				{
-					await Game.Scene.GetComponent<TimerComponent>().WaitAsync(100);
 					this.TestAsync(networkComponent, ipEndPoint, i);
 				}
 			}

+ 7 - 15
Unity/Assets/Scripts/Base/Network/Circularbuffer.cs

@@ -1,10 +1,9 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
 
 namespace Model
 {
-    public class Circularbuffer
+    public class CircularBuffer
     {
         public int ChunkSize = 8192;
 
@@ -15,22 +14,18 @@ namespace Model
         public int LastIndex { get; set; }
 
         public int FirstIndex { get; set; }
-
-        private byte[] firstBuffer;
-
+		
         private byte[] lastBuffer;
 
-        public Circularbuffer()
+        public CircularBuffer()
         {
             this.AddLast();
-            this.firstBuffer = bufferQueue.Peek();
         }
 
-        public Circularbuffer(int chunkSize)
+        public CircularBuffer(int chunkSize)
         {
             this.ChunkSize = chunkSize;
             this.AddLast();
-            this.firstBuffer = bufferQueue.Peek();
         }
 
         public int Count
@@ -72,8 +67,6 @@ namespace Model
         public void RemoveFirst()
         {
             this.bufferCache.Enqueue(bufferQueue.Dequeue());
-            if (this.bufferQueue.Count != 0)
-                this.firstBuffer = bufferQueue.Peek();
         }
 
         public byte[] First
@@ -84,8 +77,7 @@ namespace Model
                 {
                     this.AddLast();
                 }
-                this.firstBuffer = this.bufferQueue.Peek();
-                return this.firstBuffer;
+                return this.bufferQueue.Peek();
             }
         }
 
@@ -113,13 +105,13 @@ namespace Model
                 int n = count - alreadyCopyCount;
                 if (ChunkSize - this.FirstIndex > n)
                 {
-                    Array.Copy(this.firstBuffer, this.FirstIndex, buffer, alreadyCopyCount, n);
+                    Array.Copy(this.First, this.FirstIndex, buffer, alreadyCopyCount, n);
                     this.FirstIndex += n;
                     alreadyCopyCount += n;
                 }
                 else
                 {
-                    Array.Copy(this.firstBuffer, this.FirstIndex, buffer, alreadyCopyCount, ChunkSize - this.FirstIndex);
+                    Array.Copy(this.First, this.FirstIndex, buffer, alreadyCopyCount, ChunkSize - this.FirstIndex);
                     alreadyCopyCount += ChunkSize - this.FirstIndex;
                     this.FirstIndex = 0;
                     this.RemoveFirst();

+ 1 - 1
Unity/Assets/Scripts/Base/Network/KNet/KChannel.cs

@@ -13,7 +13,7 @@ namespace Model
 
 		private Kcp kcp;
 
-		private readonly Circularbuffer recvBuffer = new Circularbuffer(8 * 1024);
+		private readonly CircularBuffer recvBuffer = new CircularBuffer(8192);
 		private readonly Queue<byte[]> sendBuffer = new Queue<byte[]>();
 
 		private readonly PacketParser parser;

+ 47 - 29
Unity/Assets/Scripts/Base/Network/KNet/KService.cs

@@ -13,7 +13,7 @@ namespace Model
 		public const uint FIN = 3;
 	}
 
-	public sealed class KService: AService
+	public sealed class KService : AService
 	{
 		private uint IdGenerater = 1000;
 		private uint IdAccept = 2000000000;
@@ -21,7 +21,7 @@ namespace Model
 		public uint TimeNow { get; set; }
 
 		private UdpClient socket;
-		
+
 		private readonly Dictionary<long, KChannel> idChannels = new Dictionary<long, KChannel>();
 
 		private TaskCompletionSource<AChannel> acceptTcs;
@@ -39,8 +39,8 @@ namespace Model
 			this.TimeNow = (uint)TimeHelper.Now();
 			this.socket = new UdpClient(ipEndPoint);
 
-			uint IOC_IN = 0x80000000;
-			uint IOC_VENDOR = 0x18000000;
+			const uint IOC_IN = 0x80000000;
+			const uint IOC_VENDOR = 0x18000000;
 			uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
 			this.socket.Client.IOControl((int)SIO_UDP_CONNRESET, new[] { Convert.ToByte(false) }, null);
 
@@ -85,30 +85,48 @@ namespace Model
 					continue;
 				}
 
-				// accept
-				uint conn = BitConverter.ToUInt32(udpReceiveResult.Buffer, 0);
-				
-				// conn从1000开始,如果为1,2,3则是特殊包
-				if (conn == KcpProtocalType.SYN)
-				{
-					this.HandleAccept(udpReceiveResult);
-					continue;
-				}
-				
-				// connect response
-				if (conn == KcpProtocalType.ACK)
+				int messageLength = udpReceiveResult.Buffer.Length;
+
+				// 长度小于4,不是正常的消息
+				if (messageLength < 4)
 				{
-					this.HandleConnect(udpReceiveResult);
 					continue;
 				}
 
-				if (conn == KcpProtocalType.FIN)
+				// accept
+				uint conn = BitConverter.ToUInt32(udpReceiveResult.Buffer, 0);
+
+				// conn从1000开始,如果为1,2,3则是特殊包
+				switch (conn)
 				{
-					this.HandleDisConnect(udpReceiveResult);
-					continue;
+					case KcpProtocalType.SYN:
+						// 长度!=8,不是accpet消息
+						if (messageLength != 8)
+						{
+							break;
+						}
+						this.HandleAccept(udpReceiveResult);
+						break;
+					case KcpProtocalType.ACK:
+						// 长度!=12,不是connect消息
+						if (messageLength != 12)
+						{
+							break;
+						}
+						this.HandleConnect(udpReceiveResult);
+						break;
+					case KcpProtocalType.FIN:
+						// 长度!=12,不是DisConnect消息
+						if (messageLength != 12)
+						{
+							break;
+						}
+						this.HandleDisConnect(udpReceiveResult);
+						break;
+					default:
+						this.HandleRecv(udpReceiveResult, conn);
+						break;
 				}
-
-				this.HandleRecv(udpReceiveResult, conn);
 			}
 		}
 
@@ -116,7 +134,7 @@ namespace Model
 		{
 			uint requestConn = BitConverter.ToUInt32(udpReceiveResult.Buffer, 4);
 			uint responseConn = BitConverter.ToUInt32(udpReceiveResult.Buffer, 8);
-			
+
 			KChannel kChannel;
 			if (!this.idChannels.TryGetValue(requestConn, out kChannel))
 			{
@@ -129,7 +147,7 @@ namespace Model
 		private void HandleDisConnect(UdpReceiveResult udpReceiveResult)
 		{
 			uint requestConn = BitConverter.ToUInt32(udpReceiveResult.Buffer, 8);
-			
+
 			KChannel kChannel;
 			if (!this.idChannels.TryGetValue(requestConn, out kChannel))
 			{
@@ -159,7 +177,7 @@ namespace Model
 			}
 
 			uint requestConn = BitConverter.ToUInt32(udpReceiveResult.Buffer, 4);
-			
+
 			// 如果已经连接上,则重新响应请求
 			KChannel kChannel;
 			if (this.idChannels.TryGetValue(requestConn, out kChannel))
@@ -167,7 +185,7 @@ namespace Model
 				kChannel.HandleAccept(requestConn);
 				return;
 			}
-			
+
 			TaskCompletionSource<AChannel> t = this.acceptTcs;
 			this.acceptTcs = null;
 			kChannel = this.CreateAcceptChannel(udpReceiveResult.RemoteEndPoint, requestConn);
@@ -187,7 +205,7 @@ namespace Model
 			this.idChannels[channel.Id] = channel;
 			return channel;
 		}
-		
+
 		private KChannel CreateConnectChannel(IPEndPoint remoteEndPoint)
 		{
 			KChannel channel = new KChannel(++this.IdGenerater, this.socket, remoteEndPoint, this);
@@ -210,7 +228,7 @@ namespace Model
 		{
 			this.timerMap.Add(time, id);
 		}
-		
+
 		public override AChannel GetChannel(long id)
 		{
 			KChannel channel;
@@ -245,7 +263,7 @@ namespace Model
 			this.removedChannels.Enqueue(id);
 			channel.Dispose();
 		}
-		
+
 		public override void Update()
 		{
 			this.TimeNow = (uint)TimeHelper.Now();

+ 2 - 2
Unity/Assets/Scripts/Base/Network/TNet/PacketParser.cs

@@ -28,14 +28,14 @@ namespace Model
 
 	internal class PacketParser
 	{
-		private readonly Circularbuffer buffer;
+		private readonly CircularBuffer buffer;
 
 		private ushort packetSize;
 		private ParserState state;
 		private Packet packet = new Packet(8 * 1024);
 		private bool isOK;
 
-		public PacketParser(Circularbuffer buffer)
+		public PacketParser(CircularBuffer buffer)
 		{
 			this.buffer = buffer;
 		}

+ 2 - 2
Unity/Assets/Scripts/Base/Network/TNet/TChannel.cs

@@ -12,8 +12,8 @@ namespace Model
 	{
 		private readonly TcpClient tcpClient;
 
-		private readonly Circularbuffer recvBuffer = new Circularbuffer();
-		private readonly Circularbuffer sendBuffer = new Circularbuffer();
+		private readonly CircularBuffer recvBuffer = new CircularBuffer();
+		private readonly CircularBuffer sendBuffer = new CircularBuffer();
 
 		private bool isSending;
 		private readonly PacketParser parser;

+ 1 - 1
Unity/Unity.csproj

@@ -228,7 +228,7 @@
     <Compile Include="Assets\Scripts\Base\MultiMap.cs" />
     <Compile Include="Assets\Scripts\Base\Network\AChannel.cs" />
     <Compile Include="Assets\Scripts\Base\Network\AService.cs" />
-    <Compile Include="Assets\Scripts\Base\Network\Circularbuffer.cs" />
+    <Compile Include="Assets\Scripts\Base\Network\CircularBuffer.cs" />
     <Compile Include="Assets\Scripts\Base\Network\KNet\KChannel.cs" />
     <Compile Include="Assets\Scripts\Base\Network\KNet\Kcp.cs" />
     <Compile Include="Assets\Scripts\Base\Network\KNet\KService.cs" />