It seems that every now and then, my project has been throwing exceptions when my client has received an object from the client.
I have no idea what is causing it as the stack trace leads from the objectinputstream.receive() into the java API.
The exceptions I am getting are either 'StreamCorruptedExceptions' or Casting errors where it attempts to cast one object from within the tableUpdate onto another (see class below), but I have no code which is doing this and I think it is related to the corruptedstream as they both started cropping up at the same time.
Does anyone know what may be causing it?
Example Exception:
|
Code:
|
java.io.StreamCorruptedException: invalid handle value: 7371007E
at java.io.ObjectInputStream.readHandle(ObjectInputStream.java:1433)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1309)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at common.network.IOSocket.receive(IOSocket.java:59)
at client.execute.ClientThread.run(ClientThread.java:34)
at java.lang.Thread.run(Thread.java:619) |
The Object Which Is Being Sent: (all objects within are also Serializable)
|
Code:
|
package server.table.updates;
import common.cards.Card;
import java.io.Serializable;
import server.game.variables.BlindLevel;
import server.game.Game;
import server.game.variables.PokerBreed;
import server.playablehand.HandStage;
import server.table.player.Player;
public class TableUpdate implements Serializable {
private Player[] players;
private Card communityCards[] = new Card[]{ null, null, null, null, null};
private int dealerPosition;
private BlindLevel blinds;
private int id;
private int pot = -1;
private String name;
private PokerBreed breed;
private int playerTurn = -1;
private UpdateType type;
private String displayText = "";
/**
* Creates a new instance of TableUpdate
*/
public TableUpdate(Game game, UpdateType type) {
this.type = type;
init(game);
}
private void init(Game game){
this.breed = game.getState().getBreed();
this.id = game.getId();
this.name = game.getName().toString();
this.blinds = game.getState().getTable().getBlinds();
this.dealerPosition = game.getState().getTable().getDealerPosition();
this.players = game.getState().getTable().getPlayers();
// if the game is not paused there will not be a hand being played
if (!this.type.equals(UpdateType.SHOWPAUSEDGAME)){
this.communityCards = game.getHand().getCommunityCards();
this.playerTurn = game.getHand().getHandPlayer().getPlayerTurn();
this.pot = game.getHand().getPot();
}
}
public void stripAllCards(){
for (int i=0; i<players.length; i++){
players[i].setHoleCards(null);
}
}
public void stripCardsForPlayer(int playerSeat){
for (int i=0; i<players.length; i++){
if (i!=playerSeat){
players[i].setHoleCards(null);
}
}
}
public Player[] getPlayers() {
return players;
}
public int getDealerPosition() {
return dealerPosition;
}
public BlindLevel getBlinds() {
return blinds;
}
public Card[] getCommunityCards(){
return this.communityCards;
}
public int getId() {
return id;
}
public int getPot(){
return this.pot;
}
public String getName() {
return name;
}
public UpdateType getType(){
return this.type;
}
public PokerBreed getBreed(){
return this.breed;
}
public int getPlayerTurn(){
return this.playerTurn;
}
} |
Before it is sent, it undergoes a deep copy: (not sure if its relevant or not)
|
Code:
|
private TableUpdate deepCopy(TableUpdate update){
try {
// converts the object to a byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(update);
oos.close();
byte[] byteArr = baos.toByteArray();
// converts the byte array back to an object
ByteArrayInputStream bais = new ByteArrayInputStream(byteArr);
ObjectInputStream ois = new ObjectInputStream(bais);
update = (TableUpdate) ois.readObject();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
return update;
} |