2013-07-31 46 views
2

我一直在使用TcpListener类在C#中编写我自己的http Web服务器。现在,在任何人提到这个之前,我知道HttpListener,但之前使用过,由于防火墙异常和需要管理员帐户等等,Ive有一些问题。对于我的应用程序,它更容易做出简单的,建立网络服务器。我一直在使用python应用程序连接到我的C#web服务器,并发送一个简单的GET请求,并接收一个简单的响应。C#迷你Http服务器,知道何时关闭连接

我的问题是这个..服务器应该关闭连接还是客户端?我问,因为如果我在发送响应后关闭服务器中的连接,我的Python应用程序并不总是读取所有的响应。相反,套接字错误将被抛出“错误10054,'由对等重置连接'”。但是,如果我强制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} 
+0

您发送给客户端的标题是什么? –

+0

在主帖子中添加 – Wilson212

+0

我猜想这是一个内容长度问题。我相信内容的长度只是身体的长度。您可以稍微调试一下这种方法,就是使用像Chrome这样的健壮客户端来查看它是否使用F12工具来处理不正确形成的请求(或者它是否完成处理请求)。 –

回答

0

你已经采取了看看同步和异步插座样品在H [TTP://msdn.microsoft.com/en-us/library/w89fhyex.aspx] [1]

[1 ]:http://msdn.microsoft.com/en-us/library/w89fhyex.aspx

我认为你可以在解决方案中使用一些逻辑。在同步服务器实例(片断):

 while (true) { 
      Console.WriteLine("Waiting for a connection..."); 
      // Program is suspended while waiting for an incoming      connection. 
      Socket handler = listener.Accept(); 
      data = null; 

      // An incoming connection needs to be processed. 
      while (true) { 
       bytes = new byte[1024]; 
       int bytesRec = handler.Receive(bytes); 
       data += Encoding.ASCII.GetString(bytes,0,bytesRec); 
       if (data.IndexOf("<EOF>") > -1) { 
        break; 
       } 
      } 

      // Show the data on the console. 
      Console.WriteLine("Text received : {0}", data); 

      // Echo the data back to the client. 
      byte[] msg = Encoding.ASCII.GetBytes(data); 

      handler.Send(msg); 
      handler.Shutdown(SocketShutdown.Both); 
      handler.Close(); 
     } 

在客户端:

  sender.Connect(remoteEP); 

      Console.WriteLine("Socket connected to {0}", 
           sender.RemoteEndPoint.ToString()); 

      // Encode the data string into a byte array. 
      byte[] msg = Encoding.ASCII.GetBytes("This is a test<EOF>"); 

      // Send the data through the socket. 
      int bytesSent = sender.Send(msg); 

      // Receive the response from the remote device. 
      int bytesRec = sender.Receive(bytes); 
      Console.WriteLine("Echoed test = {0}", 
           Encoding.ASCII.GetString(bytes,0,bytesRec)); 

      // Release the socket. 
      sender.Shutdown(SocketShutdown.Both); 
      sender.Close(); 
+0

嗯,这并没有真正回答我的问题,或者帮助我很多。我在我的脚本中加入了Socket.Shutdown()(我完全不知道这个方法),这似乎只有一点点帮助,但我仍然收到48个异步请求中的2个套接字错误。越来越近,但不完全:) – Wilson212

+0

好的。那么你可能想看看Socket.ReceiveTimeout属性找到:[链接] http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.receivetimeout.aspx此外,我仍然会鼓励你在我给你的上一个链接中运行示例,看看它是否会给出一些见解。 – Dylan

0

从HTTP1.1摘自RFC:

如果在客户端或服务器发送关闭令牌,该请求将成为连接的最后一个。

所以,当你的服务器关闭连接它以前有一个连接回答:密切头。

我不知道C#和它的TCP客户端,但是在套接字上发送可能会失败的原因有几个。在您关闭应用程序之前,我看不到您处理这些问题。

您必须重试才能发送答案,直到确定完全读取。 我认为你的连接:关闭标题永远不会到达你的客户端,这就是“连接重置对等”的答案。