2

イベントによってクライアントと通信する可能性はありますか? つまり:

私はクライアントを接続しました、InputStreamReaderそしてPrintWriter

in = new BufferedReader(new InputStreamReader(
                        client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);

サーバーを使用するin.readLine()と、受信データを待ちます。しかし、私はこの状況を持っています:

  1. クライアントはデータを送信しませんでした
  2. 接続はまだ有効です
  3. クライアントにデータを送信する必要があります (ただし、in.readLine()プロセスはまだハングしています)。応答を待つ必要があります。

質問は次のとおりです。非同期に受信するデータを処理する最善の方法は何ですか? 「イベント」のようなものを意味します。読み取り用のスレッドと書き込み用の別のスレッドを作成する必要がありますか? 1 つのスレッドで実行できる場合は、コードの例を教えてください。を待って中止することは可能in.readLine()ですか?

4

2 に答える 2

1

java.nioJava は、パッケージを通じてノンブロッキング I/O を提供します (こちらを参照)。しかし、Java の「nio」チャネルは、.NET からのストリームと相互運用しませんjava.io。したがって、nio を使用する場合は、リスナーから順に nio を使用してサーバーを構築する必要があります。

既存のストリームに行き詰まっている場合はjava.io、クライアントごとのスレッド モデルを使用する必要があります。または、単一のスレッド (またはスレッドのプール) が一連のクライアントを繰り返しループして管理し、instream.available()をポーリングして、どのクライアントにデータを処理する準備ができているかを判断するシステムを考案する必要があります。もちろん、この後者の場合、ビジー ループは避けたいので、Thread.sleep を適切に使用することもおそらく適切です。

于 2012-11-28T05:39:47.613 に答える
1

私の意見では、プログラムを非同期で動作させたい場合は、ソケット IO を実行する別のスレッドを用意するのが最善です。http://en.wikipedia.org/wiki/Observer_patternをご覧ください。

単純なアプリケーションの場合、受信データをリッスンする別のスレッドを作成し、このスレッドに「オブザーバー」または「イベント リスナー」を登録します。データが入ってきたら、オブザーバーに通知して、必要なアクションを実行できるようにします。

リスナー スレッドがアイドル状態でデータを待機している間、メイン スレッドは正常に進行できます。

Java 同時実行プログラミングにも精通していることを確認してください。

于 2012-11-28T05:25:41.477 に答える