3

在我的实验中,

如果服务器有这个:

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 规范?

4

1 回答 1

5

是的。我知道这怎么可能发生。构造函数的 javadoc 是这样ObjectInputStream说的:

“创建一个ObjectInputStream从指定的InputStream.ObjectOutputStream

因此,如果客户端和服务器都在它们ObjectInputStream之前构造它们ObjectOutputStream,那么它们都会阻塞等待另一端发送序列化流标头。

请注意,这发生在对象流级别,而不是套接字或字节流级别。如果您在套接字上执行简单的字节或字符或“数据”I/O,则无需担心构建流的顺序。

也不是,如果您在客户端和服务器端(都)有单独的线程来进行读取和写入,这不是问题。在所有条件相同的情况下,这可能是一个更好的架构,因为它允许通过套接字进行的客户端/服务器通信是“全双工”的。

于 2013-02-01T03:16:25.680 回答