我正在编写一个客户端/服务器应用程序,其中服务器通过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);
outToClient
和oos
都在写相同的基础流。这很可能引起怪异。@EJP建议删除
DataOutputStream
是一个很好的建议,因为DataOutputStream
类不是您要追求的(因为您正在编写对象),并且几乎可以肯定您想要一个OutputStream
链。关于java - readObject()中的ObjectInputStream阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21540850/