How to set TCPListener to always listen and when new connection discard current

前提是你 提交于 2019-12-06 19:41:30

While you are in your inner while loop, you can't check for new connections. So you would have to add something like this inside the loop:

if ( server.Pending() ) break;

That will exit your loop as soon as another connection is waiting.

Another problem is that stream.Read will block until some data is available, so new connections will not get handled if the active one is idle. So you have to change it, and not call Read unless there is some data, using stream.DataAvailable

This is what I'm using and it's working pretty good so far, I've just started working on this type of application. If I make any significant changes or find bugs with this code I'll update:

class ClientListener
{
    const int PORT_NO = 4500;
    const string SERVER_IP = "127.0.0.1";
    private TcpListener listener;

    public async Task Listen()
    {
        IPAddress localAddress = IPAddress.Parse(SERVER_IP);
        listener = new TcpListener(localAddress, PORT_NO);
        Console.WriteLine("Listening on: " + SERVER_IP + ":" + PORT_NO);
        listener.Start();

        while (true)
        {
            // Accept incoming connection that matches IP / Port number
            // We need some form of security here later
            TcpClient client = await listener.AcceptTcpClientAsync();

            if (client.Connected)
            {
                // Get the stream of data send by the server and create a buffer of data we can read
                NetworkStream stream = client.GetStream();
                byte[] buffer = new byte[client.ReceiveBufferSize];

                int bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);

                // Convert the data recieved into a string
                string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                Console.WriteLine("Recieved Data: " + data);
            }
        }
    }

    public void StopListening()
    {
        listener.Stop();
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!