1

サーバーソケットからのバイトの読み取りについて質問があります。ネットワーク上のリテラシー 8192b バイトのデフォルト値を使用しています。問題は、バッファ容量を超えるファイルを送信する必要がある場合があることです。異なる時間に到着するパケットが関連していることを知っているので、バッファの増加を避けるには?

クライアント側のスニペット:

{
String c = xxxxx //imagine that it an string format JSON with 64000bites length
OutputStream wsOS = socket.getOutputStream();
wsOS.write(new String(data,"UTF-8"));
wsOS.flush();
}

サーバー側が JSON 文字列を受信した場合:

{

 byte[] buffer = new byte[8192];
 int size = 0;

 StringBuilder str = new StringBuilder();

 size = wsIS.read(buffer);

if (size > 0) {

    str.append(new String(buffer, "UTF-8")
            .substring(0, size));

    while (wsIS.available() > 0) {
        size = wsIS.read(buffer);
        str.append(new String(buffer, "UTF-8")
                .substring(0, size));
    }

}
}

問題:

すべての文字列がサーバーに到着しましたが、ブロック 8192b で - 最後の文字列 JSON がプレビューの一部であるかどうかがわからないため、文字列を連結できません。

4

1 に答える 1

2

バッファ サイズを増やしても、1 回の呼び出しで文字列全体が読み取られるという保証はありませんwsIS.read

これが意味することは、前の文字列がどこで終わり、新しい文字列が始まるかを知るためのメカニズムが必要だということです。いくつかの選択肢は次のとおりです。

  1. 使用ObjectOutputStream/ObjectInputStream
  2. 実際に文字を書く前に文字数を書いてください。読み取り側では、長さを読み取り、次にそれらの多くの文字を読み取ります
于 2012-11-10T01:18:59.293 に答える