java parallel - StreamCorruptedException:неверный код типа:AC




thread pool (2)

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

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

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

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

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

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 ()? Я даже распечатал объект сообщения, который принимается по приведенной ниже строке, и точно такой же, как первый экземпляр, где он работает нормально.

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

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


Это означает, что вы хотите запускать все задачи непрерывно, используя некоторый порядок.

Вы можете создать некоторый тип отсортированных по стеку задержек (или даже связанному списку) задач. Когда приходит новое задание, вы должны вставить его в положение, зависящее от времени задержки (просто эффективно рассчитать это положение и эффективно вставить новое задание).

Запустите все задачи, начиная с заголовка стека задач (или списка).







java multithreading streaming object