我正在开发客户端服务器应用程序、Windows Server 和 Linux 客户端。我正在使用多个并发客户端测试我的服务器。我只尝试了来自客户端的 20 个并发连接,我注意到尽管所有 20 个请求都是相同的,但有些请求没有得到处理。他们进入队列,由于某种原因,当轮到他们时,客户端被关闭(客户端连接超时为 5 秒)。
然后我添加了一个 Thread.Sleep(1000),以检查它是否真的是异步的,但后来我意识到它在超时之前不会处理其他请求。尽管事实上
- 它是异步的
- ManualResetEvent 是在睡觉前设置的。
现在我想知道我在这里错过了什么,因为这主要发生在并发连接上?
public static void StartServer(IPAddress ipAddr, int port)
{
//IPEndPoint serverEndPoint = new IPEndPoint(ipAddr, port);
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Any, port);
Socket clientListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
clientListener.Bind(serverEndPoint);
clientListener.Listen(500);
Console.WriteLine("-- Server Listening: {0}:{1}",ipAddr,port);
while (true)
{
resetEvent.Reset();
Console.WriteLine("|| Waiting for connection");
clientListener.BeginAccept(new AsyncCallback(AcceptConnection), clientListener);
resetEvent.WaitOne();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public static void AcceptConnection(IAsyncResult ar)
{
// Get the socket that handles the client request.
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
// Signal the main thread to continue.
resetEvent.Set();
// Create the state object.
JSStateObject state = new JSStateObject();
state.workSocket = handler;
if (handler.Connected)
{
Console.WriteLine("** Connected to: {0}", handler.RemoteEndPoint.ToString());
state.workingDirectory = JSUtilityClass.CreatetTemporaryDirectry();
try
{
Thread.Sleep(1000);
Receive(state);
}
catch (Exception e)
{
handler.Shutdown(SocketShutdown.Both);
handler.Close();
Console.WriteLine(e.Message);
}
}
}