Java ObjectInputStream java.io.EOFException

Я пытаюсь передать данные от MySQL клиенту с помощью сокета. Для List я предпочитаю использовать массив, но если я отправлю массив, используя это:

InputStream input = client.getInputStream();
        OutputStream output = client.getOutputStream();
        ObjectOutputStream obOutput = new ObjectOutputStream(output);
        Statement statement = dataConnection.createStatement();
        ResultSet modList = statement.executeQuery("SELECT modID, downloads FROM modRegister");
        String[][] mods = new String[3][3];
        int column = 0;
        while (modList.next()) {
            mods[column][1] = modList.getString("modID");
            mods[column][2] = modList.getString("downloads");
            ++column;
        }

        System.out.println(mods[1][1]);

        PrintWriter printClient = new PrintWriter(output);
        printClient.println(column);
        printClient.close();
        obOutput.writeObject(mods);
        obOutput.flush();

и получить его от клиента, используя это:

Socket server = new Socket("localhost", 25566);
    InputStream input = server.getInputStream();
    OutputStream output = server.getOutputStream();
    ObjectInputStream obInput = new ObjectInputStream(input);
    BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    String s;
    int columns = 0;
    while((s = reader.readLine()) != null) {
        columns = Integer.parseInt(s);
        System.out.println(s);
    }
    String [][] mods;
    TimeUnit.SECONDS.sleep(10);
    mods = (String[][])obInput.readObject();

Я получаю EOFException, даже с задержкой по времени. Массив действителен. Я протестировал распечатку всех данных в нем. Вот исключение:

Caused by: java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2601)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at layout.MainStoreController.initialize(MainStoreController.java:36)
... 32 more

person dav20011    schedule 27.07.2015    source источник
comment
не могли бы вы опубликовать код для layout.MainStoreController.initialize? Где в стеке выполняется код, который вы опубликовали?   -  person Blake Yarbrough    schedule 27.07.2015
comment
Ну, на самом деле это второй код, больше ничего в этом методе.   -  person dav20011    schedule 27.07.2015
comment
Не могли бы вы опубликовать полное определение метода с; скобки, имена, аргументы, имена классов и пути к классам?   -  person Blake Yarbrough    schedule 27.07.2015
comment
Это просто public void initialize(){theStuff выше}, включены исключения для создания исключений, базовый метод инициализации JavaFX   -  person dav20011    schedule 27.07.2015


Ответы (1)


Я подозреваю, что закрытие PrintWriter закрывает OutputStream, в который он пишет.

PrintWriter printClient = new PrintWriter(output);
printClient.println(column);
printClient.close();

Когда поток закрывается, сокет закрывается, и другой конец будет наблюдать End-Of-File при чтении.

person dsh    schedule 27.07.2015
comment
Конечно? Я не получаю никаких ошибок на сервере, поэтому я думаю, что это отправка - person dav20011; 27.07.2015
comment
Вы можете использовать wireshark для захвата трафика и просмотра того, что на самом деле отправляется. Я уверен, что вы увидите там пакет FIN, закрывающий соединение. - person dsh; 27.07.2015
comment
Нет, заменил закрытие на сброс, чтобы предотвратить это, все та же ошибка, и плохо, я использую Windows, которая на самом деле не поддерживает локальный хост с Wireshark, не хочу компилировать все, чтобы попробовать это на моем Ubuntu сервер. - person dav20011; 28.07.2015