2

最初にメッセージのサイズを指定して4bytes(int)を読み取り、次にバイト数に基づいて残りのバイトを読み取ろうとしています。私はこれを達成するために次のコードを使用しています:

DataInputStream dis = new DataInputStream(
                        mClientSocket.getInputStream());

// read the message length
int len = dis.readInt();

Log.i(TAG, "Reading bytes of length:" + len);

// read the message data
byte[] data = new byte[len];
if (len > 0) {
    dis.readFully(data);
} else {
    return "";
}
return new String(data);

これを行うためのより良い/効率的な方法はありますか?

4

3 に答える 3

2

readUTFの JavaDocsから:

最初に、 2 バイトが読み取られ、readUnsignedShort メソッドとまったく同じ方法で、符号なし16 ビット *整数*を構築するために使用されます。この整数値は UTF 長と呼ばれ、読み取る追加のバイト数を指定します。これらのバイトは、グループで考慮して文字に変換されます。各グループの長さは、グループの最初のバイトの値から計算されます。グループに続くバイトがある場合は、次のグループの最初のバイトです。

これに関する唯一の問題は、プロトコルがペイロード長に対して 4 バイトしか送信していないように見えることです。おそらく、同様の方法を実行できますが、読み取る長さセンチネルのサイズを 4 バイト/32 ビットに増やすことができます。

また、データのエンコーディングが「プラットフォームのデフォルトの文字セット」と同じである限り、正常に機能する new String(bytes) を実行していることがわかります。javadocを参照してください。したがって、正しくエンコードされていることを確認する方がはるかに安全です (たとえば、送信者が UTF-8 として送信することがわかっている場合は、代わりに new String(bytes,"UTF-8") を実行します)。

于 2012-07-23T19:28:14.810 に答える
0

どうですか

DataInputStream dis = new DataInputStream(new BufferedInputStream(
                     mClientSocket.getInputStream()));

return dis.readUTF();
于 2012-07-23T19:13:05.177 に答える
-1

read(byte[] b, int off, int len)このように使用できます

byte[] data = new byte[len];
dis.read(data,0,len);
于 2012-07-23T19:21:33.923 に答える