2011-02-03 7 views
3

私は、入力ストリームがブラックボックス(B)になっています。このストリームから入って来るすべてのメッセージは直列化されたバイナリデータであり、各メッセージは4バイトのintで始まります。そのほとんどはデータを記録しており、1日24時間稼動しています。 readInt()メソッドを使ってこれらの4バイトを読みます。現在、時には、メインスレッドがEOFExceptionで終了し、プログラムがクラッシュすることがあります。入力バイトストリームでreadInt()ブロックを作成する方法は?

これを調べたところ、readInt()の時点で入力ストリームに4バイト未満があることが判明しました。私の推測では、バッファは連続した読み込みの間に十分に速くいっぱいではないということです。私が考えている解決策には、読み込み前にavailable()をチェックすること(データの量を考慮してあまりにも多くのサイクルを消費する)や、例外が発生したときに再起動することが含まれます。私がreadInt()を使ってブロックすることができるのであれば、それが最良の方法だと思います。私はreadInt()の実装を見てきましたが、もう一度read()でブロックすることになります。

誰かが良い解決策を知っていますか?

+1

テキストの壁紙を作成して読み込みフローをブロックしているようですが、いくつかの段落を追加すると読みやすくなり、回答に役立ちます。 –

+0

'readInt()'メソッドは何ですか? – axtavt

+0

あなたはどのようなストリームを読んでいますか? –

答えて

1

呼び出し階層をブロックするコールは、両方の呼び出しが同じ実行スレッドの一部であるように、すべての呼び出しをチェーンブロックにするためにバインドされています。 readIntメソッドがDataInputStreamの場合、基本入力ストリームのメソッドが4回呼び出され、データが使用できなくなるまでブロックされます。したがって、「バッファが十分に速くは満たされない」という恐れはありません。論理的。

サーバプロセスが停止したり接続が切断された場合に、クライアントが-1を読み終えて例外をスローする場合に、この種の例外が発生しました。クライアント/サーバーコードで何らかの例外が発生していますか?ログに疑わしいものが表示されますか?

+0

あなたはブロックについて正しいです。私の場合のサーバーは、データの断続的なチャンクを送信する可能性のある組み込みデバイスです。ストリーム上のものが利用できない場合、read()は-1を返し、readInt()はEOFExceptionを返します。これは予想される動作です。これを回避する方法はありますか? – user461150

+0

データが決して流れるのを止めず、ストリームを閉じるのを心配していないと仮定できます。実用的な目的のために、接続がサーバー側で決して閉じられず、ストリームの実際の終わりに決して到達しないと仮定することができます。 – user461150

+0

既に述べたように、サーバが-1を返すことを決定しない限り、クライアントはそれを「待機」するので、「ストリームで利用できないときは」ありません。サーバーからのこのデータはストリームであり、チャンクで流れるため、クライアント/サーバーソケットに適切なタイムアウトが設定されていることを確認しましたか? –

1

私はあなたがDataInputStreamを使用していると思います。そのクラスは、それがラップするストリームがread()メソッド(実際には入力データが利用可能になるまでブロックする)から-1を返したときにEOFExceptionをスローします。

私は、メインストリームの読み取りが最初に-1で返される理由を見ておくべきだと思います。

0

ブロッキングが読み込む必要があり、あなたが得るてEOFExceptionがスローされた基本的なInputStreamインタフェースは不完全なint型を返すことは悪い考えですので、のreadInt()は、ストリームマーカーの終わりに遭遇したとき、それはE ND Oをスローしますf F ile例外。

ストリームのもう一方の端がその端に達しているか、閉じられているか、接続されていないためにがスローされます。ブラックボックスが接続を終了するかどうか確認する必要があります。

ストリームはネットワークベースなので、ソケットにタイムアウトが設定されている可能性があります。この場合は、ソケットのSOTimeoutの値を変更してみてください。

+0

ブラックボックスは埋め込みデバイスであり、間欠的なデータチャンクを送信することがあります。これは、相手側で<4バイトしか発生せず、しばらくの間はアニーリングを送信しない可能性があります。私はすべての4バイトが受信されるまでブロックしようとしています。 SOTimeoutは良い考えです。私は今それを調べ、それが役立つかどうかを見ていきます。 – user461150

関連する問題