Pārlūkot izejas kodu

增加对TcpListener测试,TcpListener.AcceptSocketAsync()前后会在同一线程中

tanghai 11 gadi atpakaļ
vecāks
revīzija
a4a7ba42ef

+ 1 - 0
CSharp/Platform/TNetTest/TNetTest.csproj

@@ -52,6 +52,7 @@
   <ItemGroup>
     <Compile Include="TcpAcceptorTest.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TcpListenerTest.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Helper\Helper.csproj">

+ 95 - 0
CSharp/Platform/TNetTest/TcpListenerTest.cs

@@ -0,0 +1,95 @@
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading;
+using Helper;
+using Logger;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace TNetTest
+{
+	[TestClass]
+	public class TcpListenerTest
+	{
+		private const ushort port = 11111;
+		private int count;
+		private readonly Barrier barrier = new Barrier(2);
+		private readonly object lockObject = new object();
+
+		[TestMethod]
+		public void AcceptAsync()
+		{
+			var thread1 = new Thread(Server);
+			thread1.Start();
+
+			Thread.Sleep(2);
+
+			for (int i = 0; i < 1; ++i)
+			{
+				var thread = new Thread(this.Client);
+				thread.Start();
+			}
+			barrier.SignalAndWait();
+		}
+
+		private async void Client()
+		{
+			using (var tcpClient = new TcpClient(AddressFamily.InterNetwork))
+			{
+				await tcpClient.ConnectAsync("127.0.0.1", port);
+				using (NetworkStream ns = tcpClient.GetStream())
+				{
+					try
+					{
+						var bytes = "tanghai".ToByteArray();
+						for (int i = 0; i < 100; ++i)
+						{
+							await ns.WriteAsync(bytes, 0, bytes.Length);
+							int n = await ns.ReadAsync(bytes, 0, bytes.Length);
+							Assert.AreEqual(7, n);
+						}
+					}
+					catch (Exception e)
+					{
+						Log.Debug(e.ToString());
+					}
+				}
+			}
+			barrier.RemoveParticipants(1);
+		}
+
+		private async void Server()
+		{
+			var tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
+			tcpListener.Start();
+			
+			while (count != 1)
+			{
+				var socket = await tcpListener.AcceptSocketAsync();
+				var ns = new NetworkStream(socket);
+				Response(ns);
+			}
+		}
+
+		private async void Response(NetworkStream ns)
+		{
+			try
+			{
+				var bytes = new byte[1000];
+				for (int i = 0; i < 100; ++i)
+				{
+					int n = await ns.ReadAsync(bytes, 0, 100);
+					await ns.WriteAsync(bytes, 0, n);
+				}
+				lock (lockObject)
+				{
+					++count;
+				}
+			}
+			catch (Exception e)
+			{
+				Log.Debug(e.ToString());
+			}
+		}
+	}
+}