1

標準コードを変更する簡単な方法はありますか:

in = new InputStreamReader(socket.getInputStream());
String message = "";
while ((size = in.read(buf)) != -1){
    message += new String(buf, 0, size);
}

read()ブロックしないように。私はやってみました:

if (!in.ready())
   //throw exception

しかし、これは常に例外をスローします。多分:

socket.setSoTimeout(120000);
in = new InputStreamReader(socket.getInputStream());

しかし、これは、以下の誰もが述べているように、機能しません。他のアイデア?

4

2 に答える 2

2

「ブロッキングを防ぐ」ために...

1)NIOを使用します(下のチャネルを使用する必要があります)。または、MINA、XNIO、xSocketなどとしてのNIOの使用に関するより優れたラッパーです。対処すべき問題が多数あるため、NIOを直接使用することはお勧めしません。

2)スレッドを使用します。頭痛の種を避けるために、必ず標準のスレッドデータ分離ルールを採用してください。ConcurrentLinkedQueueなどの同時実行性を意識したデータ構造はあなたの友達です。

setSoTimeoutはブロッキングを防ぎません。ブロッキング操作にタイムアウトを追加するだけです。私はそれが持っている多くの「癖」のためにそれを避けます。自己責任。

于 2009-11-02T01:45:56.583 に答える
2

リーダーをサポートしている InputStream の種類に応じて、またリーダーに固定長の文字エンコーディングを使用している場合は、バッキング ストリームで利用可能なメソッドを使用できる場合があります。InputStream のほとんどの実装では、available()ブロックせずに読み取ることができるバイト数を返します。文字エンコーディングで 1 文字あたりの固定バイト数が使用されている場合、ブロックせずに InputStreamReader からどれだけ読み取ることができるかがわかります。

于 2009-11-02T00:04:21.123 に答える