0

アプリケーションで2つのスレッドを実行しています。1つは着信パケットをチェックし、もう1つはパケットを処理して送信します。彼らは両方とも同じストリームでそれを行います。

1の例:

while (connection open) {
    in.readObject() instanceof ...
}

2の例:

while (connection open) {
    processPacket(in)
}

EOFExceptionは、スレッドがストリームを同時に使用しようとする場合であると確信しています。これは一定のEOFではありませんが、1秒ごとにEOFを取得するのと同じように、残りは正常に機能します。そのため、それらが重複し、同時にストリームを使用しようとしているのではないかと思います。

それが問題である場合、現在の更新速度を維持し、2つのスレッドを使用しながら、それらを同期して次々に実行する方法を知っている人はいますか?

着信のチェックはパケットが受信されるまで1行で待機し、サーバーが常にプロセスを送信してパケットをチェックする必要があるため、2つのスレッドが必要です。

EOFExceptionを修正するにはどうすればよいですか?

4

3 に答える 3

1

EOFException が発生した場合は、通常、相手側が電話を切ったことを意味します。通常、これらは読み取り側で取得します。

ここに同様のSOの質問があります

編集 1: 問題は、ソケットが閉じられている理由です。サーバー側のプログラマブル タイマーが X 分以内にデータがないことをチェックしている、ファイアウォールが接続を閉じている、ネットワークの中断など、さまざまな理由が考えられます。

于 2012-05-23T16:55:18.950 に答える
1

両方のスレッドが同じストリームを読み取ってはなりません。

オブジェクトを読み取って ConcurrentLinkedQueue に入れる必要があります。次に、2 番目のスレッドから、処理の準備ができているオブジェクトのキューを確認できます。

于 2012-05-23T18:43:57.303 に答える
1

EOFException は「正常」です。1つのスレッドでも発生します。2 つのスレッドで同時に読み取るアーキテクチャは機能しない可能性がありますが、それがこの問題の原因ではありません。原因は、ピアが接続を閉じたことです。これは起こります。アプリケーション プロトコルにメッセージ カウント、終了通知、または EOS を予測するその他の手段が含まれていない限り、呼び出している読み取りメソッドに応じて、EOFExceptions を取得するか、readLine() が null を返すか、read() が -1 を返します。

于 2012-05-23T22:12:38.107 に答える