2017-11-16 15 views
0

サーバーアプリケーションがリッスンしている場合にうまく動作するNettyクライアントがあります。しかし、サーバーアプリケーションが実行されておらず、ポートでリッスンしていない場合でも、クライアントはサーバーが存在すると見なして実行します。NettyサーバーがポートでリッスンしているかどうかをNettyクライアントが検出できるようにするにはどうすればいいですか?

私は、サーバーがリッスンしていないときに、データを送信することさえしないで、代わりにユーザーに管理者などに連絡するように指示することもしません。これも可能ですか?

注: クライアントが指定されていないポートまたはipに接続しようとすると、クライアントは処理できる例外をスローします。私の問題は、サーバが通常聞くべきポートでリッスンしていないときに例外がスローされないことです。

+0

[URLConnection.setConnectionTimeout](https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html#setConnectTimeout-int-)を使用して接続を試みることができます。 –

+0

しかし、タイムアウトが終了するまで待つ必要があります。とにかくクライアントが終了するまで待って、結果が受信されたかどうかを確認し、そうでなければ処理します。しかし、タイムアウトやクライアントが終了するのを待つのではなく、私のサーバーで何が起きているのかを知る方法を好むだろう。また、何らかの理由で接続が遅い場合はどうなりますか?その場合、タイムアウトは接続を中断しないでしょうか? – giro

+0

「ping」の一種です。 localhostの場合、ポートを自分自身にバインドしようとする可能性があります(ポートがフリーであることを確認してください)が、それはひどいハックです。ごめんなさい。 –

答えて

1

Yeap。場合によっては、サーバーがダウンしている/ポートで受信していないことを検出できません。

この場合、クライアントパイプラインにReadTimeoutHandlerを追加することができます。特定の期間内にクライアントがサーバーからメッセージを受信しなかった場合に備えて、ReadTimeoutExceptionを送信します。 しかし、これでは不十分かもしれません。たとえば、サーバーとクライアント間の接続があまりアクティブでない場合、この例外もスローされる可能性があります。その場合、ピンポンハンドラを実装する必要があります。その場合、接続がアクティブであり、その場合に例外がスローされないことをReadTimeoutHandlerが伝えます。

+1

"PingPongハンドラ"の概念は私の問題のために働くようです。いくつかのグーグルの後、私はこの例のコードを試したhttps://gist.github.com/Topher-the-Geek/6729681#file-pingpongserverhandler-java – giro

関連する問題