java.io.StreamCorruptedException: header de stream inválido: 00000001

Eu continuo recebendo este obter esta Exception :

 java.io.StreamCorruptedException: invalid stream header: 00000001 

Lado do servidor eu usei isso para enviar e receber int, funciona bem.

Servidor:

 new DataOutputStream(player1.getOutputStream()).writeInt(P1); 

Cliente:

 dataFromServer = new DataInputStream(socket.getInputStream()); dataFromServer.readInt(); 

Mas quando tento enviar um object, assim, dá o erro.

Servidor:

 new ObjectOutputStream(player2.getOutputStream()).writeObject(gameCrossword); 

Cliente:

 objectFromServer = new ObjectInputStream(socket.getInputStream()); crossword = (Crossword)objectFromServer.readObject(); 

Qualquer ajuda seria bem-vinda. Aqui está eu enviando as palavras cruzadas inicialmente antes da session do jogo

Eu mudei o código para usar apenas streams de objects ao invés de streams de dados, seguindo o conselho do jtahlborn

servidor

 player1 = serverSocket.accept(); serverLog.append(new Date() + ": Player 1 joined session " + sessionNo + '\n'); serverLog.append("Player 1's IP address" + player1.getInetAddress().getHostAddress() + '\n'); new ObjectOutputStream(player1.getOutputStream()).writeInt(P1); new ObjectOutputStream(player1.getOutputStream()).writeObject(gameCrossword); player2 = serverSocket.accept(); serverLog.append(new Date() + ": Player 2 joined session " + sessionNo + '\n'); serverLog.append("Player 2's IP address" + player2.getInetAddress().getHostAddress() + '\n'); new ObjectOutputStream(player2.getOutputStream()).writeInt(P2); new ObjectOutputStream(player2.getOutputStream()).writeObject(gameCrossword); 

cliente

  private void connectToServer() { try { Socket socket = new Socket(host, 8000); objectFromServer = new ObjectInputStream(socket.getInputStream()); objectToServer = new ObjectOutputStream(socket.getOutputStream()); } catch (IOException ex) { System.err.println(ex); } Thread thread = new Thread(this); thread.start(); } @Override public void run() { try { player = objectFromServer.readInt(); crossword = (Crossword)objectFromServer.readObject(); System.out.println(crossword); 

respeita, C.

não envolva os streams de soquete com mais de um stream de input / saída. isso vai quebrar em todos os tipos de maneiras ruins. Nesse caso específico, o ObjectInputStream lê um header do stream na construção , o que está acontecendo antes de você ler o int do stream. De qualquer forma, basta usar um único ObjectOutputStream e ObjectInputStream e abandonar os streams de dados (observe que ObjectOutputStream tem um método writeInt ).

    Intereting Posts