如何验证从java中的套接字流接收的Integer

时间:2014-09-29 13:22:15

标签: java sockets validation

在我的应用程序中,客户端以这种格式将文件发送到服务器,

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个字节是否是有效整数?

3 个答案:

答案 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();