Javaクライアントは常にJavaサーバーに接続されており、サーバーが送信したものを出力します(以下の抜粋を参照)。コンピュータ起床後のMacOSXでJavaソケット接続が壊れていることを認識する方法
問題は、クライアントコンピュータ(MacOS X)がスリープ状態になって再び起動すると、クライアントがin.readLine()
でハングし、接続が壊れていることがわかりません。クライアントがreadLine()
でブロックを停止し、実際にSocketTimeoutException
をスローするように、ソケットにSO_TIMEOUT
を追加しましたが、壊れた接続から再度回線を読み込もうとします。
私の質問は以下のとおりです。なぜin.readLine()
はIOException
(私は再起動、接続できるように)で失敗しないとどのように私は、クライアントは、Mac OS X上でawake->sleep->awake
サイクル上のサーバーに再接続することができますか?
Socket socket = new Socket(...);
socket.setSoTimeout(10000);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
[...]
while (true) {
try {
while ((serverSays = in.readLine()) != null) {
System.out.println("Server says: " + serverSays);
}
} catch (SocketTimeoutException e) {
continue;
}
// An exception other than SocketTimeoutException will break the while-loop.
}
// If another exception other than SocketTimeoutException occurs,
// catch it and re-initiate the connection and start over.
問題は、 'IOException'は投げられないということです。 'SocketTimeoutException'をスローした後、何度も何度も読み直そうとします。反対側のサーバーを強制終了しても、クライアントは(IOExceptionをスローせずに)行を読み込もうとします。 –
この接続に対してpingを実行できます。シンプルなデータをサーバーに送信してみてください。成功すれば、接続は生きています。そうでなければ、2番目のcatchブロックでソケットを閉じてコードを実行します。 –
あなたはsocket.isConnected()をチェックすることができますが、それが役立つかどうかはわかりません。 –