[英]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);
有没有更好/有效的方法?
首先, 读取两个字节,并以与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.