【发布时间】: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