清空http响应正文

时间:2015-11-15 07:34:27

标签: c# sockets http network-programming httpresponse

我正在尝试使用C#中的套接字进行HTTP请求/响应。 GET请求如下所示。

 StringBuilder sb = new StringBuilder();
 sb.AppendFormat("GET http://{0}/ HTTP/1.1\r\n", hostname);
 sb.AppendFormat("Host: {0}\r\n", hostname);
 sb.Append("Connection: keep-alive\r\n");
 sb.Append(@"Accept:text/html,*/*");
 sb.Append("\r\n\r\n");

其中主机名类似于' mit.edu'或者' facebook.com'或者' google.com'或其他任何东西。由于一些奇怪的原因,我只有一个状态行(有200个状态代码)和标题为http响应。但是响应中没有消息正文:attached srceenshot of my console app

这是一个使用socket执行所有操作并生成http请求的方法:

public static void DoHttpGetRequest(String hostname, Int16 port = 80) {
      IPHostEntry ipHostEntry = Dns.GetHostEntry(hostname);
      IPAddress ipAdress = ipHostEntry.AddressList[0];
      IPEndPoint ipEndPoint = new IPEndPoint(ipAdress, port);

      Socket socket = new Socket(ipAdress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

      socket.Connect(ipEndPoint);

      String request = CreateRequest(hostname);

      Byte[] byteRequest = Encoding.UTF8.GetBytes(request);
      Byte[] byteResponse = new Byte[1000];

      int bytesSent = socket.Send(byteRequest);
      int bytesReceive = socket.Receive(byteResponse);

      Console.WriteLine(request);
      Console.WriteLine();
      Console.WriteLine(Encoding.UTF8.GetString(byteResponse, 0, bytesReceive));

      socket.Shutdown(SocketShutdown.Both);
      socket.Close();
}

我的第一个想法是套接字没有从服务器收到整个响应。在这种情况下,我仍然不知道如何解决问题。

那是怎么回事?错误在哪里?

3 个答案:

答案 0 :(得分:1)

不要指望在单次接收中获得完整的响应。你所做的就是接收数据,直到你有完整的响应头(这也可能需要几个接收调用),然后解析头以找出响应的时间,然后读取响应的必要数据,这也需要多个接听电话。而且,由于您正在执行HTTP / 1.1请求,因此您还必须处理分块响应。

我建议更好地使用HTTP库来处理所有问题。如果您坚持通过自己的阅读the specification of HTTP完成所有操作并相应地实施。 它也有助于查看类似请求的stackoverflow,因为这个问题对于第一次尝试实现HTTP的人来说非常典型,而不了解套接字,TCP和HTTP的工作方式。

答案 1 :(得分:0)

我认为你应该让套接字保持打开状态更长时间。插入

Thread.Wait(5000);

可能有所帮助。然后你可以做第二个套接字。收到Steffen提议。也许你可以尝试以下方法(等到服务器关闭连接):

while (socket.Connected) do
{
    int bytesReceive = socket.Receive(byteResponse);
}

但我没有测试过。使用System.Net.Http.HttpClient

更容易

答案 2 :(得分:0)

我需要做的就是接收多个接收呼叫的数据,直到收到所有响应信息。

do
{                
     bytesReceive = socket.Receive(byteResponse, byteResponse.Length, 0);
     response += Encoding.UTF8.GetString(byteResponse, 0, bytesReceive);
}
while (bytesReceive > 0);

Thanx大家帮忙!