【问题标题】:Objectdeserialization over network网络对象序列化
【发布时间】:2009-09-28 15:02:11
【问题描述】:

当我尝试通过这样的网络从 ObjectInputStream 读取对象时出现异常:

Socket socket = new Socket("localhost", 4444);
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
while ((Object o = ois.readObject()) != null) {
}

这是我得到的例外:

java.io.EOFException 在 java.io.ObjectInputStream$BlockDataInputStream.peekByte(未知来源) 在 java.io.ObjectInputStream.readObject0(未知来源) 在 java.io.ObjectInputStream.readObject(未知来源)

连接本身似乎很好,因为我可以通过网络读取字符串,但对象不起作用。

由于它是 EOFExcepetion,我假设流当前不再发送数据。 (在发送第一个对象后就可以了)。 所以我在想也许我以错误的方式使用对象反序列化?

这可能是什么问题?谢谢!

【问题讨论】:

  • 服务器端是什么样子的?你如何结束连接?
  • 服务器没有结束连接。它序列化一个对象,然后通过 outputstream.writeObject() 将其发送给客户端
  • 好的,抱歉,我刚刚发现关闭连接的服务器确实有问题。

标签: java serialization networking sockets messaging


【解决方案1】:

为什么不打电话给available() 看看有没有要读的东西呢?可能值得发布您的服务器端代码。目前我们只看到了故事的一方面。

【讨论】:

  • 但这准确吗?如果只接收到一半的对象二进制数据怎么办?再次到达终点就会崩溃。
  • 我希望 readObject() 阻塞,直到所有需要的数据都存在(除非发生异常情况)。不要忘记,在幕后,TCP 会为您保护数据的完整性和完整性。
  • 好的,我尝试了 available(),它似乎总是返回 0,这可以解释 EOFException。但我该如何调试呢?我肯定会向客户端发送一个对象,所以它应该在那里。
  • 你发布服务器端了吗?那会有帮助的。在服务器端,您是否正在关闭和/或刷新连接?
  • 谢谢!是的,我在服务器端的 writeObject() 之后刷新。当使用 InputStreamReader 而不是 ObjectInputStream 检查套接字的输入流时,我也可以在客户端看到该消息。所以消息和对象肯定会到达客户端。
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多