0

in.available()> 0がコメントアウトされているのに、なぜこれがうまく機能するのか誰かが私に説明できますが、私がそれを元に戻すと壊れますか?

mySocket = new Socket("blahblah", 12345);
BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream());
....
char result[] = new char[length];       
for (int i = 0; i < length && !mySocket.isClosed() /*&& in.available()>0*/; i++){
    result[i] = (char)in.read();
}

具体的には、ユーザーが用語を検索できるAndroidアプリを作成しています。その検索はスペース内の何かに送信され、結果はxml形式で返され、それらを使用して処理を行います。返されるxmlが十分に小さい場合(上記のコードの「長さ」を参照)、コードはin.available()> 0が残っていても問題なく機能します。ただし、長さが大きい場合、in.available()は0を返します。しかし、それがコメントアウトされているので、すべてがスムーズに実行され続けます。

何故ですか?そして、それは私が心配して修正する必要があるものですか?

4

2 に答える 2

2

in.available()は、その時点でブロックせずにデータを読み取ることができるかどうかを通知します。ソケットにはデータのストリームがあるため、すぐには利用できない場合がありますが、短時間で利用できる場合があります。たとえば、1ギガビットの接続がある場合、完全なパケットは15マイクロ秒以内になります。これはコンピュータにとって長い時間です。

于 2012-07-13T15:46:45.450 に答える
1

データが大きいときにin.available()== 0である理由は、まだソケットに書き込む機会がないためだと思います。in.available()を使用する必要はありません。また、一度に1つの文字を読み取ることはお勧めしません。これは、大量のデータがあり、ネットワーク上で非常にチャットが多いため、非常に遅くなります。サイズが「長さ」のバイト配列を読み取ることを検討してください。

于 2012-07-13T15:47:09.977 に答える