2016-12-02 12 views
0

それは0x01のと同じである一方で、クライアントは、ループ内のステータスバイトを読み取りますなぜJavaは同じソケットを何度も何度も読んでいますか?

do { 
    input.read(magicWord); // ALWAYS THE SAME BYTE AFTER THE SERVER IS GONE 
    if (magicWord[0] == (byte) 0xFF) 
     break; 

    // retrieve the progress 
    byte[] cur = new byte[4]; 
    input.read(cur); 

    // and set the progress bar 
    progressBar.setValue(ByteBuffer.wrap(cur).getInt()); 
} while (!isCancelled()); 

しかし、サーバがクラッシュした場合(SIGKILLによって例えば)クライアントはこのループでありながら、クライアントが最後に取得し続けますmagickWordはサーバーから何度も何度も送信されます(無限ループに入ります)。 SO_TIMEOUTに設定しても問題は解決しません。クライアントはどのようにサーバー障害を検出する必要がありますか?

答えて

3

何も読みません。 input.read(magicWord)返品-1。以前の読み取り(readメソッドでバッファがクリアされていない)以降、バッファ内の0xFFバイト。

+0

ありがとうございます、私の問題を解決しますが、サーバーがなくなったときに実際に-1を返します。 奇妙なことに、例外はスローされません。 – milos

+0

はい。私は「-1」の間違いを反映するように答えを変えます。 – talex

+1

@milosそれは*奇妙ではありません。**予想される**動作です。あなたの目的のために*前提*を作成しないように、前もって学んでください。 – GhostCat

1

readを呼び出すと、読み取られたバイト数が返されます。あなたはその結果を確認しません。

あなたは読み取りバッファをクリアしません。したがって、常に同じバイトが見え続けます。

0

コードが間違っています。

readコールの戻り値を確認する必要があります。ドキュメントでそれを調べて、それに応じてコードを書いてください。

関連する問題