我想通过网络从java实例向另一个实例发送消息(可序列化对象)。我想验证整个对象是否已正确发送。
我想我的第一步是计算对象的校验和。然后我在对象中包含该校验和,或者为该消息及其校验和构建容器对象。
然后我的第二步应该是验证另一方对象的校验和。
我的第三步是让接收方发送一条确认消息,说明有问题的对象已经收到,并且校验和已经通过(或不通过)。如果我收到校验和失败警告,我会尝试重新发送几次。
过了一会儿,如果我没有收到确认,我也会尝试重新发送几次。
问题:
我的协议听起来是否正确验证对象是否已正确传输?
我还想知道我应该如何在java中实现它?我是否使用CRC32类生成校验和?
额外问题:如果我要压缩每条消息,请在压缩之前生成校验和,如何在java中压缩对象?
答案 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中的信息,然后写出确认信息:)