必须服务器和客户端都声称的ObjectOutputStream和ObjectInputStream的

2019-07-19 02:47发布

在我的实验,

如果服务器有这样的:

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?

Answer 1:

是。 我怎么看这件事会发生。 对于javadoc的ObjectInputStream构造这样说:

“创建一个ObjectInputStream从指定读取InputStream 。甲序列化流报头从流读取和验证。此构造方法将阻塞,直到相应ObjectOutputStream写和冲洗头”。

因此,如果客户端和服务器构建其ObjectInputStream他们之前ObjectOutputStream ,那么这两个将阻止等待另一端发送的序列化流头。

请注意,这是发生在对象流水平,而不是插座或字节流的水平。 如果是在一个插座做简单的字节或字符或“数据” I / O,你不必担心在流构造的顺序。

也没有,这不是,如果你对(双方)在客户端和服务器端单独的线程做阅读和写作中的问题。 所有的事情都是平等的,这可能是一个更好的架构,因为它允许在插座上的客户机/服务器通信是“全双工”。



文章来源: Must server & client have reverse sequence of claiming ObjectOutputStream & ObjectInputStream?