我现在正在Android手机上创建一个简单的TicTacToe游戏。 我使用java服务器处理多人游戏部分,但是当我配对玩家和新游戏时在ObjectInputStream中,它抛出异常。
java.io.StreamCorruptedException: invalid stream header: 74001057
这是创建新游戏线程时的服务器代码:
public GameThread(Socket Player1, Socket Player2) {
this.Player1 = Player1;
this.Player2 = Player2;
System.out.println("GameThread Started!");
//Exception throw at the codes below
new ReceiveMessagesThread(this.Player1, this.Player2).start();
new ReceiveMessagesThread(this.Player2, this.Player1).start();
}
这是我在游戏线程中接收消息的服务器代码:
// This is an inner class.
private class ReceiveMessagesThread extends Thread {
private Socket SourceClient, DestinationClient;
ReceiveMessagesThread(Socket SourceClient, Socket DestinationClient) {
this.SourceClient = SourceClient;
this.DestinationClient = DestinationClient;
}
@Override
public void run() {
while (true) {
try {
// Exception throw at the line below
ObjectInputStream in = new ObjectInputStream(this.SourceClient.getInputStream());
switch (in.readByte()) {
case ServerGlobal.BOARD_STATUS:
GameBoard = (char[][]) in.readObject();
SendBoardStatus(this.DestinationClient);
break;
}
}
catch (java.io.StreamCorruptedException ex) {
ex.printStackTrace();
break;
}
catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(GameThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
答案 0 :(得分:0)
在循环之前移动ObjectInputStream
的创建。它试图读取由对等方ObjectInputStream
放置在那里的流标题,您同样应该只创建一次。这些流应该在套接字的生命周期内持续存在,而不是每次发送或接收都重新创建。
答案 1 :(得分:-1)
如果您通过单独的字符将字符数组输出到ObjectOutputStream
,那么您也应该通过字符而不是数组来读取它。
另外,请检查ObjectOutputStream
和ObjectInputStream
的使用情况。在github上的代码中,您可以在某些地方使用DataInputStream
。
同时确保socket.getInputStream()
与new ObjectInputStream()
的每次换行都与socket.getOutputStream()
与new ObjectOutputStream()
的相应解包相匹配。或者更好的是,只将套接字流包装在ObjectInputStream
和ObjectOutputStream
中一次,而不是每次都要读/写一些东西。