代码之家  ›  专栏  ›  技术社区  ›  Moritz

对象流崩溃

  •  -2
  • Moritz  · 技术社区  · 14 年前

    今天,我遇到了一个关于对象流(输入和输出)的问题。 我使用了直接从套接字中出来的输入和输出流。

    当初始化流时,我的运行和运行。没有错误消息。 我没有收到错误信息。 似乎objectinputstream的构造函数运行无止境…

    这是存在问题的代码。 socket.isconnected为true。

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

    有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Peter Lawrey    14 年前

    对象输入流读取它所构造的对象输出流发送的头。如果你没有发送邮件头,它将永远等待。

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

        2
  •  0
  •   Moritz    14 年前

    我发现了这个

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

    如果您先构造objectinputstream,则两端都将阻塞,并最终在构造函数中失败。这是因为输入流构造函数等待从objectOutputstream open()到达初始的字节字符串。在单向的情况下,一边写作,另一边阅读,一切都很顺利。然而,在双向情况下,如果双方都试图先构造输入流,则双方都在等待另一方构造输出流,而这两者都无法继续。

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

    幸运的是,修复是直接的。将ObjectOutputStream的创建移动到ObjectOutputStream的创建之前。然后,在尝试打开其输入流之前,每个端都将发送初始化序列。初始化序列已准备就绪并等待,因此输入流的构造将正常进行,然后对象传输可以立即开始。