私は2台のコンピュータ間で長時間のTCP接続を持っています。第2のコンピュータは、毎回FINフラグを送信することができ、最初に接続correntを終了しなければならない(FINフラグを第2のコンピュータに送り返す)。JavaアプリケーションでFIN - tcpフラグを検出するにはどうすればいいですか?
2番目のコンピュータがFINフラグを送信していることと、Javaアプリケーションのsocket.close()メソッドを実行する必要があることをどのように知ることができますか?
私は2台のコンピュータ間で長時間のTCP接続を持っています。第2のコンピュータは、毎回FINフラグを送信することができ、最初に接続correntを終了しなければならない(FINフラグを第2のコンピュータに送り返す)。JavaアプリケーションでFIN - tcpフラグを検出するにはどうすればいいですか?
2番目のコンピュータがFINフラグを送信していることと、Javaアプリケーションのsocket.close()メソッドを実行する必要があることをどのように知ることができますか?
通常、接続を読み取る必要があります。この場合、EOFまたは適切なIOExceptionに対して-1が返されると、接続を閉じることができます。注:SocketTimeoutExceptionは、接続が閉じていることを意味しません。
例です。
boolean ok = false;
try {
int b = in.read();
ok = b >= 0;
if (!ok)
throw new EOFException();
} finally {
if (!ok)
in.close();
}
(彼らはFIN/RSTフラグを送信するために管理した場合)他の側で近い柔らかな接続を検出して、部分的にしか可能古いJavaのI/Oライブラリです。タイムアウトによってのみ壊れた接続を知るので、すぐには遠くないかもしれません。あなたのスレッドは、もう一方の側のパーティーが長くなくなったことに気づく前に、長い間ハングアップすることがあります。
これをよりうまく処理するには、nio
を使用する必要があります。そこでは、このような状況は、Selector
によって認識され、読み込みの準備ができているが、0より小さい値を返しているチャネルで読み取ることができます。これにより、すぐにソフト接続のリセットについて知ることができます。
一方、TCP/IPプロトコル自体のプロパティとして使用するライブラリにかかわらず、ハード接続の終了(たとえば、ワイヤまたはネットワークを切断しているユーザー)は、タイムアウトによってのみ検出できます。
小さなサンプルを表示できますか? – Divers
それについては何も魔法はありません、あなたはまだそれが良いかどうかを確認するために接続を読み取る必要があります。 –