2016-11-29 22 views
0

我想開發一個使用套接字的遊戲。在其中的一部分中,我需要將一個玩家的棋盤轉移到另一個玩家的棋盤上,因此我將它存儲的對象放在槽中並通過它發送。當我收到其他玩家的球員板時,我收到一條錯誤消息。這個錯誤信息並不總是相同的,有時它是一個StreamCorruptedException,有時它是一個ClassCastException。這個錯誤並不總是在同一時間發生,例如,有時我會在發生錯誤之前將板從一個玩家發送到另一個玩家15次,而其他時間我只發送三次並且發生錯誤。 Stream腐敗的堆棧跟蹤如下流損壞,無法分配從錯誤的實例...從套接字讀取

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