1

I am reading from an input stream which I am receiving from a server side of a socket. I have no way of knowing what the size of my response will be and I am reading into a byte array this is the code

public static String readString(InputStream inputStream) throws IOException {

    ByteArrayOutputStream into = new ByteArrayOutputStream();
    byte[] buf = new byte[4096];
    for (int n; 0 < (n = inputStream.read(buf));) {
        System.out.println("Got to this point n is "+n);
        into.write(buf, 0, n); 
    }
    into.close();
    System.out.println("passed this point");
    return new String(into.toByteArray(), AddATudeMessage.CHARENC); 
}

write now the numbers 11 and 235 get printed to the console so I assume the server is still writing output into the input stream. it however gets stuck at 235 and nothing seemes to be happending. I tried pausing the main execution thread for as much as 20 seconds at which point i receive 241 bytes from the server and then the same infinite loop reoccurs anyone know what's going on

4

4 に答える 4

3

コードの構造は、サーバーがソケットを閉じた場合にのみ機能します。そうしないと、サーバーが完了したのか、単に遅い(またはネットワークの輻輳がある)のかをあなたの側が知ることができません。

この問題を解決する方法は2つだけです。

  1. サーバーに最初に予想される長さを送信させ、次に読み取りを停止して、指定されたバイト数を受信したら続行します。
  2. 完了したら、サーバーに特別なデータシーケンスを送信させます。これは、通常のデータでは発生しないある種のEOFマーカーであり、データがなくなったときに通知するために探すことができます。

available()受信バッファが現在空であるが、転送中のデータがまだある場合はゼロを返す可能性があるため、を使用するソリューションは正しくありません。

于 2012-10-06T22:15:58.120 に答える
0

int available()(InputStream)の使用を検討してください
。この入力ストリームのメソッドの次の呼び出し元によってブロックされることなく、この入力ストリームから読み取る (またはスキップする) ことができるバイト数を返します。

于 2012-10-06T19:54:15.360 に答える
0

inputStream.read(buf)サーバーがソケットを閉じるまで 0 を返しません (または、メタ パケットなどの特殊なケース)。

于 2012-10-06T19:49:23.173 に答える