Вопрос-ответ

StreamCorruptedException: invalid type code: AC

StreamCorruptedException: недопустимый код типа: AC

Моя проблема в том, что когда он пытается прочитать объект во второй раз, он выдает исключение:

java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at Client.run(BaseStaInstance.java:313)

java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at Client.run(BaseStaInstance.java:313)

В первый раз я отправляю точно такое же сообщение об объекте; однако, когда я пытаюсь сделать то же самое во второй раз, выдается ошибка, описанная выше. Нужно ли мне повторно инициализировать метод readObject ()? Я даже распечатал объект message, который принимается строкой ниже, и он точно такой же, как в первом экземпляре, где все работает нормально.

Object buf = myInput.readObject();

Я предполагаю, что есть какая-то проблема с добавлением, но мне действительно нет смысла добавлять. Я просто хочу каждый раз читать новую строку.
Я был бы очень признателен за помощь в исправлении этой ошибки. Спасибо.

==================================

Перед этой строкой я просто создаю объекты ввода и вывода для сокета в методе run() . Объявление объекта находится вне метода run () в классе:-

@Override
public void run() {
try {
sleep((int) 1 * 8000);
} catch (Exception e) {
e.printStackTrace();
}

try {
//Creating input and output streams to transfer messages to the server
myOutput = new ObjectOutputStream(skt.getOutputStream());
myInput = new ObjectInputStream(skt.getInputStream());
while (true) {
buf = myInput.readObject();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}

Вы правы; я не закрываю объект. Я не уверен, как это сделать.

Переведено автоматически
Ответ 1

Основная проблема заключается в том, что вы используете new ObjectOutputStream для записи в поток, для записи в который вы уже использовали предыдущий ObjectOutputStream. Эти потоки имеют заголовки, которые записываются и считываются соответствующими конструкторами, поэтому, если вы создадите другой, ObjectOutputStream вы напишете новый заголовок, который начинается с - угадайте, что? - 0xAC, и существующий ObjectInputStream на данный момент не ожидает другого заголовка, поэтому его вырывает.

В ветке форумов Java, на которую ссылается @trashgod, я должен был опустить часть о "заново для каждого объекта на обоих концах": это просто расточительно. Используйте один OOS и OIS в течение срока службы сокета и не используйте никакие другие потоки в сокете.

Если вы хотите забыть то, что вы написали, используйте ObjectOutputStream.reset().

И не используйте никакие другие потоки или Readers или Writers в том же сокете. API object stream могут обрабатывать все примитивные типы данных Java и все Serializable классы.

java multithreading