当前位置: 代码迷 >> java >> objectinputstream readobject 中的EOFException
  详细解决方案

objectinputstream readobject 中的EOFException

热度:71   发布时间:2023-07-26 14:19:05.0

我想做一个服务器客户端应用程序。 我设置了所有内容,但出现此错误。 我希望应用程序等到我获得更多数据。

java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)

在线上:

listener.Received(inputstream.readObject(), id.ID);

服务器代码:

isrunning = true;
    Thread input = new Thread(new Runnable(){
        @Override
        public void run() {
            try{
                ServerSocket Server = new ServerSocket(LocalPort);
                while(isrunning){
                    Socket socket = Server.accept();
                    ObjectOutputStream outputstream = new ObjectOutputStream(socket.getOutputStream());
                    ObjectInputStream inputstream = new ObjectInputStream(socket.getInputStream());
                    Object obj = inputstream.readObject();
                    if(obj instanceof ID){
                        ID id = (ID) obj;
                        if(connctedChecker(id.ID)){
                            ID myid = new ID(ID, LocalIP, LocalPort);
                            outputstream.writeObject(myid);
                            connect(id.IP, id.Port);
                            listener.Connected(id.ID);
                            do{
                                listener.Received(inputstream.readObject(), id.ID);
                            }while(socket.isConnected());
                            listener.Disconnected(id.ID);
                            closeConnection(id.ID);
                        }
                    }
                    inputstream.close();
                    outputstream.close();
                    socket.close();
                }
                Server.close();
            }catch(Exception e){
                e.printStackTrace();
            }

        }
    });
    input.start();

客户端代码:

output = new Thread(new Runnable(){
        @Override
        public void run(){
            try {
                socket = new Socket(RemoteIP, RemotePort);
                inputstream = new ObjectInputStream(socket.getInputStream());
                outputstream = new ObjectOutputStream(socket.getOutputStream());
                ID id = new ID(ID, LocalIP, LocalPort);
                outputstream.writeObject(id);
                outputstream.flush();
                Object obj = inputstream.readObject();
                if(obj instanceof ID){
                    ID inid = (ID) obj;
                    RemoteID = inid.ID;
                }
                while(socket.isConnected()){
                    Object object = queue.take();
                    outputstream.writeObject(object);
                    outputstream.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

听众:

public class Listener {

public void Connected(UUID ID){

}

public void Received(Object object, UUID ID){

}

public void Disconnected(UUID ID){

}

}
do{
    listener.Received(inputstream.readObject(), id.ID);
} while(socket.isConnected());

除非您的套接字/输入流有无限数量的对象要发送,否则迟早会用完对象。 事情就是这样。 它在的 javadoc 中说得很对。

表示在输入期间意外到达文件结尾或流结尾。

此异常主要由数据输入流用于表示流结束。 请注意,许多其他输入操作在流结束时返回一个特殊值,而不是抛出异常。

您在 WorkerMessageToMaster 中使用的所有对象以及 WorkerMessageToMaster 本身都是可序列化的吗? 你想用 ObjectStreams 发送的每个对象都必须实现可序列化,并且它的所有子对象都必须实现它。 字符串以及原始数据类型(int、float 等)无需执行任何操作即可序列化。 但是,如果您使用自己的类,则它们必须实现可序列化。

  相关解决方案