2011-11-08 5 views
0

Nettyサーバー側にリスナーが存在し、クライアントが予期せず終了したとき(クライアントm/cのLANケーブルが取り外されたときなど)に通知されます。 DefaultChannelHandler内のどのメソッドも呼び出されていません。 LANケーブルが抜かれたときにクライアントが非アクティブ(データの送受信を行わない)であるとします。JBoss Nettyでクライアントが予期せず終了したときに通知を受ける

チャンネルが有効かどうかを確認するには、サーバー側にキープアライブモニターを実装する必要がありますか?

答えて

2

実際には、TCP/IPで予期せずドロップされた接続を検出する方法はありません。それを行う方法がある場合、それは '予期せず'と呼ばれるべきではありません。 :-)

ドロップされた接続を検出する最も堅牢な方法は、定期的にメッセージを送信するか、pingメッセージを送信するなど、タイムアウトのあるメッセージを待つことです。

この動作を実装するには、IdleStateHandlerを使用できます。パイプラインに挿入し、ハンドラをIdleStateAwareChannelHandlerまたはIdleStateAwareChannelUpstreamHandlerに拡張します。

また、クライアントやサーバーがLANなどの制御されたネットワークで動作している場合は、TCPキープアライブパケットをより頻繁に送信するようにオペレーティングシステムを構成できます。詳細は、TCP keepalive HOWTOを参照してください。しかし、私はこれがWAN環境下で確実に動作するのではないかと疑います。 (誰かがWAN環境でTCPキープアライブのタイムアウトを実験した場合、あなたの話を分かち合ってください)

+0

ありがとうございました。上記の動作を試みます。 – avis

0

パイプラインにReadTimeoutHandlerを追加しようとしましたか?私は、サーバーが指定された秒数の間、チャネルからデータを読み取っていないと、これがReadTimeoutExceptionを投げると信じています。

私はクライアントでこれを使って再接続を実装しましたが(UpTimeの例のように)、ここでも動作します。

+0

私はクライアントから定期的なpingのメカニズムでサーバーでIdleStateHandlerを使用しました。それは働いた:) – avis

0

フェールクローズのキープアライブを設計して実装しました。ここで重要なことは、タイムアウト後にチャネルを閉じてから再度開くことです。