文件同步期间的Java网络错误

时间:2012-02-21 01:50:36

标签: java error-handling synchronization client-server

我目前正致力于简单客户端/服务器文件同步。为此,客户端和服务器遵循一个简单的协议,它决定了消息的发送顺序。

缩短协议(使用Object / ByteArrayStreams):

客户端循环:

  1. 发送文件名
  2. 发送fileinfo
  3. 发送数据
  4. 等待服务器确认
  5. 服务器循环:

    1. 读取文件名
    2. 阅读fileinfo
    3. 接收数据
    4. 向客户发送确认
    5. 重复。

      问题是当传输过程中出现错误时协议出现故障而我通常会得到StreamCorruptedExceptions,因为至少有一方正在等待其他事情。

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

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

1 个答案:

答案 0 :(得分:2)

一些想法

  • 或许在每个阶段之后发送确认 - 控制起来会容易得多
  • 来自服务器的确认可以发送校验和,客户端可以验证事务的完整性并继续。 (例如md5)。
  • 实施"无国籍"服务器 - 即服务器,它可以根据一些"幻数"来决定在哪个阶段服务。您可以在每个事务的开头设置(标题)。 这样,客户端可以重试任何阶段,服务器将能够做出相应的响应。
  • 您可以展开标题以包含唯一文件的唯一ID,这样您就可以并行化整个通信并在多个阶段和多个客户端上传多个文件。

其他thougt

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