2016-06-29 3 views
0

Прежде всего, я знаю, и я знаю, что это дублированный вопрос, но в других ответах я просто не могу это понять!
Итак, я делаю подключение Client-Server с помощью сокетов java. У меня есть класс с именем Listener, который, каждый раз, когда я получаю новый клиент, я назначаю его клиенту. Затем я неоднократно слушаю клиента, и если я получаю ответ от клиента, я отправляю его методу в интерфейсе «класс» (эта последняя вещь не совсем об этом вопросе, но я не хочу, чтобы кто-либо спрашивая об этом)
Мой код:Java - Ошибка StreamCorruptedException: недопустимый код типа: AC

  while(!s.isClosed()){ 
      ob = new ObjectInputStream(s.getInputStream()); 
      try { 
       handler.objectReceived(ob.readObject(), instance); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



     } 

Где «s» является сокет, и «О.Б.» является ObjectOutputStream, и «обработчик» это интерфейс упоминалось выше. Но через некоторое время, используя его, я получаю ошибку java.io.StreamCorruptedException: недопустимый код типа: AC в строке handler.objectReceived(ob.readObject(), instance); ...

Любая помощь ??

ПРИМЕЧАНИЕ: пожалуйста, не отмечайте этот вопрос как дубликат. Я не могу понять другие ответы, и я просто прошу кого-то объяснить это ясно. После этого мода может удалить его, если захотят, ответьте! Я просто очень раздражаюсь этой ошибкой!

+0

Вы также можете опубликовать код, в котором вы отправляете объект через сокет. – AntJavaDev

+0

Здесь нет никакой тайны. Вы делаете именно то, что мой ответ в дубликате говорит, что не делать. Создайте 'ObjectInputStream' вне цикла. NB 'isClosed()' не является подходящим условием завершения. Правильное условие - это «EOFException». – EJP

+0

Я вывел его за пределы цикла, и он все еще дает ошибку ... – JHacking

ответ

0

Ваша самая вероятная причина в том, что вы продолжаете воссоздавать ObjectInputStream. Если вы измените свой код на это, он должен работать нормально, если поток не поврежден.

ob = new ObjectInputStream(s.getInputStream()); 
while(!s.isClosed()){ 

    try { 
     handler.objectReceived(ob.readObject(), instance); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Я предполагаю, что ваш код, который записывает объект, вы создаете ObjectOutputStream один раз. Когда вы создаете ObjectOutputStream, он записывает заголовок, состоящий из 4 байтов.

bout.writeShort(STREAM_MAGIC); 
bout.writeShort(STREAM_VERSION); 

Теперь, когда вы создаете ObjectInputStream он будет читать заголовок (этот вызов будет сделано в конструкторе).

Теперь, поскольку вы продолжаете воссоздать ObjectInputStream, он пытается прочитать заголовки, которые не существуют в потоке данных.

По существу создать ObjectOutputStream и ObjectInputStream ровно один раз.

+0

Благодарим вас за разъяснение! Теперь я понимаю, почему происходит ошибка, но даже подумал, что я ее изменил, но все же дает ошибку. – JHacking

+0

Этот ответ дает правильное лечение, но не по правильной причине. По правильной причине см. Мой ответ в дубликате. – EJP

+0

@ EJP ah Я вижу, я как бы заметил странное поведение создания потока ввода снова и снова. но то, что вы сказали, похоже, соответствует источнику java. Я обновлю ответ. – user254948