Java ObjectInputStream (socket.getInputStream()) перехватывает нулевой объект

Я делаю пару клиент-сервер. Мой клиент очень хорошо подключается к серверу и создает ObjectInputStream(socket.getInputStream()) через сокет, от сервера к клиенту и наоборот. Затем по какой-то мистической причине мой ObjectInputStream сервера каким-то образом ловит нулевой объект. Клиент ничего не отправлял через сокет (я поставил /../ поверх метода отправки объекта, чтобы убедиться в этом, и даже System.out.printed все объекты, отправленные ранее) Сервер ловит это мистическое объект только один раз, и после этого все объекты, отправленные клиентом, работают так, как должны..

class ClientThread extends Thread {
        //The socket where to listen/talk
        Socket socket;
        ObjectInputStream sInput;
        ObjectOutputStream sOutput;
        InputStream fInput;
        OutputStream Output;
        //my unique id (easier for deconnection)
        int id;
        //Objects that we will be receiving
        Incomingdata datain;
        //the date we connect
        String date;
        Player player;
        boolean Connected = false;

        //Constructor
        ClientThread(Socket socket){
            id = uniqueId++;
            this.socket = socket;
            try{
                sOutput = new ObjectOutputStream(socket.getOutputStream());
                sInput = new ObjectInputStream(socket.getInputStream());
                Output = socket.getOutputStream();
            } catch (Exception e){
                System.out.println("Couldn't create Input/Output streams");
            }
            date = new Date().toString();
        }

        // what will run forever
        public void run() {
            // to loop until LOGOUT
            Connected = true;
            while(Connected) {
                try {
                    datain = (Incomingdata) sInput.readObject(); //<--- this catches the mystical null! Even if nothing is sent over the socket?
                }
                catch (IOException e) {
                    TextArea.AddLine("Exception reading Streams: " + e);
                    break;              
                }
                catch(ClassNotFoundException e2) {
                    break;
                }

person user3738243    schedule 28.10.2014    source источник
comment
Как я объяснял кому-то на днях, потоки ввода-вывода объектов и данных — это технологии ушедшей эпохи, когда все еще существовали такие проблемы, как прямой и обратный порядок байтов, и не было хороших стандартов связи. Теперь у нас есть XML и JSON — они оба гораздо лучшее решение, чем использование потоков объектов.   -  person ControlAltDel    schedule 28.10.2014
comment
Я думаю, что это не ответ на мой вопрос?   -  person user3738243    schedule 28.10.2014
comment
Похоже, проблема исчезла так же странно, как и появилась!   -  person user3738243    schedule 28.10.2014
comment
@ControlAltDel Вы не должны утверждать, что XML и JSON сделали двоичные протоколы устаревшими. У них нет, и они не могут.   -  person user207421    schedule 29.10.2014
comment
@ControlAltDel - действительно, (риторический) контраргумент заключается в том, что бинарные протоколы, такие как Protobuf, сделали XML и JSON устаревшими. Реальность такова, что двоичные и текстовые протоколы ОБА имеют место, и НИ ОДИН из них не устарел другой.   -  person Stephen C    schedule 29.10.2014
comment
Не существует такого понятия, как «нулевой объект». Определите «ловит нулевой объект». Вы имеете в виду (1) возвращает ноль или (2) выдает NullPointerException?   -  person user207421    schedule 24.01.2018


Ответы (1)


Вы можете получить ноль, только если отправляете ноль.

(Существует распространенное заблуждение, что readObject() возвращает null в конце потока. Это не так.)

person user207421    schedule 28.10.2014