readObject()中的ObjectInputStream阻塞

时间:2014-02-04 00:42:10

标签: java serialization objectinputstream objectoutputstream

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

现在,由于首先执行服务器,我首先初始化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行代码。

2 个答案:

答案 0 :(得分:1)

这看起来很可疑:

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

outToClientoos都写入相同的基础流。这可能会引起奇怪。

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

答案 1 :(得分:0)

您是否尝试过使用ois.readUnshared()而不是ois.readObject()。即使它可能不是整个问题,也可能是其他问题,将写入和读取结合起来是一种很好的做法。

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