2013-04-16 4 views
2

Я получаю исключение EOFException, когда пытаюсь отправить объект через серверный сокет в Java.EOFException при чтении объекта

Это код на передающем части:

public static void sendObject(Object Object, InetAddress IP, int Port){ 
    try{ 
     Socket receivingSocket = new Socket(IP, Port); 
     OutputStream OS = receivingSocket.getOutputStream(); 
     ObjectOutputStream OOS = new ObjectOutputStream(OS); 

     OOS.writeObject(Object); 
     OOS.close(); 
     OS.close(); 
     receivingSocket.close(); 
    } 
    catch(Exception e){ 
     System.err.println("Failed to send object to: " + IP + " on port: " + Port); 
     System.err.println(e); 
    } 
} 

Я попытался заливкой объекта к конкретному объекту и это не сработало. Проблема на самом деле показывает на приемной стороне, которая выглядит следующим образом:

Так что, когда я начать загрузку консоли немедленно выплевывает:

java.io.EOFException 
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) 
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) 
at java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
at java.io.ObjectInputStream.<init>(Unknown Source) 
at input_output.network.Downloader.run(Downloader.java:68) 

Edit: Объект действительно реализовать Serializeable

public class Character implements Serializable{ 
private static final long serialVersionUID = -6390272842934614484L; 

BIG EDIT !:

Я не знаю, почему и как, но я думаю, что загрузка работает, но теперь он не может передать полученный объект моему объекту!

Character Char = (Character)OIS.readObject(); 
java.lang.ClassCastException: server.database.account.Character cannot be cast to database.Character 

Любые идеи, почему?

+0

Вы посмотрели на этот вопрос? http://stackoverflow.com/questions/2666040/java-io-eofexception-while-writing-and-reading-froma-servlet – greenkode

+0

Не забудьте очистить выходной поток. – Erik

+2

'Объект Object' rahhhhhh !!! – UmNyobe

ответ

-1

Я решил его!

Первая проблема заключалась в том, что я отправил запрос в то же самое время, когда начал запускать поток (я думаю), так что я сделал это, я отправил запрос немного позже, и внезапное исключение facepalm EOF исчезло. .

Теперь у меня было исключение для преобразования, и проблема заключалась в том, что я должен был иметь символ класса (объекта) в той же самой иерархии пакетов, что и причина отправителя java, это глупо.

Спасибо за помощь!

+0

На изменение EOFException не влияет изменение времени. Вы, должно быть, исправили что-то еще, например, вопрос, указанный в моем ответе. – EJP

1

Является ли ваш объект сериализуемым? Объект должен реализовывать сериализуемый интерфейс:

class MyClass implements Serializable { 
} 
+1

Добро пожаловать в Stack Overflow! Это действительно комментарий, а не ответ. С немного большим количеством rep, [вы будете (http://stackoverflow.com/privileges/comment). На данный момент я добавил комментарий для вас, и я помечен этим сообщением для удаления. –

+0

Если это была проблема, он бы получить исключение NotSerializableException при отправке.Это исключение EOFException при получении. -1 – EJP

0

Вы отправляете только один объект, но вы зацикливаете, ожидая чтения нескольких объектов. Это не имеет смысла. Либо отправьте больше объектов, либо прочитайте их только. Если вы отправляете и читаете несколько объектов, вы всегда будете получать исключение EOFException, когда будете читать еще один, чем отправлено.

+0

Я должен был объяснить больше. После получения объекта он приостанавливает загрузчик перед передачей объекта, а затем возобновляет загрузку другого объекта. –

+0

Код, который вы опубликовали, имеет недостаток Я описал, что ваш новый код имеет другие. Для начала вам нужно начать новый поток для принятого соединения. – EJP

-1

Две вещи,

  1. Хотя петля должна охватывать весь метод запуска (я так считаю, видя код)
  2. Так как его бесконечный цикл, который может собирать пустые входы, вы должны справиться с этим, а также.

    общественности недействительным запуска() {

    while(!destroy){ 
    
        while(active){ 
         try{ 
          S = SS.accept(); 
          IS = S.getInputStream(); 
          if(IS!=null && IS.available()>0){ 
           OIS = new ObjectInputStream(IS); 
           Character Char = (Character)OIS.readObject(); 
           loading_state.setChar(Char); 
           pause(); 
          } 
         } 
         catch(Exception e){ ..} 
        } 
    } 
    

    }

+0

if (IS! = Null && IS.available()> 0) Было правдиво только раз в несколько раз, и оно исключило исключение –

+0

Существует очень мало правильных вариантов использования доступных(), и это не один из них , Все это означает, что игнорируются потоки, которые еще не написали объект *. * И утечка их тоже. Если клиент отправит что-то позже, он будет потерян. Также «IS» никогда не может быть нулевым, поэтому тестирование для него бессмысленно. -1 – EJP

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