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




thread pool (2)

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

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

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


Answers

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

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

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

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


Что касается вашего вопроса о том, должен ли сервер приложений ждать подключения, ответ будет да.

Соединения MySQL блокируются. Когда вы отправляете запрос от сервера MySQL по соединению, соединение будет ждать, простаивает, пока не будет получен ответ от сервера.

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

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

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







java multithreading streaming object