3

クライアントソケットからデータを送受信するためのコードを作成しました。データの送信手順は正常に完了しましたが、ソケットからデータを読み取りたい場合、読み取るデータreadLine()がないときにメソッドブロックプログラムを実行します。

これは私のコードです:

StringBuffer document = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null)
     document.append(line + "\n");
reader.close()

すべての受信データを読み取ることができますが、readLineまたはread(byte []、int、int)メソッドは、読み取るデータがない場合にプログラムをブロックしますが、このメソッドはこの時点でnull/-1を返す必要があります。

4

2 に答える 2

5

これは、readLine()関数がブロッキング呼び出しであるためです。もちろん、ブロックされます。

より建設的にするにreadLine()は、ブロック呼び出しがコードの残りの部分に影響を与えないように、次のようなメソッドの呼び出しを別のスレッドにする必要があります。読み取り中のクラスから、ソケットからの読み取りを制御するためだけにスレッドを作成することをお勧めします。

スレッドが情報を受け取った場合に親クラスがそれを使用できるように、作成クラスへの参照を渡します。

于 2012-07-09T07:45:19.493 に答える
-1

BufferedReader には「ready()」というメソッドがあり、データを受信する準備ができたときに true を返します。「readLine()」呼び出しでブロックされたくない場合は、最初にデータを読み取る準備ができているかどうかを確認してください。

ドキュメントをご覧ください

于 2012-07-09T08:32:09.383 に答える