繁体   English   中英

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

[英]Java TCP Socket receiving bytes with specified length

我试图先读取4个byte(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);

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

readUTF的JavaDocs

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

唯一的问题是您的协议似乎仅发送4个字节作为有效载荷长度。 也许您可以执行类似的方法,但是将前哨读取的长度增加到4字节/ 32位。

另外,我看到您只是在做新的String(bytes),只要数据编码与“平台的默认字符集”相同,它就可以正常工作。 请参见javadoc。因此,仅确保您正确地对其进行编码会更安全(例如,如果您知道发送方以UTF-8格式发送它,则改为使用新的String(bytes,“ UTF-8”))。

怎么样

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM