【问题标题】:How to make a request to a website with TcpClient如何使用 TcpClient 向网站发出请求
【发布时间】:2016-03-07 22:56:38
【问题描述】:

我正在尝试使用 TcpClient 向网站发出请求,但无法正常工作。首先,我与 remoteHost 建立连接并写入 requestStr 变量中的请求标头。之后,我从远程流中读取并期望得到响应,但我什么也没得到。我还使用 while 循环中的代码从使用我的应用程序作为代理的浏览器接收请求标头,并且工作正常。

Eol 变量是\r\n

requestStr 变量是:

GET http://steam.com/ HTTP/1.1
Host: steam.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

代码片段:

TcpClient remoteClient = new TcpClient(request.GetRemoteHost(), 80);
byte[] remoteRequest = Encoding.UTF8.GetBytes(requestStr);
NetworkStream remoteStream = remoteClient.GetStream();
remoteStream.Write(remoteRequest, 0, remoteRequest.Length);
remoteStream.Flush();

int j;
string remoteStr = "";
byte[] remoteBuffer = new byte[App.BufferSize];
recvRequest = true;
while (recvRequest && (j = remoteStream.Read(remoteBuffer, 0, remoteBuffer.Length)) != 0) {
    string receivedData = Encoding.ASCII.GetString(remoteBuffer, 0, j);

    if (receivedData.IndexOf(Eol) < 0) {
        remoteStr += receivedData;
    } else {
        remoteStr += receivedData.Substring(0, receivedData.IndexOf(Eol + Eol));
        recvRequest = false;
    }
}

MessageBox.Show(remoteStr);

【问题讨论】:

  • 您这样做是为了学习还是使用TcpClient,因为您认为它最适合这项工作?如果是后者,您可能想看看WebClient 之类的东西。或WebRequest.
  • 是的,我这样做是为了学校的作业。 (所以学习)
  • 很公平!需要明确的是,您的请求字符串末尾是否有一个空行(仍以\r\n 结尾)?
  • @JamesThorpe 我现在觉得有点愚蠢,当我在代理上读取来自浏览器的传入请求时,我将它的内容放在字符串中,但最后没有 2 \r\n .我再次将它们添加到 requestStr 并得到响应。感谢您让我意识到这一点!

标签: c# tcpclient


【解决方案1】:

查看您发送的请求,您没有在其末尾包含 a blank line(仍以 \r\n 结尾)。这标志着标头的结束,因此服务器知道它已收到所有标头并可以处理请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-09-18
    • 2011-10-22
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多