java.io.StreamCorruptedException:无效的流标题:74001057

时间:2015-06-02 18:46:16

标签: java serialization

我现在正在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);
      }
    }
  }
}

2 个答案:

答案 0 :(得分:0)

在循环之前移动ObjectInputStream的创建。它试图读取由对等方ObjectInputStream放置在那里的流标题,您同样应该只创建一次。这些流应该在套接字的生命周期内持续存在,而不是每次发送或接收都重新创建。

答案 1 :(得分:-1)

如果您通过单独的字符将字符数组输出到ObjectOutputStream,那么您也应该通过字符而不是数组来读取它。

另外,请检查ObjectOutputStreamObjectInputStream的使用情况。在github上的代码中,您可以在某些地方使用DataInputStream

同时确保socket.getInputStream()new ObjectInputStream()的每次换行都与socket.getOutputStream()new ObjectOutputStream()的相应解包相匹配。或者更好的是,只将套接字流包装在ObjectInputStreamObjectOutputStream中一次,而不是每次都要读/写一些东西。