java – 服务器和客户端必须具有声明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说:

“Creates an ObjectInputStream that reads from the specified InputStream. A serialization stream header is read from the stream and verified. This constructor will block until the corresponding ObjectOutputStream has written and flushed the header.”

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

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

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

上一篇:利用OpenCV提取图像中的矩形区域(PPT屏幕等)


下一篇:python基础教程_学习笔记8:序列_练习与总结_1