0

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

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

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

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

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

问题 :

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

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

额外问题:如果我要压缩每条消息,我是否会在压缩之前或之后生成校验和,以及如何在 java 中压缩对象?

4

3 回答 3

2

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

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

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

于 2011-01-18T17:44:38.000 回答
1

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

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

于 2011-01-18T17:11:54.470 回答
0

我同意你的步骤,还有一个补充(这就是我在 ObjectIO 流上所做的) - [1] 将传入的内容读取为 Object,使用“instanceof”找到它的类。如果它不是预期的类,是时候调试进来的东西了。

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

于 2011-01-19T06:51:17.037 回答