服务器和客户端必须具有声明 ObjectOutputStream 和 ObjectInputStream 的相反顺序吗?

Qis*_*han 3 java sockets serialization objectoutputstream objectinputstream

在我的实验中,

如果服务器有这个:

ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
Run Code Online (Sandbox Code Playgroud)

然后客户端必须以相反的顺序执行此操作:

ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
Run Code Online (Sandbox Code Playgroud)

否则服务器和客户端会死锁。

这是什么原因?是否有正式的 API 规范?

Ste*_*n C 5

是的。我明白这会如何发生。ObjectInputStream构造函数的 javadoc 是这样说的:

“创建一个ObjectInputStream从指定的读取。从InputStream流中读取并验证序列化流标头。此构造函数将阻塞,直到相应的ObjectOutputStream已写入并刷新标头。”

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

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

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