如何验证对象传输是否完整

时间:2011-01-18 17:00:48

标签: java crc

我想通过网络从java实例向另一个实例发送消息(可序列化对象)。我想验证整个对象是否已正确发送。

我想我的第一步是计算对象的校验和。然后我在对象中包含该校验和,或者为该消息及其校验和构建容器对象。

然后我的第二步应该是验证另一方对象的校验和。

我的第三步是让接收方发送一条确认消息,说明有问题的对象已经收到,并且校验和已经通过(或不通过)。如果我收到校验和失败警告,我会尝试重新发送几次。

过了一会儿,如果我没有收到确认,我也会尝试重新发送几次。

问题:

我的协议听起来是否正确验证对象是否已正确传输?

我还想知道我应该如何在java中实现它?我是否使用CRC32类生成校验和?

额外问题:如果我要压缩每条消息,请在压缩之前生成校验和,如何在java中压缩对象?

3 个答案:

答案 0 :(得分:2)

如果您的网络具有相当可靠的错误率,则无需添加额外的校验和。我会在没有校验和的情况下实现您的协议,如果您确定需要它,请添加。

您可以使用DeflatorOutputStream,InflatorInputStream压缩数据。如果压缩数据已损坏,则在解压缩时,Object很可能会抛出异常。即,它不太可能有一个微妙的错误。

但是,除非您的对象很大,否则它们可能无法很好地压缩,并且最终会因压缩而变大。

答案 1 :(得分:1)

对于压缩,我想推荐Apache Zip Utilities: http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/package-summary.html

如果您正在压缩,则可以跳过校验和。压缩算法对数据损坏非常敏感。如果对象在另一端无法解压缩,则在传输过程中丢失了一些信息。

答案 2 :(得分:0)

我同意你的步骤,添加一个(这是我做的,通过ObjectIO流) - [1]将传入的东西读作Object,用“instanceof”找到它的类。如果它不是预期的类,那就是调试即将发生的事情的时间。

在其他一些情况下,我还会发送包含有关下一个到达对象内容的信息的字符串。解析这个字符串,读取对象,对其进行类型转换,确保它具有String中的信息,然后写出确认信息:)