私は、クライアントがクラッシュしたかどうかを検出するためにキープアライブメカニズムを実装する必要があるクライアント/サーバアプリケーションを構築しています。私は、クライアント側とサーバー側の両方に別々のスレッドを持っています。クライアントスレッドは "ping"を送信して3秒間スリープし、サーバはBufferedInputStream
を読み込み、pingが受信されたかどうかをチェックし、そうであればpingカウンタをゼロにし、そうでない場合は+1し、サーバスレッド3秒間スリープし、pingカウンタが3に達すると、クライアントは死んだと宣言します。Javaでキープアライブを実装する
問題は、サーバーが入力ストリームを読み込み、ブロッキングコールを読み込んだときに、次のpingが受信されるまでブロックされ、遅れているかどうかに関係なくブロックされるため、サーバーはpingが見つからないことを検出しません。
ストリームの現在の値を読み取ることができるように、入力ストリームに何もない場合はブロックされません。
おかげで、
"サーバーがPingを検出しない"と説明してください。 –
たとえば、クライアントは3秒ごとにキープアライブを送信しており、サーバーはキープアライブも3秒ごとに確認しています。クライアントがkeep-aliveを10秒間送信しないと、サーバーがキープアライブをチェックすると、何も読み取られず、クライアントから何も送られないので、ストリームから読み取る呼び出しはそれまでブロックされません10秒後に次のキープアライブを受信します。その時点で、サーバはキープアライブを受信したことを喜んで宣言します。だから失われたキープ・アライブを決して検出しません。 – comatose