我正在编写一个客户端/服务器应用程序,其中服务器通过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行代码。
答案 0 :(得分:1)
这看起来很可疑:
DataOutputStream outToClient=new DataOutputStream(outStream);
ObjectOutputStream oos = new ObjectOutputStream(outStream);
outToClient
和oos
都写入相同的基础流。这可能会引起奇怪。
@ EJP建议您删除DataOutputStream
是一个很好的建议,因为DataOutputStream
类不是你所追求的(因为你正在写对象),你几乎肯定想要一个单链OutputStream
s。
答案 1 :(得分:0)
您是否尝试过使用ois.readUnshared()而不是ois.readObject()。即使它可能不是整个问题,也可能是其他问题,将写入和读取结合起来是一种很好的做法。
如果能解决这个问题,请告诉我。