2009-03-19 3 views
3
InetAddress serverAddr = InetAddress.getByName(serverAddress); 
String hostname = serverAddr.getCanonicalHostName(); 
Socket socket = new Socket(serverAddr, portNumber); 
// Freezes before this line if the server is unavailable 
socket.setSoTimeout(3000); 

サーバーの可用性のチェックを実装する方法やフリーズを防止する方法を知っている人はいますか?サーバーが利用できない場合、アプリケーションのフリーズを防止するにはどうすればよいですか?

答えて

6

two-argument constructorを使用すると、すぐにJavaに接続するように指示します。あなたが探しているものは可能性が高いです

Socket socket = new Socket(); 
// Configure socket here 
socket.connect(new InetSocketAddress(serverAddr, portNumber), 3000); 
if (! socket.isConnected()) { 
    // Error handling 
} else { 
    // Use socket 
} 

これはまだ3秒間ブロックされます。これを防ぐには、接続にスレッドを使用します。

3

私は明らかに助言するつもりです:これを行うには別個のスレッドを使用してください。スレッドは、アプリケーションをフリーズすることなくフリーズできます。

0

(それは、接続が完了した後、スレッドを「再結合」する方法を扱っていないよう。 - あなたはそれを行う必要があると仮定)。これは、過度に単純化したかもしれ

また、これがために起こっている場合頻繁に発生する場合は、Threadを手動で作成する代わりにExecutor(スレッドプール)を使用したい - スレッドの作成/削除は高価です。

Iこのスニペットでも無視例外処理(完全に些細なことではないである。)

Runnable runnable = new Runnable() { 
    public void run() { 
     InetAddress serverAddr = InetAddress.getByName(serverAddress); 
     String hostname = serverAddr.getCanonicalHostName(); 
     Socket socket = new Socket(new InetSocketAddress(serverAddr, portNumber), 3000); 
     /* ... do more of your after-connection processing here, assuming it doesn't 
     * need to be in the original "dispatch" thread. 
     */ 
    } 
}; 

Thread t = new Thread(runnable); 
t.start(); 
関連する問題