我正在编写一个客户端/服务器应用程序,其中服务器通过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行代码。

最佳答案

这看起来很可疑:

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


outToClientoos都在写相同的基础流。这很可能引起怪异。

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

关于java - readObject()中的ObjectInputStream阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21540850/

10-12 18:42