使用C#套接字进行HTTP通信

5

我正在尝试通过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,或者至少从响应中获取几个字符(我甚至无法做到这一点)。


3
请使用 HttpWebRequest 类。 - SLaks
2
@SLaks 我会更进一步 - WebClient... - Marc Gravell
1
我需要将HTTP请求头信息创建为字符串,这些类支持吗? - Andrew Dryga
为什么需要手动创建HTTP请求标头? - Adam Robinson
您可以将标题作为字符串添加,可参考下面我的回答。 - Tion
显示剩余3条评论
4个回答

7

哇,我在这个问题上花了5个小时,竟然忘记终止请求,非常感谢! :) - Andrew Dryga
现在,你的问题已经解决了,你学会了如何从头创建一个Http头部,是时候转向更高层次的抽象了。正如之前提到的,使用HttpWebRequestWebClient - L.B

1
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);
}

1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接