在我的应用程序中,客户端以这种格式将文件发送到服务器,
4 bytes of file length + actual file content
因此服务器读取前4个字节以获取消息长度,然后读取该消息长度。
服务器代码将是这样的,
ByteArrayOutputStream lengthBuf = new ByteArrayOutputStream(4);
byte[] output = new byte[4];
//Reading first 4 bytes from InputStream
int readLength = inputStream.read(output);
lengthBuf.write(outpu, 0, readLength);
//Converting to integer
int length = ByteBuffer.wrap(lengthBuf.toByteArray()).getInt();
适用于有效案例。但是如果客户端未能在前4个字节中追加长度,那么这个长度会得到一些垃圾值(1481988969)。如何验证数据的前4个字节是否是有效整数?
答案 0 :(得分:2)
只要固定为4个字节并且整数的所有值都可以有效,就没有办法。 但是,如果你可以更多的字节。您可以添加第五个字节,例如使用CRC或其他错误检测代码来检查值是否已正确传输。
另一种选择是,如果你实际上不需要四个传输字节的所有位,那么你可以使用它们的一些位。
两者实际上都需要访问Socket的Server-Implementation。如果您没有此访问权限,则无法检查整数是否正确。您只能排除您知道它们永远不会发生的文件大小。 E.g:
if (integer < MAX_FILE_SIZE and integer > 0) valid();
// or integer >= 0 if empty files are allowed.
else invalid();
答案 1 :(得分:1)
我会这样做。
DataInputStream dis = new DataInputStream(inputStream);
int len = dis.readInt(); // read exactly 4 bytes
byte[] bytes = new byte[len];
dis.readFully(bytes);
当你第一次阅读时,你可能会得到少于4个字节。当您阅读实际数据时,您可能需要多次阅读才能完成所有操作。 read(byte[])
一旦获得1个或更多字节就可以返回。
答案 2 :(得分:0)
为什么不这样做;当客户端无法附加尺寸&gt;
时,至少用尺码4初始化它if(length==null) {
size = 4 ;
}
ByteArrayOutputStream lengthBuf = new ByteArrayOutputStream(size);
int length = ByteBuffer.wrap(lengthBuf.toByteArray()).getInt();