TCPClient不关闭,而是等待客户端关闭它

本文关键字:等待 客户端 TCPClient | 更新日期: 2023-09-27 18:15:56

我有几个关于编程TcpListener的问题。

第一个问题:

一旦客户端使用浏览器连接,我看到请求。一切都好。但接下来我面临着写作的问题。以及接收数据的客户端。它基本上不会得到服务器的回复。我需要冲洗功能吗?它是如何工作的?还有其他的方法吗?

问题2更奇怪。当我调用client.close()客户端不会去任何地方。它还在那里。浏览器仍在等待数据。当我在浏览器中终止连接时,只有Tcp客户端关闭,循环再次开始。

namespace TestServer
{
    class Program
    {
       public static void Main()
        {
            TcpListener server;
            IPAddress addr = IPAddress.Parse("127.0.0.1");
            server = new TcpListener(addr, 80);

            server.Start();
            byte[] buffer = new byte[1024];

            while(true)
            {
                string data = null;
                Console.WriteLine("Awaiting for connections");
                TcpClient client = server.AcceptTcpClient();
                Console.WriteLine("Connected...");
                NetworkStream str = client.GetStream();
                int msgCounter;
                while ((msgCounter = str.Read(buffer, 0, buffer.Length)) != 0)
                {
                    Console.WriteLine("Processing stream...");
                    data += System.Text.Encoding.ASCII.GetString(buffer, 0, msgCounter);
                    Console.WriteLine("Reciaved: {0}", System.Text.Encoding.ASCII.GetString(buffer, 0, msgCounter));
                }

                byte[] response = System.Text.Encoding.ASCII.GetBytes("200 OK");
                str.Write(response, 0, response.Length);
                str.Flush();
                client.Close();
                buffer = new byte[1024];
            }
        }
    }
}

TCPClient不关闭,而是等待客户端关闭它

TCP作为双向传输层协议并不表示任何"客户端完成发送请求"信号的概念。

对于开发人员来说,这意味着这种信令必须在应用程序(或任何其他更高级别)协议层中定义。

在你的例子中,它是由HTTP自己在https://tools.ietf.org/html//rfc2616#section-5

中声明的

因此,如果你打算实现一个HTTP服务器,你必须解析HTTP请求,它有一个确定的方法来识别请求的结束(见上面的链接)。

总结:你需要知道你已经完全阅读了请求,你可以开始处理它并生成/发送响应。

我建议您从经过百万次验证的TcpListener类的MSDN示例开始。此外,我可以指出明确的错误方法:

    不要重新创建缓冲区,这是浪费资源。如果您正在使用TCP套接字,请不要使用浏览器作为测试客户端。任何浏览器都试图以某种方式纠正HTTP协议错误,并且可以以非常不可预测的方式完成。如果您需要HTTP级别的调试,请使用Fiddler,对于较低级别-微软网络监视器,Netcat的Wireshark。读一些关于TCP/IP网络的书可能会很有用。特别是,您将知道,根据协议定义,TCP连接没有"关闭"操作或命令,TcpClient只是模拟它。相反,对等端可以向另一个发送"shutdown",这意味着它不再打算发送数据,但可以读取数据。只有当两个对等体都发送了"shutdown"并接收到对方的"shutdown"后,连接才能被认为是关闭的。