【问题标题】:Unable to Create ObjectInputStream Object无法创建 ObjectInputStream 对象
【发布时间】:2014-05-02 14:53:31
【问题描述】:

这是我的代码。当我运行它时,我最多打印“三个半”。 (打印是为了调试而添加的,因为我不知道任何其他方式。)之后,执行挂起。没有例外,没有提示,什么都没有。那么我的对象创建有什么问题?我在网上看到的每个教程都有相同的代码,但我的不行。

public class Connection {
    Socket socket;
    ObjectInputStream iStream;
    ObjectOutput outputStream;

    public Connection(Socket s) {
        try {
            System.out.println("One");
            socket = s;
            System.out.println("Two");
            outputStream = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
            System.out.println("Three");
            InputStream is = socket.getInputStream();
            System.out.println("Three and a Half");
            iStream = new ObjectInputStream(is);
            System.out.println("Four");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

提前致谢。

【问题讨论】:

    标签: java sockets serialization objectinputstream


    【解决方案1】:

    它在 Javadoc 中:

    从流中读取序列化流标头并进行验证。此构造函数将阻塞,直到相应的 ObjectOutputStream 写入并刷新了标头。

    所以新的 ObjectInputStream 挂起,因为它正在等待输入。您需要创建一个 ObjectOutputStream 并通过套接字发送数据。

    【讨论】:

    • 是的,它就是这样设计的,因此您可以在循环中等待输入并持续处理传入的数据。
    • @ObedMarsh 不,它的设计目的是提供协议版本信息等。流标头与循环无关。
    • 我没有说它们与循环有任何关系我说它们非常适合放在循环中以继续接受传入数据。所以是的,99% 的时间你会在循环中找到它。
    • 不,你说“它是这样设计的,所以你可以在循环中等待输入”。上面是黑白的。也没有一个关于“理想”的词。答案是关于设计和流标头,而不是循环。
    • 我真诚地道歉,因为使用了你可以挑剔的词,但事实仍然是所有程序中有 99% 将在循环中使用它(坦率地说,如果不是,它可能不是很制作精良)。
    猜你喜欢
    • 2019-06-03
    • 2015-03-19
    • 1970-01-01
    • 2013-10-22
    • 2017-10-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多