Моя проблема состоит в том, когда она пытается считать объект во второй раз, когда она выдает исключение:
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();
}
}
}
Вы правы; я не закрываю объект. Я не уверен, как сделать это.
Основная проблема заключается в том, что вы используете новый ObjectOutputStream
для записи в существующий ObjectInputStream
, для записи в который вы уже использовали предыдущий ObjectOutputStream
. У этих потоков есть заголовки, которые записываются и считываются соответствующими конструкторами, поэтому если вы создадите еще один ObjectOutputStream
, вы запишете новый заголовок, который начинается с - угадайте что? - 0xAC,
а существующий ObjectInputStream
не ожидает другого заголовка в этот момент, поэтому он отрубается.
В теме Java Forums, процитированной @trashgod, мне следовало бы опустить часть про "заново для каждого объекта на обоих концах": это просто расточительно. Используйте один OOS и OIS на протяжении всей жизни сокета, и не используйте никаких других потоков на сокете.
Если вы хотите забыть то, что написали, используйте ObjectOutputStream.reset().
И не используйте другие потоки или Readers
или Writers
на том же сокете. API объектного потока может работать со всеми примитивными типами данных Java и всеми Serializable
классами.