Java 读取对象时发生EOFEException

Java 读取对象时发生EOFEException,java,exception,networking,serialization,Java,Exception,Networking,Serialization,在Java中,当我试图通过服务器套接字发送对象时,会收到一个EOFEException 这是发送部分的代码: public static void sendObject(Object Object, InetAddress IP, int Port){ try{ Socket receivingSocket = new Socket(IP, Port); OutputStream OS = receivingSocket.getOutputStream()

在Java中,当我试图通过服务器套接字发送对象时,会收到一个EOFEException

这是发送部分的代码:

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();
            }
        }
    }
}
大编辑!:

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

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

你知道为什么吗?

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

class MyClass implements Serializable {
} 

对象是否可序列化?对象应实现可序列化接口:

class MyClass implements Serializable {
} 

您只发送了一个对象,但循环时希望读取多个对象。那没有道理。发送多个对象或仅读取一个对象。如果发送和读取多个对象,则在读取比已发送多个对象的对象时,始终会收到EOFEException。

您只发送了一个对象,但循环时希望读取多个对象。那没有道理。发送多个对象或仅读取一个对象。如果您发送和读取多个对象,当您读取的对象比发送的对象多一个时,您将始终收到EOFEException。

两件事

  • While循环应该覆盖整个run方法(我相信看到代码后会这样)
  • 因为它的无限循环可以收集空输入,所以您也应该处理它

    公开募捐{

    }

  • 有两件事

  • While循环应该覆盖整个run方法(我相信看到代码后会这样)
  • 因为它的无限循环可以收集空输入,所以您也应该处理它

    公开募捐{

    }

  • 我解决了

    第一个问题是,我在开始下载线程的同时发送了一个请求(我想),所以我所做的是稍微晚一点发送请求,突然EOF facepalm异常消失了

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

    谢谢你的帮助

    我解决了

    第一个问题是,我在开始下载线程的同时发送了一个请求(我想),所以我所做的是稍微晚一点发送请求,突然EOF facepalm异常消失了

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



    谢谢你的帮助

    你看过这个问题吗?别忘了刷新输出流。
    Object对象
    rahhhh!!!刷新输出流没有帮助:(java.io.ObjectInputStream处出现异常。上游似乎有问题。您看过这个问题了吗?别忘了刷新输出流。
    Object Object
    rahhhh!!!刷新输出流没有帮助:(java.io.ObjectInputStream出现异常。在上游似乎有问题。我们来看看堆栈溢出!这实际上是一个注释,而不是答案。再重复一点,。目前我已经为您添加了注释,我正在标记此帖子以供删除。如果这是问题,他在发送时将收到NotSerializableException。这是一个EOFExcep。)收到时出现异常。-1欢迎使用Stack Overflow!这实际上是一个评论,不是一个答案。需要更多的代表性。目前,我已经为您添加了评论,我正在标记此帖子以删除。如果这是问题,他在发送时会收到NotSerializableException。这是接收时出现的EOFEException。-1我应该解释更多。在收到对象后,它会暂停下载程序,然后再传输对象,然后继续下载另一个对象。您发布的代码有我描述的缺陷。您的新代码还有其他缺陷。首先,您需要为每个接受的连接启动一个新线程。我应该解释更多。收到对象后,它会暂停下载在传输对象然后继续下载另一个对象之前加载。您发布的代码有我描述的缺陷。您的新代码有其他缺陷。您需要为每个接受的连接启动一个新线程。如果(IS!=null&&IS.available()>0)在好几次中只有一次是正确的,它抛出了一个例外,可用()的正确用法很少,而这不是其中之一。所有这一切只是忽略尚未写入对象的流。并且也会泄漏它们。如果客户端稍后发送某些内容,它将丢失。而且“is”永远不能为null,因此对它的测试毫无意义。-1if(is!=null&&is.available()>0)在好几次中只有一次是正确的,它抛出了一个例外,可用()的正确用法很少,而这不是其中之一。所有这一切都是忽略尚未写入对象的流。并且也会泄漏它们。如果客户端稍后发送某个内容,它将丢失。而且“is”永远不能为null,因此对其进行测试是毫无意义的。-1更改计时不会影响异常。您必须已修复其他内容,如中指出的问题我的答案。EOFEException不受更改时间的影响。您必须已修复其他问题,例如我的答案中指出的问题。
    class MyClass implements Serializable {
    } 
    
    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){  ..}
        }
    }