【问题标题】:ObjectInputStream blocking in readObject()readObject() 中的 ObjectInputStream 阻塞
【发布时间】:2014-02-04 00:42:09
【问题描述】:

我正在编写一个客户端/服务器应用程序,其中服务器通过 ObjectOutputStream 向客户端发送可序列化对象(从现在开始我将其称为 oos),客户端使用 ObjectInputStream(从现在开始为“ois”)获取它们。

现在,由于先执行服务器,我先初始化oos。应该如此。这是我初始化它的方式:

OutputStream outStream=incoming.getOutputStream();
DataOutputStream outToClient=new DataOutputStream(outStream);
outToClient.flush();
ObjectOutputStream oos = new ObjectOutputStream(outStream);  
oos.flush();

然后我启动客户端并用这些行初始化ois:

inStream = clientSocket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(inStream); 

从现在开始,服务器端将通过这种方式在同一个流上发送多个对象:

oos.writeUnshared(wishes);

在一个while循环中。 问题是:当我单独在我的电脑上执行这个该死的代码时,一切都很好。完全没有问题。当我在两台不同的机器上尝试时,会出现死锁。客户端永远挂在这条线上:

tempWishes = (ArrayList<String>) ois.readObject();

欢迎询问更多详情。我没有分享整个客户端和服务器代码,因为它就像 500 行代码。

【问题讨论】:

  • 你确定你看到的是死锁,而不是阻塞,这指向一个完全不同的问题吗?如果这确实是死锁,那么锁是什么?
  • 听起来像是缓冲问题。确保在服务器端写入对象后 flush() 或 close() oos
  • 已经在使用flush()。谢谢!
  • (1) 这不是死锁。它是一个块。 (2) 它不在ObjectOutputStream 中,它在ObjectInputStream.readObject() 中。 (3) 你应该摆脱 DataOutputStream。你不需要它。 ObjectOutputStream 具有所有这些方法。如果您使用的是 DataInputStream,也请摆脱它。

标签: java serialization objectinputstream objectoutputstream


【解决方案1】:

这看起来很可疑:

DataOutputStream outToClient=new DataOutputStream(outStream);
ObjectOutputStream oos = new ObjectOutputStream(outStream);  

outToClientoos 都在写入同一个底层流。这可能会导致奇怪。

@EJP 建议您删除 DataOutputStream 是一个很好的建议,因为 DataOutputStream 类不是您所追求的(因为您正在编写对象),而且您几乎肯定想要一个 @ 链987654326@s.

【讨论】:

  • 由于我只需要在某些情况下发送对象,我想到了使用DataOutputStream向客户端发送消息说:“你接下来会得到一个对象”或“你会得到什么接下来是一个字符串”。在第二种情况下,我只是继续使用 DataOutputStream,而在第一种情况下,客户端开始使用 readObject() 方法等待一个对象。现在在 readUnshared() 中进行了更改。我想这种想法是错误的。
  • ObjectOutputStream 实现了DataOutput 接口,因此您可以为两个角色使用一个ObjectOutputStream
【解决方案2】:

您是否尝试过使用 ois.readUnshared() 而不是 ois.readObject()。即使这可能不是全部问题,也可能是其他问题,最好将写入和读取结合起来。

如果这解决了问题,请告诉我。

【讨论】:

  • 谢谢,这在一定程度上有所帮助,因为问题也扩展到了我的 Socket 定义。现在,更有趣的是,我的应用程序在调试模式下可以正常工作,但在普通运行期间会出现与我的问题相同的问题。
  • 这不会修复它,如果你想故意破坏对象图,这只是一个好习惯。这就是为什么它不是默认值。
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2012-02-27
相关资源
最近更新 更多