服务器和客户端必须具有声明ObjectOutputStream和ObjectInputStream的反向序列吗?
在我的实验中,
如果服务器有这个:
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规范?
是。 我知道这可能会发生。 ObjectInputStream
构造函数的javadoc说:
“创建一个从指定的
InputStream
读取的ObjectInputStream
。从流中读取序列化流头并进行validation。此构造函数将阻塞,直到相应的ObjectOutputStream
已写入并刷新头部。”
因此,如果客户端和服务器都在它们的ObjectOutputStream
之前构造它们的ObjectInputStream
,那么它们都将阻塞等待另一端发送序列化流头部。
请注意,这发生在对象流级别,而不是套接字或字节流级别。 如果您通过套接字执行简单的字节或字符或“数据”I / O,则无需担心流的构造顺序。
也不是,如果你在客户端和服务器端都有单独的线程来进行读写,这不是问题。 在所有条件相同的情况下,这可能是一个更好的架构,因为它允许通过套接字的客户端/服务器通信是“全双工”。