在我的实验,
如果服务器有这样的:
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
然后客户端必须做到这一点,以相反的顺序:
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
否则,服务器和客户端就会死锁。
什么是这个原因? 而且是有它的正式API SPEC?
是。 我怎么看这件事会发生。 对于javadoc的ObjectInputStream
构造这样说:
“创建一个ObjectInputStream
从指定读取InputStream
。甲序列化流报头从流读取和验证。此构造方法将阻塞,直到相应ObjectOutputStream
写和冲洗头”。
因此,如果客户端和服务器构建其ObjectInputStream
他们之前ObjectOutputStream
,那么这两个将阻止等待另一端发送的序列化流头。
请注意,这是发生在对象流水平,而不是插座或字节流的水平。 如果是在一个插座做简单的字节或字符或“数据” I / O,你不必担心在流构造的顺序。
也没有,这不是,如果你对(双方)在客户端和服务器端单独的线程做阅读和写作中的问题。 所有的事情都是平等的,这可能是一个更好的架构,因为它允许在插座上的客户机/服务器通信是“全双工”。
文章来源: Must server & client have reverse sequence of claiming ObjectOutputStream & ObjectInputStream?