2011-01-14 64 views
1

以下のスレッドはループしており、サーバーに接続し、ファイルをダウンロードして接続を閉じてからプロセスを繰り返します。なぜこれが発生する可能性がある「java.net.ConnectException:接続タイムアウト:接続がタイムアウトしました:接続」例外が発生している理由がわかりません

接続:接続タイムアウトになりました :

java.net.ConnectException - 以下の例外は、ループの約500回の繰り返しの後にスローされますか? 例外がスローされたら、スレッドを強制終了する方法はありますか?

コード -

public void run() { 

    boolean isExceptionThrown = false; 

    try { 
    while(true){ 

     URL url = new URL(urlString); 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 

     String inputLine; 

     while ((inputLine = in.readLine()) != null) 
     { 
      //do nothing, just want to read the file 
     } 

     in.close(); 

     ++counter; 
     System.out.println("Thread id : "+this.threadId+" Connection number : "+counter +" URL : "+urlString); 
     } 

    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

感謝。

+0

私は 'tomcat'と' tomcat6'タグを見て、この質問がtomcatにどのように関連しているのですか? – gabuzo

+0

サーバーまたはクライアントのいずれかで "netstat"コマンドを実行して、アプリケーションによって閉じられていない接続が残っているかどうかを確認しましたか? – biziclop

+0

サーバ側で問題が発生した場合のためにtomcatに追加しました.... –

答えて

1

警告:投機はこちら。クライアントコードが接続を終了しているにもかかわらず、サーバーがきれいにクリーンアップされていない可能性があるため、クライアントは新しい接続を確立できません。確かに〜500接続マークのように聞こえますが、サーバーはちょっと圧倒されています。

count == 400の場合、10秒間スリープ状態のようなものを入れて、処理できる数に違いがあるかどうか確認してください。

+0

皆さん、助けてくれてありがとう! –

+0

これはうまくいきましたか? – Brian

0

まず、スタックトレースを印刷した後にスレッドが終了するので、スレッドを強制終了する必要があります。

理由については、実際の問題点を知るには十分な情報がありません。私はあなたはまた、サーバー側で永遠に同じファイルをダウンロードしてもサーバー側で問題を起こさないようにするか、保護手段を起動するかどうかを確認する必要があります。

Wiresharkのようなものを使用して、クライアントとサーバー間のネットワークアクティビティを確認できます。最後の接続では、送信パケットは表示されますが、受信パケットは表示されません。

1

サーバーが多すぎる接続で慌てている可能性があります。ストリームを閉じても、サーバーがソケットをシャットダウンするまでに時間がかかる可能性があります。

catchブロックがwhile (true)ブロックの外にあるため、例外がスローされると、コードはループを終了します。 runが返されるとスレッドは死ぬでしょう。

2

問題は、あなたのReader一度、次のwhile forループのスレッドリソースを解放させる閉じ、完全にをあなたの接続を許可しないことです:

別を作成するスレッドプールにあまりにも多くの接続があるかもしれません1(他の人が閉じようとしている間に)タイムアウトが発生します(これは私の推測です)。

この代わりに(疑似Javaコード)を行います。また

while (true) { 
    BufferedReader in = null; 

    try { 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (in != null) { 
      try { 
       in.close(); 
      } catch (Exception ignore) { 
       ignore.printStackTrace(); 
      } 
     } 

     in = null; 
    } 
} 

、それは活動から完全に自由になる前に自分自身を「きれい」にあなたのスレッドの時間を与えます。 sleepを試してください/スレッドが接続を完全に閉じ、そのリソースを解放するのを待ちます。

+0

接続を開いたときにタイムアウトが発生した場合、接続が確立されていないため、Readerが作成されないため、何も閉じない;) – tigger

+1

@Elite:書かれたコードは 'run'から一度戻る最初の例外がスローされます。 *例外がスローされないときに 'in.close'が呼び出されます。したがって、 'close'を呼び出すことができないのは、例外を引き起こしているのではなく**です。クリーンアップ時間が役に立つ可能性があります。 –

+0

Cameronと同じ発言で、例外は 'while'の外側で捕捉されるので、最大で1つの閉じられていない接続があります。これが長引くオープン接続の問題であった場合、エラーメッセージはタイムアウトにはなりませんが、オープンファイルが多すぎます* – gabuzo

関連する問題