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)

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

Object buf = myInput.readObject();

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

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

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

@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();
        }
    }
}

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

31
задан Jonathan Leffler 11 March 2012 в 02:08
поделиться

1 ответ

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

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

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

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

72
ответ дан 27 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: