멀티 플레이어 뱀 게임을 개발 중입니다. 게임은 자주 (예외는 아니지만) 예외적으로 java.io.StreamCorrupted 예외 유형 코드를 임의로 throw합니다. AC 동일한 전체 StackTrace가 아래에 나와 있습니다.소켓을 통한 java.io.StreamCorruptedException
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at mycode.ConnectionManager.otherRunMethod(ConnectionManager.java:231)
at mycode.ConnectionManager$1.run(ConnectionManager.java:289)
at java.lang.Thread.run(Unknown Source)
에러 아래 주어진 생성 클라이언트 측 코드 :
아래와void otherRunMethod() {
try {
while (true) {
boolean gameup = false;
objin = new ObjectInputStream(socket.getInputStream());
Object insnake = objin.readObject();
if (((Snake) insnake).player.length() >= 9) {
if (((Snake) insnake).player.substring(0, 8).equals(
"Resigned")) {
String[] s = ((Snake) insnake).player.split(",");
map.remove(s[1]);
continue;
} else if (((Snake)insnake).player.substring(0, 10)
.equals("food_eaten")) {
String[] s = ((Snake) insnake).player.split(",");
Game.foodx = Integer.parseInt(s[1]);
Game.foody = Integer.parseInt(s[2]) + 35;
objin = new ObjectInputStream(socket.getInputStream());
insnake = objin.readObject();
if(((Snake)insnake).score>highestscore){
highestscore=((Snake)insnake).score;
if(highestscore>=100 && highestscore<200)
levelUp(2);
else if(highestscore>=200){
levelUp(4);
}
}
if (s.length == 4) {
System.out.println(s[3]);
if (s[3].equals("game_up")) {
gameup=true;
}
}
}
}
Snake temp = new Snake((Snake) insnake);
map.remove(temp.player);
map.put(temp.player, temp);
if(temp.gameover){
allPlayersEliminated();
}
findPos();
game_UpCheck(gameup);
Thread.sleep(10);
}
} catch (java.net.SocketException s) {
JOptionPane.showMessageDialog(null, "Server Closed", "ERROR",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
동일 물에 대한 상응하는 서버 측 코드는 :로
void relay(Snake move) {
boolean foodeaten = false;
Snake snake = move;
try {
if (move != null && move.player.length() > 9) {
if (move.player.equals("food_eaten")) {
move.player = move.player + ","
+ (Snakeserver.randomGenerator.nextInt(100) * 6)
+ ","
+ (Snakeserver.randomGenerator.nextInt(100) * 6);
foodeaten = true;
snake = (Snake) objin.readObject();
int rows = Snakeserver.score.getModel().getRowCount();
int row = 1;
for (int i = 0; i < rows; i++) {
if (((Snake) snake).player
.equals((String) Snakeserver.score.getModel()
.getValueAt(i, 0))) {
row = i;
break;
}
}
if (snake.score >= 300)
move.player += "," + "game_up";
Snakeserver.score.getModel()
.setValueAt(snake.score, row, 1);
}
}
if (move.gameover) {
int rows = Snakeserver.score.getModel().getRowCount();
int row = 1;
for (int i = 0; i < rows; i++) {
if (snake.player.equals((String) Snakeserver.score
.getModel().getValueAt(i, 0))) {
row = i;
break;
}
}
Object temp = Snakeserver.score.getModel().getValueAt(row,
1);
temp += " GAME OVER";
Snakeserver.score.getModel().setValueAt(temp, row, 1);
}
for (Snake name : map.keySet()) {
if (name != null) {
if (name.player.equals(snake.player)) {
name.copyValues(snake);
}
objout = new ObjectOutputStream(map.get(name)
.getOutputStream());
objout.writeObject(move);
objout.flush();
if (foodeaten) {
objout = new ObjectOutputStream(map.get(name)
.getOutputStream());
objout.writeObject(snake);
objout.flush();
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
사실 난 돈 문제가있는 곳을 알기 때문에 필요한 것보다 더 많은 코드를 버려 두었을 것입니다.
그것을받을 귀하의'otherRunMethod() 'while'-loop 일 때, 모든 반복에 대해 새로운'OutputStream'을 만들고, 재 작성되지 않은'InputStream'에 쓰려고합니다. 위에 링크 된 질문을 참조하십시오. –
감사합니다. Lukas. 조금 더 자세히 설명해 주시겠습니까? 비슷한 종류의 오류를 찾고있었습니다. – Sohaib
우선, 'InputStream' 생성을 루프 밖으로 이동시키고 루프 내에서만 사용하십시오. –