ObjectStream崩溃

时间:2010-06-30 16:01:14

标签: java sockets stream

今天我遇到了一个ObjectStream问题(输入和输出)。 我使用了直接来自套接字的Input和OutputStream。

初始化流时,我的运行并运行并运行。没有错误消息。 我没有收到任何错误消息。 似乎ObjectInputStream的构造函数运行无穷无尽......

以下是存在问题的代码。 socket.isConnected为真。

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

对象输入流读取由其构造的对象输出流发送的标头。如果你还没有发送标题,它将永远等待。

简单的解决方案是始终先创建对象输出流,然后在创建对象输入流之前将其刷新。

答案 1 :(得分:0)

我发现了这个

  

在ObjectInputStream之前创建ObjectOutputStream   如果您正在编写使用ObjectInputStream和ObjectOutputStream双向传输数据的代码,请首先构建ObjectOutputStream。

     

如果您首先构造ObjectInputStream,则两端将阻塞并最终在构造函数中失败。这是因为输入流构造函数等待从ObjectOutputStream open()到达的初始字节字符串。在单向情况下,一方正在写作而另一方正在阅读,一切都顺利进行。但是在双向情况下,如果双方首先尝试构造输入流,则两者都在等待另一方构造输出流,并且两者都不能继续。

     

如果您的异常处理允许在构造输入流失败后继续进行通信,那么此问题的症状是双方都会阻塞一段时间,一个获取异常并继续构造ObjectOutputStream。然后另一端能够构造它的ObjectInputStream,因为刚刚到达初始化序列。

     

幸运的是,修复很简单。将ObjectOutputStream的创建移到ObjectInputStream的创建之前。然后每个端都将在尝试打开其输入流之前传输初始化序列。初始化序列准备就绪并等待,因此输入流的构造正常进行,然后可以毫无延迟地开始对象传输。