我一直在使用 TcpListener 类在 C# 中编写我自己的 http Web 服务器。现在在任何人提到这一点之前,我知道 HttpListener,但是在之前使用它之后,由于防火墙异常和需要拥有管理员帐户等,我遇到了一些问题。对于我的应用程序,它只是更容易制作简单的内置网络服务器。我一直在使用 python 应用程序连接到我的 C# 网络服务器,并发送一个简单的 GET 请求,然后接收一个简单的响应。
我的问题是这个..服务器应该关闭连接还是客户端?我问是因为如果我在发送响应后关闭服务器中的连接,我的 Python 应用程序并不总是能够读取所有响应。相反,会抛出一个套接字错误“错误 10054,'Connection reset by peer'”。但是,如果我强制 python 应用程序关闭连接,我不确定如何在我的 C# 服务器上检测到它,因为 C# TcpClient 不包含断开连接事件。那我该怎么办?我怎么知道连接的客户端何时收到完整的响应,以便我可以关闭连接?
目前,这有效(使用线程睡眠)
// Write headers and body to the Socket
NetworkStream Stream = Client.GetStream();
// Write Headers
byte[] Buffer = Encoding.UTF8.GetBytes(Headers);
Stream.Write(Buffer, 0, Buffer.Length);
// Write Response Data if Request method is not HEAD
if (Request.RequestMethod != HttpRequestMethod.HEAD)
Stream.Write(BodyByteArr, 0, BodyByteArr.Length);
Stream.Flush();
System.Threading.Thread.Sleep(100);
Stream.Close();
Client.Close();
我认为我需要一个比 Thread.Sleep() 更好的替代方案,如果客户端花费的时间超过睡眠时间来接收响应,它可能也不起作用(慢速连接)
发送到 Http 服务器的标头:
GET /test HTTP/1.1
Host: 127.0.0.1
Connection: close
发送回客户端的标头:
HTTP/1.1 200 OK
Date: {Now}
Server: MiniHttp-ASPServer
Content-Type: text/plain; charset=utf-8
Content-Length: {length}
Connection: close
{contents}