2015-07-27 6 views
0

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

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 
+0

не могли бы вы разместить код для 'layout.MainStoreController.initialize'? Где в стеке находится код, который вы выполнили? –

+0

Ну, это фактически второй код, не более того, этот метод. – dav20011

+0

Не могли бы вы опубликовать определение всего метода; скобки, имена, аргументы, имена классов и пути класса? –

ответ

1

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

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

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

+0

Уверен? Я не получаю никаких ошибок на сервере, поэтому я думаю, что его отправка – dav20011

+0

Вы можете использовать wirehark для захвата трафика и просмотра того, что действительно отправлено. Я уверен, что вы увидите там пакет FIN, который закрывает соединение. – dsh

+0

Nahh, заменил закрытие флешем, чтобы предотвратить это, по-прежнему та же ошибка, и плохо, я использую Windows, которая на самом деле не поддерживает localhost с Wireshark, не хочет компилировать все, чтобы попробовать это на моем Сервер Ubuntu. – dav20011

Смежные вопросы