2

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

任何想法为什么?

4

4 回答 4

1

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

class MyClass implements Serializable {
} 
于 2013-04-16T11:35:15.853 回答
0

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

于 2013-04-16T11:55:15.997 回答
-1

我解决了!

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

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

谢谢您的帮助!

于 2013-04-16T12:49:14.093 回答
-1

两件事情,

  1. While 循环应该涵盖整个运行方法(我相信看到代码)
  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){  ..}
        }
    }
    

    }

于 2013-04-16T12:06:48.817 回答