读取对象时出现EOFException

时间:2013-04-16 11:31:50

标签: java exception networking serialization

当我尝试通过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;

BIG EDIT!:

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

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

任何想法为什么?

4 个答案:

答案 0 :(得分:1)

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

class MyClass implements Serializable {
} 

答案 1 :(得分:0)

您只发送一个对象,但您正在循环期望读取多个对象。这没有意义。要么发送更多的对象,要么只读取一个。如果您发送和读取多个对象,当您阅读的内容超过发送时,您将始终获得EOFException。

答案 2 :(得分:-1)

两件事,

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

    public void run(){

    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){  ..}
        }
    }
    

    }

答案 3 :(得分:-1)

我解决了!

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

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

感谢您的帮助!