Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TCP套接字接收指定长度的字节_Java_Sockets_Tcp - Fatal编程技术网

Java TCP套接字接收指定长度的字节

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

我试图先读取指定消息大小的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);
有更好/更有效的方法吗?

怎么样

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代码交互时。这里唯一的气味是调用
字符串
构造函数而没有指定正确的编码。