2

我试图首先读取 4 个字节(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

首先,读取两个字节并使用readUnsignedShort 方法的方式构造一个无符号的16 位 *整数*。这个整数值称为 UTF 长度,它指定要读取的附加字节数。然后通过分组考虑将这些字节转换为字符。每个组的长度是根据组的第一个字节的值计算的。组后面的字节(如果有的话)是下一组的第一个字节。

唯一的问题是您的协议似乎只发送 4 个字节的有效负载长度。也许您可以执行类似的方法,但将长度标记读取的大小增加到 4 字节/32 位。

Also, I see that you are just doing new String(bytes) which works fine as long as the encoding of the data is the same as "the platform's default charset." See javadoc So it would be much safer to just ensure that you are encoding it correctly(e.g. if you know that the sender sends it as UTF-8 then do new String(bytes,"UTF-8") instead).

于 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 回答