2012-02-21 32 views
3

我目前正在致力于一个简单的客户机/服务器文件同步。为此,客户端和服务器遵循简单的协议,该协议确定发送消息的顺序。Java文件同步期间的网络错误

缩短协议(使用对象/ ByteArrayStreams):

客户循环:

  1. 发送文件名
  2. 发送的FileInfo
  3. 发送数据
  4. 等待服务器确认

服务器环路:

  1. 读取文件名
  2. 读Fileinfo的
  3. 接收数据
  4. 发送确认客户

重复。

问题是协议在传输过程中发生错误和我通常得到StreamCorruptedExceptions,因为至少有一方期待别的东西。

下面是一个问题的示例情况: 服务器在文件接收过程中出现故障(3),无论出于何种原因。现在服务器等待文件名。由于错误,客户端到达第3部分发送数据。然后抛出异常,因为服务器需要一个消息对象并且客户端发送字节数据。

解决此问题的最佳方法是什么?

+0

您使用的是基于TCP的协议吗?你可以通过直接交换消息来重现这个错误吗?你有没有编写任何自定义的Externalizable实现? – cutchin 2012-02-21 01:57:52

+0

也许我用'协议'这个词来表达自己的错误。它只是发送消息,如文件名,数据使用Java(对象)流,然后确认消息。我在测试条件下没有遇到这个错误,但可以在使用过程中重现它。 – b1nh 2012-02-21 02:03:57

+0

从例外情况来看,它听起来像是在像UDP这样的“尽力而为”协议中使用ObjectInputStream和ObjectOutputStream。是这样吗? – 2012-02-21 02:05:17

回答

2

一些想法

  • 也许发送每个阶段后承认 - 这将是更容易控制
  • 来自服务器的ACK可发送校验客户端可以验证交易的完整性并继续前进。 (例如md5)。
  • 实现了一个“无状态”服务器 - 即可以根据您可以在每个事务开始时设置的某个“幻数”(报头)决定在哪个阶段上服务的特定服务器。 这样,客户端可以重试任何阶段,服务器将能够做出相应的响应。
  • 您可以扩展标题以包含唯一文件的唯一标识,这样您就可以并行化整个通信,并可以在多个阶段和多个客户端上传多个文件。

其他thougt

  • 如果你想避免这个问题,而不是解决它,可以使用非常有效的库来为你做的,而不是重新发明轮子。检查出protobuf - 掌握它很难,但是效率很高,gson这很容易掌握,虽然效率较低或许多其他现成的协议。
+0

感谢您的回答!我去了一个无国籍的服务器,现在它运行得更好。 – b1nh 2012-03-11 23:01:39