服务器和客户端之间的持续通信

Continuous communication between server and client

我正在开发一个作为服务器和客户端的程序。我想要做的是让客户端显示一条消息,说明它是否连接到服务器。我认为最好的方法是每秒让客户端发送一条 "alive" 消息,然后让服务器响应。

此时客户端向服务器发送一条消息,它会显示已连接一次,然后每次都显示未连接。所以我知道客户端正在工作,因为它确实报告未连接,但服务器只响应一次然后停止。我的问题是服务器似乎只响应一次客户端。在那之后我完全没有得到服务器的响应。

注意:在我检查连接之前调用到服务器的连接。认为与问题无关

客户代码

public static void CheckServerConection(object Sender, EventArgs e)
    {
        try
        {
            NetworkStream nwStream = tcpClnt.GetStream();
            byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("Alive");

            nwStream.Write(bytesToSend, 0, bytesToSend.Length);

            byte[] bytesToRead = new byte[tcpClnt.ReceiveBufferSize];
            int bytesRead = nwStream.Read(bytesToRead, 0, tcpClnt.ReceiveBufferSize);
            string received = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);

            if (received == "Alive")
            {
                ActiveConnection = true;
                Console.WriteLine("Connected");
            }
            else
            {
                ActiveConnection = false;
                Console.WriteLine("Not Connected");
            }
        }
        catch (Exception exception)
        {
            ActiveConnection = false;
            Console.WriteLine("Not Connected");
        } 
    }

服务器代码

public static void startServer()
    {
        try
        {
            IPAddress ipAd = IPAddress.Parse("0.0.0.0"); //Servers local IP address.
            int port = 36512;
            TcpListener listener = new TcpListener(ipAd, port);
            int i = 0;

            while (i == 0)
            {
                listener.Start();

                Console.WriteLine("Server has been started." + Environment.NewLine + "Running on: " + ipAd + ":" + port);
                Console.WriteLine("Waiting for client connection...");

                TcpClient client = listener.AcceptTcpClient();

                NetworkStream nwStream = client.GetStream();
                byte[] buffer = new byte[client.ReceiveBufferSize];

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

                string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                Console.WriteLine(dataReceived);

                nwStream.Write(buffer, 0, bytesRead);
                listener.Stop();
                client.Close();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }

您正在循环外实例化监听器。您在循环中调用 listener.Stop() 方法,这会关闭监听器。之后,它无法重新启动。 请参阅此 link,了解 "Example" 部分中 TcpListener 的正确且简单的实现。

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=vs.110).aspx