Не удалось получить код ответа! Указатели?

Я пытаюсь просканировать 300 000 URL-адресов. Однако где-то посередине код зависает при попытке получить код ответа из URL-адреса. Я не уверен, что происходит не так, так как соединение устанавливается, но проблема возникает после этого. Я изменил код, установив время ожидания чтения и свойство запроса, как было предложено. Однако даже сейчас код не может получить код ответа! Любые предложения / указатели будут с благодарностью. Кроме того, есть ли способ пропинговать веб-сайт в течение определенного периода времени, и если он не отвечает, просто перейдите к следующему?

Вот мой измененный фрагмент кода:

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

person collegian    schedule 22.04.2011    source источник


Ответы (2)


Он зависает, потому что код ответа никогда не был получен в потоке байтов. Вы захотите взглянуть на http-отладчик и посмотреть, что было фактически получено, если вообще что-либо. Однако оказалось, что TCP-соединение с сервером открыто. Ему может не понравиться ваш пользовательский агент (который мог быть настроен не так, как вы думаете) или метод запроса HEAD, или это может быть сервер с ограниченной пропускной способностью. Вы можете использовать класс Socket, чтобы просто открыть соединение и подготовить байты вручную, чтобы увидеть, что вы получаете/не получаете.

Кстати, использование только Socket на самом деле неплохой подход в зависимости от того, что вы хотите сделать. Это похоже, что вы пишете средство проверки http-сервера, и в этом случае вы получите больше функциональных возможностей, используя только Socket напрямую, поскольку вы сможете разработать более совершенные и гораздо более оптимизированные методы (вы работаете с в конце концов, большой объем сетевого ввода-вывода низкого уровня).

person Zombies    schedule 22.04.2011

Вы устанавливаете время ожидания чтения и подключения в HttpURLConnection после того, как вы вызвали url.openConnection(), который открывает соединение. Поэтому они не вступают в силу. Я бы, вероятно, использовал для этой цели Jetty HttpClient, а не URL-адрес Java. класс.

Чтобы ответить на ваш второй пункт. Да, просто попытайтесь открыть соединение с портом 80 (или другим портом, если он указан в URL-адресе) на удаленном доменном имени, которое вы можете извлечь из URL-адреса (с url.getHost()) с помощью необработанных сокетов. Для этого я бы использовал Netty, а не сокеты Java.

person alpian    schedule 22.04.2011
comment
Спасибо за ответ! я посмотрю на них - person collegian; 22.04.2011