C# 如何将TCPListener设置为始终侦听,以及在新连接放弃当前连接时

C# 如何将TCPListener设置为始终侦听,以及在新连接放弃当前连接时,c#,sockets,tcp,tcplistener,networkstream,C#,Sockets,Tcp,Tcplistener,Networkstream,我想承认我在c#中不是最强的,我通过阅读一些教程开发了这个程序,如果您能在回答中详细说明,我将不胜感激。 我希望我的TCP服务器始终侦听传入的连接,当新的TCP客户端连接时,我希望它放弃旧的连接并使用新的连接 我已经试着实现这个答案 但我的问题是,当我模拟TCP客户端时,上面的答案只会收到一条消息(我当前的代码接收所有发送的消息),而且我尝试转换数据,因此我以与下面代码相同的方式接收数据,但没有成功。 另外,我认为上面的代码只是接受新客户机,而不丢弃以前连接的客户机 我当前的代码,可以处理连接并

我想承认我在c#中不是最强的,我通过阅读一些教程开发了这个程序,如果您能在回答中详细说明,我将不胜感激。
我希望我的TCP服务器始终侦听传入的连接,当新的TCP客户端连接时,我希望它放弃旧的连接并使用新的连接

我已经试着实现这个答案
但我的问题是,当我模拟TCP客户端时,上面的答案只会收到一条消息(我当前的代码接收所有发送的消息),而且我尝试转换数据,因此我以与下面代码相同的方式接收数据,但没有成功。
另外,我认为上面的代码只是接受新客户机,而不丢弃以前连接的客户机

我当前的代码,可以处理连接并在断开连接后搜索新连接,我想这样做,所以我总是在寻找新连接,如果新客户端想要连接,我会丢弃当前连接,让新连接通过

public class TCPListener
{
    public static void Listener()
    {
        TcpListener server = null;
        try
        {
            // Set the TcpListener on carPort.
            Int32 port = 5002;

            // TcpListener server = new TcpListener(port);
            server = new TcpListener(IPAddress.Any, port);

            // Start listening for client requests.
            server.Start();

            // Buffer for reading data
            Byte[] bytes = new Byte[256];
            String data = null;

            // Enter the listening loop.
            while (true)
            {
                Console.Write("Waiting for a connection... ");

                // Perform a blocking call to accept requests.
                TcpClient client = server.AcceptTcpClient();
                Console.WriteLine("Connected!");

                // Get a stream object for reading
                NetworkStream stream = client.GetStream();

                int i;

                // Loop to receive all the data sent by the client.
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    // Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                    Console.WriteLine("Received: {0}", data);
                }
                // Shutdown and end connection
                Console.WriteLine("Client close");
                client.Close();
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }
        finally
        {
            // Stop listening for new clients.
            Console.WriteLine("Stop listening for new clients.");
            server.Stop();
        }

    }
}
编辑:如果有人需要我的问题的解决方案,那么这就是我应用Cecilio Pardo建议的代码时的样子,效果非常好

public class TCPListener
{
    Form form = new Form();
    public static void Listener()
    {
        TcpListener server = null;
        try
        {
            // Set the TcpListener on carPort.
            Int32 port = 5002;

            // TcpListener server = new TcpListener(port);
            server = new TcpListener(IPAddress.Any, port);

            // Start listening for client requests.
            server.Start();

            // Buffer for reading data
            Byte[] bytes = new Byte[256];
            String data = null;

            // Enter the listening loop.
            while (true)
            {
                Console.Write("Waiting for a connection... ");

                // Perform a blocking call to accept requests.
                TcpClient client = server.AcceptTcpClient();
                Console.WriteLine("Connected!");

                data = null;
                bool dataAvailable = false;
                // Get a stream object for reading
                NetworkStream stream = client.GetStream();

                int i;
                while (true)
                {
                    if (!dataAvailable)
                    {
                        dataAvailable = stream.DataAvailable;
                        //Console.WriteLine("Data Available: "+dataAvailable);
                        if (server.Pending())
                        {
                            Console.WriteLine("found new client");
                            break;
                        }
                    }

                    if (dataAvailable)
                    {
                        // Loop to receive all the data sent by the client.
                        i = stream.Read(bytes, 0, bytes.Length);
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);

                        Console.WriteLine("Received: {0}", data);
                        dataAvailable = false;
                    }

                    if (server.Pending())
                    {
                        Console.WriteLine("found new client");
                        break;
                    }
                }

                Console.WriteLine("Client close");
                // Shutdown and end connection
                client.Close();
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }
        finally
        {
            // Stop listening for new clients.
            Console.WriteLine("Stop listening for new clients.");
            server.Stop();
        }

    }
}

当您处于内部
While
循环时,无法检查新连接。因此,您必须在循环中添加如下内容:

if ( server.Pending() ) break;
这将在另一个连接等待时立即退出循环


另一个问题是,
stream.Read
将阻塞,直到某些数据可用,因此如果活动连接空闲,则不会处理新连接。所以你必须改变它,除非有一些数据,否则不要调用
Read
,使用
stream.DataAvailable

这就是我正在使用的,到目前为止它运行得很好,我刚刚开始开发这种类型的应用程序。如果我对此代码进行了任何重大更改或发现错误,我将更新:

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();
    }
}

经过一番努力,多亏了你的解决方案,我才使一切顺利进行!我非常感激!