2016-11-29 10 views
0

Я пытаюсь разработать игру с использованием сокетов. В одной части этого мне нужно перенести плату одного игрока на другую, поэтому я беру объект, в котором он хранится, и отправляет его через сокет. Когда я получаю плату игроков в гнездо другого игрока, я получаю сообщение об ошибке. Это сообщение об ошибке не всегда одно и то же, иногда это исключение StreamCorruptedException, а в других случаях это исключение ClassCastException. Эта ошибка не всегда бывает в одно и то же время, например, иногда я отправляю плату от одного игрока другому до 15 раз, прежде чем возникает ошибка, а в других случаях я отправляю ее всего три раза и возникает ошибка. Трассировка стека для повреждения потока следующая:Поток поврежден и не может присваивать экземпляр ... ошибок при чтении из сокета

java.io.StreamCorruptedException: invalid type code: 00 

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1381) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1714) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1714) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1714) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1714) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1714) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 
at guerradelosmundos.threadCliente.run(threadCliente.java:144) 

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

Tablero tablero=(Tablero)entrada.readObject(); 

линия, где я пишу информацию сокета следующие

synchronized(this){ 
    foo.salida.writeObject(too); 
    foo.salida.flush();      
} 

ответ

0

Затрудняюсь сказать, без код, но вот несколько идей:

  • Вы пытаетесь вызвать readObject больше раз, чем вы на самом деле называли writeObject (или раньше)?
  • Вы читаете/пишете что-то еще в потоке?
  • Вы останавливаете процесс отправки перед чтением?
  • Вы возитесь с полями объекта на стороне клиента без обновления клиента (или наоборот)?
+0

Что вы подразумеваете под обновлением клиента? – 6a75616e

+0

Я имею в виду изменение кода для класса, в котором вы его отправляете, но забыв внести изменения в часть прочитанного кода. Это предполагает, что у вас есть два независимых процесса написания и чтения. Например, вы, возможно, изменили класс Tablero, но клиент (одно чтение) все еще использует старую версию Tablero. – Ekeko