套接字与URL网站访问

时间:2014-02-05 21:30:19

标签: java httpclient lwp

我有一个Java应用程序,它使用Socket类打开现有公司的网站:

Socket sockSite;
InputStream inFile = null;
BufferedWriter out = null;

try
{
    sockSite = new Socket( presetSite, 80 );
    inFile = sockSite.getInputStream();
    out = new BufferedWriter( new OutputStreamWriter(sockSite.getOutputStream()) );
}
catch ( IOException e )
{
    ...
}

out.write( "GET " + presetPath + " HTTP/1.1\r\n\r\n" );
out.flush();

我会用流inFile阅读网站,生活很美好。

最近这种情况开始失败。我得到一个HTTP 301“网站已移动”错误但没有移动链接。该站点仍然存在,并使用相同的原始HTTP引用和任何Web浏览器进行响应。但上面的代码返回HTTP 301

我将代码更改为:

URL url;
InputStream inFile = null;

try
{
    url = new URL( presetSite + presetPath );
    inFile = url.openStream();
}
catch ( IOException e )
{
    ...
}

使用inFile信息流中的原始代码阅读该网站,现在又可以使用了。

这种差异不仅发生在Java中,而且如果我使用Perl(使用IO::Socket::INET方法打开网站端口80,然后发出GET失败,但使用{{1}方法LWP::Simple正常工作)。换句话说,如果我首先使用端口80打开网页,然后执行get,我就会失败,但是如果我使用一个“同时执行”的类(它只是说, “给我看这样一个HTTP地址的网页”。

我以为我会在GET上尝试不同的方法并得到一个有趣的结果。在打开端口80,然后发出http://www.microsoft.com的情况下,我收到了GET /...响应,其中包含一个页面,上面写着“您当前的用户代理 在一个案例中,我尝试打开“端口80”,然后HTTP 200上的GET /,我收到一个www.microsoft.com响应页面,上面写着:“您当前的用户代理似乎来自自动化处理...”。但是如果我使用第二种方法(Java中的HTTP 200类,或Perl中的URL),我只需要获取他们的网页。

所以我的问题是: URL类(在Java中)或LWP模块(在Perl中)是如何做到的,它与在端口80上打开网站并发出{{ 1}}

3 个答案:

答案 0 :(得分:0)

如果你使用数据包捕获软件来查看使用URL时发送的内容,你会发现除了发送“GET /”之外还有很多东西。包括各种附加头信息。如果服务器只是一个简单的“GET /”,那么很容易推断它在另一端不能是一个非常复杂的客户端。

此外,HTTP 1.0“过时”,当前版本为1.1。

答案 1 :(得分:0)

Java URL实现如果以“http:”

开头,则委托给HttpURLConnection

答案 2 :(得分:0)

大多数服务器都需要Host:标头,以允许虚拟主机(一个IP上的多个域)