Невозможно получить код ответа! Указатели? - PullRequest
0 голосов
/ 22 апреля 2011

Я пытаюсь сканировать 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;
 }

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011

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

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

0 голосов
/ 22 апреля 2011

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

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

...