【发布时间】:2012-02-21 01:50:35
【问题描述】:
我目前正在研究简单的客户端/服务器文件同步。为此,客户端和服务器遵循一个简单的协议,该协议确定消息发送的顺序。
缩短协议(使用 Object/ByteArrayStreams):
客户端循环:
- 发送文件名
- 发送文件信息
- 发送数据
- 等待服务器确认
服务器循环:
- 读取文件名
- 读取文件信息
- 接收数据
- 向客户发送确认
重复。
问题是当传输过程中发生错误时协议出现故障,我通常会收到StreamCorruptedExceptions,因为至少一方在期待别的东西。
这是问题的示例情况: 无论出于何种原因,服务器在文件接收 (3) 期间出现故障。现在服务器等待一个文件名。由于错误,客户端到达发送数据的第 3 部分。然后抛出异常,因为服务器需要一个消息对象并且客户端发送字节数据。
解决这个问题的最佳方法是什么?
【问题讨论】:
-
您使用的是基于 TCP 的协议吗?您可以通过进程内对象直接交换消息来重现此错误吗?你写过自定义的 Externalizable 实现吗?
-
也许我在使用“协议”这个词时表达了自己的错误。它只是发送文件名之类的消息,使用Java(对象)流的数据,然后是确认消息。我在测试条件下没有遇到这个错误,但在使用过程中可以重现。
-
从异常看来,您正在使用 ObjectInputStream 和 ObjectOutputStream,而不是像 UDP 这样的“尽力而为”协议。是这样吗?
-
是的,我正在使用这些 Streams,但它们是通过 TCP 使用的。
-
文档说您的对象流已损坏。您应该发布一个小的、可编译的、可运行的代码 sn-p 供某人测试。
标签: java error-handling synchronization client-server