Java 必须安装服务器&;客户端具有声明ObjectOutputStream的相反顺序&;目标输入流?

Java 必须安装服务器&;客户端具有声明ObjectOutputStream的相反顺序&;目标输入流?,java,sockets,serialization,objectinputstream,objectoutputstream,Java,Sockets,Serialization,Objectinputstream,Objectoutputstream,在我的实验中 如果服务器具有以下功能: ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 然后客户端必须按照相反的顺序执行此操作: ObjectOutputStream objectOutputS

在我的实验中

如果服务器具有以下功能:

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

有。我知道这是怎么发生的。构造函数的javadoc说明:

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

因此,如果客户机和服务器都在其
ObjectOutputStream
之前构造了它们的
ObjectInputStream
,那么它们都将阻止等待另一端发送序列化流头

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


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

我原以为在写入任何内容之前尝试从
InputStream
读取会导致问题(因为读取会阻塞),这意味着,如果客户端和服务器都试图在您希望使用写入的同一线程中读取相应的
InputStreams
,那么您将遇到问题…@MadProgrammer,这确实会导致问题。这就是他为什么要问的原因。但仅适用于对象流,因为构造分别写入和读取标题。@EJP-错过了“流”中的“对象”:P-需要更多时间来回答标题中的问题,不,只要他们不都尝试先构造
ObjectInputStrram
。如果他们都尝试先构造
ObjectOutputStream
,这是最安全的。因此,要求至少在其中一个端点中首先创建ObjectOutputStream,规则是在两端首先创建它。@EJP-yea。。。但是,如果客户机或服务器使用两个线程来构造+读/构造+写,那么您就不需要麻烦了。