Java TCP Socket接收具有指定长度的字节

时间:2012-07-23 19:09:39

标签: java sockets tcp

我试图首先读取指定消息大小的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);

有更好/更有效的方法吗?

3 个答案:

答案 0 :(得分:2)

来自readUTF的JavaDocs

  

首先,读取两个字节并用于构造无符号 16位   * 整数 *,与readUnsignedShort方法完全相同。这个   整数值称为UTF长度并指定数量   要读取的其他字节。然后将这些字节转换为   通过分组考虑它们的字符。每组的长度是   根据组的第一个字节的值计算。字节   跟随一个组,如果有的话,是下一组的第一个字节。

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

另外,我看到你只是在做新的String(字节),只要数据的编码与“平台的默认字符集”相同,它就能正常工作。请参阅javadoc因此,确保正确编码它会更安全(例如,如果您知道发送方将其作为UTF-8发送,则执行新的字符串(字节,“UTF-8”))

答案 1 :(得分:0)

怎么样

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

return dis.readUTF();

答案 2 :(得分:-1)

您可以像这样使用read(byte[] b, int off, int len)

byte[] data = new byte[len];
dis.read(data,0,len);