【发布时间】:2013-07-31 13:41:16
【问题描述】:
我一直在使用 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}
【问题讨论】:
-
你向客户端发送什么标头?
-
我猜这是一个内容长度问题。我相信内容长度只是正文的长度。您可以稍微调试一下的一种方法是使用强大的客户端(如 chrome)来查看它是否使用 F12 工具处理格式不正确的请求(或者它是否完成了对请求的处理)。
-
使用网络浏览器,完全没有问题。只有 python 套接字在它可以读取之前存在套接字关闭的问题。这就是整个“Thread.Sleep”发挥作用的地方。如果我删除那个睡眠,python 会得到套接字错误,否则它会工作......所以我想我关闭连接太快了?
标签: c# webserver tcplistener