【问题标题】:EOFException while reading an object [duplicate]读取对象时出现 EOFException [重复]
【发布时间】:2013-04-16 11:31:49
【问题描述】:

当我尝试通过 Java 中的服务器套接字发送对象时收到 EOFException。

这是发送部分的代码:

public static void sendObject(Object Object, InetAddress IP, int Port){
    try{
        Socket receivingSocket = new Socket(IP, Port);
        OutputStream OS = receivingSocket.getOutputStream();
        ObjectOutputStream OOS = new ObjectOutputStream(OS);

        OOS.writeObject(Object);
        OOS.close();
        OS.close();
        receivingSocket.close();
    }
    catch(Exception e){
        System.err.println("Failed to send object to: " + IP + " on port: " + Port);
        System.err.println(e);
    }
}

我尝试将对象转换为特定对象,但没有成功。 问题实际上出现在接收端,如下所示:

public Downloader(int PortStart, int PortStop, Loading_State loading_state){
    this.loading_state = loading_state;

    for(int i = PortStart;i<PortStop;i++){
        try {
            SS = new ServerSocket(i);
            break;
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public void run(){
    try {
        S = SS.accept();
        IS = S.getInputStream();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    while(!destroy){
        while(active){
            try {
                OIS = new ObjectInputStream(IS);
                Character Char = (Character)OIS.readObject();
                loading_state.setChar(Char);
                pause();
            }
            catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

所以当我开始下载时,控制台立即吐出:

java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at input_output.network.Downloader.run(Downloader.java:68)

编辑:该对象确实实现了Serializeable

public class Character implements Serializable{
private static final long serialVersionUID = -6390272842934614484L;

大编辑!:

我不知道为什么或如何,但我认为下载工作但现在它不能将接收到的对象转换为我的对象!

Character Char = (Character)OIS.readObject();
java.lang.ClassCastException: server.database.account.Character cannot be cast to database.Character

有什么想法吗?

【问题讨论】:

  • 你看过这个问题吗? stackoverflow.com/questions/2666040/…
  • 别忘了刷新输出流。
  • Object Object rahhhhhh!!!
  • 刷新输出流没有帮助:(
  • java.io.ObjectInputStream. 的异常在上游似乎有问题

标签: java exception networking serialization


【解决方案1】:

你的对象是可序列化的吗?该对象应实现可序列化接口:

class MyClass implements Serializable {
} 

【讨论】:

  • 欢迎来到 Stack Overflow!这实际上是评论,而不是答案。多一点代表,you will be able to post comments。目前我已经为你添加了评论,我标记了这篇文章以供删除。
  • 如果这是问题,他会在发送时收到 NotSerializableException。这是接收时的 EOFException。 -1
【解决方案2】:

您只发送一个对象,但您正在循环读取多个对象。那没有意义。要么发送更多对象,要么只读取一个。如果您发送和读取多个对象,当您读取的对象多于发送的对象时,总是会收到 EOFException。

【讨论】:

  • 我应该解释更多。接收到对象后,它会在传输对象之前暂停下载器,然后继续下载另一个对象。
  • 您发布的代码有我描述的缺陷。您的新代码还有其他代码。您需要为每个接受的连接启动一个新线程。
【解决方案3】:

两件事,

  1. 虽然循环应该覆盖整个运行方法(我相信看到代码)
  2. 由于它的无限循环可能会收集空输入,因此您也应该处理它。

    公共无效运行(){

    while(!destroy){
    
        while(active){
            try{
                S = SS.accept();
                IS = S.getInputStream();
                if(IS!=null && IS.available()>0){
                    OIS = new ObjectInputStream(IS);
                    Character Char = (Character)OIS.readObject();
                    loading_state.setChar(Char);
                    pause();
                }
            }
            catch(Exception e){  ..}
        }
    }
    

    }

【讨论】:

  • if(IS!=null && IS.available()>0) 多次为真,抛出异常
  • available() 的正确用法很少,这不是其中之一。所有这一切都是忽略尚未写入对象的流 并泄漏它们。如果客户端稍后发送某些内容,它将丢失。此外,“IS”永远不能为空,因此对其进行测试毫无意义。 -1
【解决方案4】:

我解决了!

第一个问题是我在启动线程下载的同时发送了一个请求(我认为),所以我所做的只是稍后发送请求,突然 EOF facepalm 异常消失了......

现在我留下了转换异常,问题是我必须在与发送方完全相同的包层次结构中拥有类(对象)字符,因为 java 是愚蠢的。

感谢您的帮助!

【讨论】:

  • EOFException 不受更改时间的影响。您一定已经修复了其他问题,例如我的回答中提到的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2011-09-03
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多