Java 无法获取响应代码!指针?
我正在尝试抓取300000个URL。然而,在中间的某个地方,当试图从URL中检索响应代码时,代码会挂起。我不确定什么地方出了问题,因为正在建立连接,但问题是在那之后发生的。我已经按照建议修改了设置读取超时和请求属性的代码。但是,即使现在代码也无法获得响应代码! 如有任何建议/建议,将不胜感激。还有,有没有办法在一段时间内ping一个网站,如果它没有响应,就继续下一个 以下是我修改过的代码片段:Java 无法获取响应代码!指针?,java,url,web-crawler,http-response-codes,Java,Url,Web Crawler,Http Response Codes,我正在尝试抓取300000个URL。然而,在中间的某个地方,当试图从URL中检索响应代码时,代码会挂起。我不确定什么地方出了问题,因为正在建立连接,但问题是在那之后发生的。我已经按照建议修改了设置读取超时和请求属性的代码。但是,即使现在代码也无法获得响应代码! 如有任何建议/建议,将不胜感激。还有,有没有办法在一段时间内ping一个网站,如果它没有响应,就继续下一个 以下是我修改过的代码片段: URL url=null; try { Thread.sleep(8000); } catch
URL url=null;
try
{
Thread.sleep(8000);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
try
{
//urlToBeCrawled comes from the database
url=new URL(urlToBeCrawled);
}
catch (MalformedURLException e)
{
e.printStackTrace();
//The code is in a loop,so the use of continue.I apologize for putting code in the catch block.
continue;
}
HttpURLConnection huc=null;
try
{
huc = (HttpURLConnection)url.openConnection();
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
//Added the request property
huc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
huc.setRequestMethod("HEAD");
}
catch (ProtocolException e)
{
e.printStackTrace();
}
huc.setConnectTimeout(1000);
try
{
huc.connect();
}
catch (IOException e)
{
e.printStackTrace();
continue;
}
int responseCode=0;
try
{
//Sets the read timeout
huc.setReadTimeout(15000);
//Code hangs here for some URL which is random in each run
responseCode = huc.getResponseCode();
}
catch (IOException e)
{
huc.disconnect();
e.printStackTrace();
continue;
}
if (responseCode!=200)
{
huc.disconnect();
continue;
}
调用打开连接的url.openConnection后,您将在HttpURLConnection上设置读取和连接超时。因此,它们没有生效。为此,我可能会使用,而不是Java URL类
回答你的第二点。是的,只要尝试打开到端口80或其他端口(如果在远程域名的URL中指定)的连接即可,您可以使用URL.getHost使用原始套接字从URL中提取远程域名。为此,我宁愿使用Java套接字而不是Java套接字。它挂起,因为字节流中从未收到响应代码。您需要查看http调试器,并查看实际接收到的内容(如果有的话)。但是,它似乎打开了与服务器的TCP连接。它可能不喜欢您的用户代理,因为它可能没有设置为您认为它是什么或HEAD的请求方法,或者它可能是带宽有限的服务器。您可以使用Socket类打开一个连接,并手动准备好字节,以查看您正在接收/未接收的内容
另一方面,根据您想要做什么,仅使用套接字实际上并不是一个坏方法。听起来您正在编写一个http服务器检查器,在这种情况下,直接使用Socket将获得更多功能,因为您将能够设计出更好、更优化的技术,毕竟您正在处理大量的低级网络io。感谢您的回复!我会调查的