2011-06-20 13 views
2

は今、私はこれをやっている:リモートホストがソケット上で待機していない場合Javaソケット:Connection Refused Exceptionで再試行する最善の方法は?

while (true) { 
    try { 
     SocketAddress sockaddr = new InetSocketAddress(ivDestIP, ivDestPort); 
     downloadSock = new Socket(); 
     downloadSock.connect(sockaddr); 
     this.oos = new ObjectOutputStream(downloadSock.getOutputStream()); 
     this.ois = new ObjectInputStream(downloadSock.getInputStream()); 
     break; 
    } catch (Exception e) {} 
} 

downloadSock.connect(sockaddr)ConnectionRefused例外を生成します。別のスレッドでコードを実行しているので、ブロックすることを心配していません。これを考えれば、私のやり直しの方法は適切か、それとも良い方法があるのか​​???

ありがとうございます!

+2

あなたはまた、(参照http://hc.apache.org/httpcomponents-client-ga/tutorial/html/のHttpClientを検討する必要がありますfundamentals.html#d4e292)。それはあなたに多くのコードを保存します。 – joeslice

答えて

2

この場合、私は通常、毎回徐々にスリープ時間を長くします。

サーバがほとんど起動している可能性があるので、もう一度試してみてください。しかし、その要求が失敗した場合は2秒待ちますが、失敗した場合は4などを待ちます。

待ち時間を30秒または1分などに制限したい場合があります。おそらく無期限に待つのではなく、最大試行回数を定義することをお勧めします。

このような何かが、数秒であなたの次の遅延を計算することがあります

seconds_to_wait = Math.min(60, Math.pow(2, try_num)); 
3

これはループでリモートサーバーに接続しようとすると問題はありませんが、実際には非常に一般的ですが、各繰り返しにThread.sleep(ms)があることを確認するか、サーバーホストがDOS

1

あなたの方法では、接続要求のあるサーバーが順番にハンマーになります。 catchブロックにThread.sleep()コールを含める必要があります(実際には待ってから実行する必要がある場合のみ実行されます)。

関連する問題