【问题标题】:Why is my ObjectInputStream throwing an EOFException?为什么我的 ObjectInputStream 会抛出 EOFException?
【发布时间】:2014-03-28 03:36:53
【问题描述】:

我正在编写一个聊天室代码,每条消息都在客户端和服务器之间不断地来回发送。我已经将所有消息都变成了序列化对象,并使用它们来回传递信息。不幸的是,这导致在第一次读取对象时抛出 EOFException。错误代码如下:

Exception in thread "main" java.io.EOFException
    at java.io.DataInputStream.readInt(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readInt(Unknown Source)
    at java.io.ObjectInputStream.readInt(Unknown Source)
    at Serverside.ChatObject.readObject(ChatObject.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at Clientside.Client.run(Client.java:161)
    at Clientside.Client.main(Client.java:233)

我不确定这是否是由从未关闭的 ObjectOutputStream 引起的,但如果是这样,我该如何解决这个问题?每次要写入对象时我是否必须重新打开流,并且输入流是否可以留在循环中等待数据?

这是我的自定义对象读/写代码:

    private void writeObject(java.io.ObjectOutputStream stream) throws IOException{
    stream.writeObject(type);
    stream.writeObject(chatroom);
    stream.writeObject(target);
    stream.writeObject(sender);
    stream.writeObject(message);
    stream.writeObject(users);
    stream.close();
}

private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException{
    type = stream.readInt();
    chatroom = stream.readInt();
    target = (String) stream.readObject();
    sender = (String) stream.readObject();
    message = (String) stream.readObject();
    users = (ArrayList<String>) stream.readObject();
    stream.close();
}

这是在服务器端启动线程后的第一段代码。问题不可能在此之外发生,因为其他方法还没有被调用的能力。

    public void run(){
        try{
            out = new ObjectOutputStream(socket.getOutputStream());
            in = new ObjectInputStream(socket.getInputStream());

            while(true){
                out.writeObject(new ChatObject(0));
                out.flush();
                info = (ChatObject) in.readObject();
                name = info.getSender();
                if(name == null){
                    return;
                }
                synchronized (names){
                    if(!names.contains(name)){
                        names.add(name);
                        break;
                    }
                }
            }

如果有人觉得有必要,我可以根据需要包含更多代码(来自对象或来自客户端/编写端)。

【问题讨论】:

    标签: java objectinputstream objectoutputstream eofexception custom-object


    【解决方案1】:

    快速查看DataInputStream#readInt (link) 的 javadoc 条目告诉我,当您使用流时,此方法会引发 EOFException(代表 文件结束异常) '正在尝试在不到 4 个字节内从 ends 读取和 int(Java int4 个字节组成)。

    您可能需要使用一些接口来阻塞,直到流包含足够的数据:)

    【讨论】:

    • 是的,我之前一直在寻找这个问题的答案,我看到了很多关于这个问题的帖子。我刚刚尝试在“in”的构造函数中使用 BufferedInputStream,但发现问题没有任何变化。然后我也尝试了 bufferedOutputStream,这使程序冻结。
    • 正在使用“某些接口会阻塞,直到流包含足够的数据”。这里的问题是流已经结束,但没有包含足够的数据。
    【解决方案2】:

    如果您使用type = stream.readInt(); 读取类型,则应使用stream.writeInt(type); 编写

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多