0

300,000のURLをクロールしようとしています。ただし、途中で、URLから応答コードを取得しようとするとコードがハングします。接続が確立されているため、何が問題になっているのかわかりませんが、その後問題が発生しています。提案されているように、読み取りタイムアウトとリクエストプロパティを設定するコードを変更しましたが、今でもコードはレスポンスコードを取得できません!任意の提案/ポインタは大歓迎です。また、特定の期間Webサイトにpingを実行し、応答しない場合は次のWebサイトに進む方法はありますか?

これが私の変更されたコードスニペットです:

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

2 に答える 2

0

接続を開く url.openConnection() を呼び出した後、HttpURLConnection で読み取りタイムアウトと接続タイムアウトを設定しています。したがって、それらは有効になっていません。この目的には、おそらく Java URL クラスではなく、 Jetty HttpClientを使用するでしょう。

あなたの2番目のポイントに答えるために。url.getHost()はい、未加工のソケットを使用して URL から ( を使用して) 抽出できるリモート ドメイン名で、ポート 80 (または URL で指定されている場合は他のポート) への接続を開こうとするだけです。これを行うには、Java ソケットではなくNettyを使用します。

于 2011-04-22T16:50:16.697 に答える
0

応答コードがバイト ストリームで受信されなかったため、ハングしています。http デバッガーを見て、実際に何が受信されたかを確認する必要があります。ただし、サーバーへの TCP 接続を開いているように見えました。ユーザーエージェント (思ったように設定されていない可能性があります) または のリクエストメソッドが気に入らないか、HEAD帯域幅が制限されたサーバーである可能性があります。クラスを使用Socketして接続を開き、バイトを手動で準備して、受信しているものと受信していないものを確認できます。

余談ですが、やりたいことによっては、 only を使用することSocketは実際には悪いアプローチではありません。httpサーバー チェッカーを作成しているように思えます。この場合、より優れた、より最適化された手法を設計できるため、直接使用するだけでより多くの機能を利用できます (大量の低レベル ネットワーク io を使用しています)。結局)。Socket

于 2011-04-22T17:32:23.340 に答える