EOFException в объекте чтения objectinputstream

Я хочу сделать серверное клиентское приложение. Я все настроил и получаю эту ошибку. я хочу, чтобы приложение подождало, пока я не получу больше данных.

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

}

}

person TheGathron    schedule 07.08.2015    source источник


Ответы (2)


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

Если у вашего сокета/входного потока нет бесконечного количества объектов для отправки, рано или поздно у него закончатся объекты. Вот что произошло. Это прямо сказано в javadoc для EOFException.

Сигнализирует о неожиданном достижении конца файла или конца потока во время ввода.

Это исключение в основном используется потоками ввода данных, чтобы сигнализировать об окончании потока. Обратите внимание, что многие другие операции ввода возвращают специальное значение в конце потока, а не вызывают исключение.

person dcsohl    schedule 07.08.2015
comment
Поскольку от этой операции следует ожидать EOFException, я бы окружил ее try/catch и обработал исключение. Я не знаю, захотите ли вы вырваться из цикла и продолжить работу, как если бы сокет закрылся, или вы захотите сидеть и ждать, пока не появятся новые данные. Это зависит от вас. - person dcsohl; 07.08.2015
comment
я хочу, чтобы он подождал, пока не появится больше данных - person TheGathron; 08.08.2015
comment
@TheGathron Это именно то, что t will уже делает: он блокирует. Если он выдает EOFException, партнер закрыл соединение, поэтому на нем больше никогда не будет данных. - person user207421; 07.02.2017
comment
NB while (socket.isConnected() не является тестом на конец потока или живучесть соединения. Оно не становится ложным волшебным образом. Всегда. - person user207421; 30.03.2017

Все ли ваши объекты, используемые в WorkerMessageToMaster, сериализуемы, как и сам WorkerMessageToMaster? Каждый объект, который вы хотите отправить с помощью ObjectStreams, должен быть реализован сериализуемым, и все его дочерние элементы должны быть реализованы. Строка, а также примитивные типы данных (int, float и т. д.) сериализуемы без необходимости что-либо делать. Но если вы используете свои собственные классы, они должны быть сериализуемыми.

person Afeef Abadel    schedule 03.11.2018
comment
Исключением является EOFException, а не NotSerializableException. А реализованные интерфейсы наследуются подклассами автоматически, без необходимости их явного переопределения. - person user207421; 27.03.2020