Java TCP套接字接收指定长度的字节
我试图先读取指定消息大小的4个字节(int),然后根据字节计数读取剩余的字节。我使用以下代码来完成此任务:Java TCP套接字接收指定长度的字节,java,sockets,tcp,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:" + le
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);
有更好/更有效的方法吗?怎么样
DataInputStream dis = new DataInputStream(new BufferedInputStream(
mClientSocket.getInputStream()));
return dis.readUTF();
您可以像这样使用read(byte[]b,int off,int len)
byte[] data = new byte[len];
dis.read(data,0,len);
从readUTF的开始:
首先,读取两个字节并用于构造一个无符号16位
*整数*的格式与readUnsignedShort方法完全相同。这
整数值称为UTF长度,并指定
要读取的其他字节。然后将这些字节转换为
通过分组来考虑角色。每组的长度为
根据组的第一个字节的值计算。字节
组(如果有)后面是下一个组的第一个字节
唯一的问题是,您的协议似乎只发送有效负载长度的4个字节。也许您可以使用类似的方法,但将长度sentinel read的大小增加到4字节/32位
此外,我看到您只是在做新的字符串(字节),只要数据的编码与“平台的默认字符集”相同,就可以正常工作。因此,只需确保正确编码就更安全了(例如,如果您知道发送方将其作为UTF-8发送,则改为做新的字符串(字节,“UTF-8”).谢谢你的建议。我需要读取指定数量的字节。不是全部信息。dis.readUTF()读取流中的所有内容,对吗?如果您使用阻塞I/O,我认为它非常有效,尤其是当您必须与非Java代码交互时。这里唯一的气味是调用
字符串
构造函数而没有指定正确的编码。