【问题标题】:HTTP over C# sockets基于 C# 套接字的 HTTP
【发布时间】:2011-12-09 13:55:56
【问题描述】:

我正在尝试通过 C# 套接字发送 HTTP 请求并从服务器接收响应,我是这种语言的新手。

我编写了以下代码(IP 解析正确):

IPEndPoint RHost = new IPEndPoint(IP, Port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(RHost);

String HTTPRequestHeaders_String = "GET ?q=fdgdfg HTTP/1.0
Host: google.com
Keep-Alive: 300
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16
Referer: http://google.com/";

MessageBox.Show(HTTPRequestHeaders_String, "Request");

byte[] HTTPRequestHeaders = System.Text.Encoding.ASCII.GetBytes(HTTPRequestHeaders_String);
socket.Send(HTTPRequestHeaders, SocketFlags.None);

String Response = "";
byte[] buffer = new byte[(int) socket.ReceiveBufferSize];

int bytes;
do
{
    // On this lane program stops to react
    bytes = socket.Receive(buffer);
    // This line cannot be reached, tested with breakpoint
    Response += Encoding.ASCII.GetString(buffer, 0, bytes);
}
while (bytes >= 0);

MessageBox.Show(Response, "Response");

我做错了什么?我只需要加载页面的完整 HTML,或者从响应中加载至少几个字符(我什至不能这样做)。

【问题讨论】:

  • 使用HttpWebRequest 类。
  • @SLaks 我会更进一步 - WebClient...
  • 我需要将 HTTP 请求标头创建为字符串,在这些类中可以吗?
  • 为什么需要手动创建HTTP请求头?
  • 您可以将标题添加为字符串,请参阅下面的答案

标签: c# http sockets web-crawler


【解决方案1】:

我发现 Mentalis 代理对于理解套接字级别的 Http 请求/响应周期非常有帮助:http://www.mentalis.org/soft/projects/proxy/

【讨论】:

    【解决方案2】:
    var webClient = new WebClient();
    webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
    Stream responseStream = webClient.OpenRead("http://www.google.com");
    if (responseStream != null)
    {
       var responseReader = new StreamReader(responseStream);
       string response = responseReader.ReadToEnd();
       MessageBox.Show(response);
    }
    

    【讨论】:

      【解决方案3】:

      TcpClient 类一方面允许您完全控制请求(您将请求主体创建为字符串),另一方面比低级套接字更易于使用。

      http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx

      【讨论】:

        【解决方案4】:

        如果您想直接执行此操作,我建议您查看协议本身,http://www.w3.org/Protocols/HTTP/1.0/spec.html#Request

        并尝试发送 CRLF 来终止请求;)

        【讨论】:

        • 哇,我在这个问题上花了 5 个小时,却忘了终止请求,非常感谢! :)
        • 现在,您的问题解决了,您已经学会了如何从头开始创建 Http 标头,是时候切换到更高级别的抽象了。如前所述,使用HttpWebRequestWebClient
        猜你喜欢
        • 2021-01-15
        • 1970-01-01
        • 2017-03-24
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 2022-07-15
        • 2015-11-29
        • 1970-01-01
        相关资源
        最近更新 更多