2009-09-30 13 views
7

Java NIO APIを使用してノンブロッキングIOを実行するサーバーを作成しました。時々クライアントアプリケーションが突然シャットダウンし(例えば、電力損失のために)、接続がサーバー側で開かれたままになる状況があります。NIO - 閉じた接続を検出する

同僚は同じ問題を抱えていて、この種のものを検出するために彼は回線上でハートビートを使用していると言いましたが、私はもっと簡単な方法があると思っています。他の誰かがこの問題に遭遇しましたか?

いくつかの追加情報:私の現在のサーバーデザインは、読み取り/書き込み操作を試みるときにIOExceptionを捕まえると、キーをキャンセルして対応するチャンネルを閉じます。このアプローチは99%の時間で動作するようです。私は、接続が開いたままに見える状況のほんの一握りを見てきました。

答えて

6

アプリレベルのハートビートがない場合、唯一の選択肢はTCPキープアライブに依存することです。しかし、デフォルトの間隔は非常に長い(2時間のように)。 RFCでは、2時間未満の間隔はお勧めしません。

これを短くすることはできますが、これはシステム全体のパラメータです。一部のOSでは、これを変更するためにカーネルを再構築する必要があります。

したがって、TCPベースのプロトコルには心拍が強く推奨されます。

+0

ありがとうZZコーダー - それは私が(恐れて)考えたものです。私はこれがTCPの特徴ではないことに非常に驚いています。 – Adamski

+0

「ping」ではなく、これらのアプリケーションは人間ではありません。 –

関連する問題