我的问题是关于异步客户端/服务器的。我要实现的是假设多个连接同时在服务器上工作,假设每个连接都在发送/接收一些消息,并且它们必须进行长时间的工作(将文件从客户端传输到服务器,反之亦然)这将需要5到10秒。当前,我下面的服务器代码发送一条消息并读取客户端发送的一条消息,然后有一个Thread.Sleep(5000)
知道该位置将是我的持久操作,将需要几秒钟才能完成
问题在于,当我打开客户端时,它同时执行几个连接(通常是12个,可能是因为我有i7-8750H-12个线程),其余的连接则一个接一个地执行。您可以在下面的GIF上看到它。问题是,当客户端第一次连接时,服务器将进行12个连接,然后每个连接都一个接一个地完成。我通过关闭服务器,同时保持客户端打开,然后重新启动服务器来测试此连接。
如何使所有连接同时连接并完成其长期工作?我了解我在12线程CPU上不能同时运行12个以上线程。
下面是代码片段,但您可以在pastebins中找到客户端和服务器的完整代码:
// https://pastebin.com/NcA5Vja2 The entire server code
private static void AcceptCallback(IAsyncResult ar)
{
// Signal the main thread to continue
_mre.Set();
TcpListener listener = (TcpListener)ar.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(ar);
IPAddress ip = ((IPEndPoint)client.Client.RemoteEndPoint).Address;
Console.WriteLine($"{ip} has connected!");
// In production a SSL certificate can be added. More information here: https://docs.microsoft.com/en-us/dotnet/api/system.net.security.sslstream?redirectedfrom=MSDN&view=netframework-4.8
using (NetworkStream ns = client.GetStream())
{
SendMessage(ns, "Mr. Client, hello");
string result = ReadMessage(ns);
Console.WriteLine(result);
}
Thread.Sleep(5000);
// Close connection
client.Close();
Console.WriteLine($"{ip} has disconnected!");
}
// https://pastebin.com/gVKZy4N6 The entire client code