异步TcpListener不会继续生成线程

时间:2019-05-16 14:47:08

标签: c# multithreading client-server tcplistener

我的问题是关于异步客户端/服务器的。我要实现的是假设多个连接同时在服务器上工作,假设每个连接都在发送/接收一些消息,并且它们必须进行长时间的工作(将文件从客户端传输到服务器,反之亦然)这将需要5到10秒。当前,我下面的服务器代码发送一条消息并读取客户端发送的一条消息,然后有一个Thread.Sleep(5000)知道该位置将是我的持久操作,将需要几秒钟才能完成

问题在于,当我打开客户端时,它同时执行几个连接(通常是12个,可能是因为我有i7-8750H-12个线程),其余的连接则一个接一个地执行。您可以在下面的GIF上看到它。问题是,当客户端第一次连接时,服务器将进行12个连接,然后每个连接都一个接一个地完成。我通过关闭服务器,同时保持客户端打开,然后重新启动服务器来测试此连接。

如何使所有连接同时连接并完成其长期工作?我了解我在12线程CPU上不能同时运行12个以上线程。

GIF代表问题: enter image description here

下面是代码片段,但您可以在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

0 个答案:

没有答案