than - java.io.StreamCorruptedException: cabecera de secuencia no válida: 00000001
java.io.ioexception que es (1)
no envuelva las secuencias de socket con más de una secuencia de entrada / salida. esto se romperá en todo tipo de malas maneras. en este caso específico, ObjectInputStream lee un encabezado de la secuencia en construcción , que está sucediendo antes de haber leído el int de la secuencia. independientemente, solo use un solo ObjectOutputStream y ObjectInputStream y elimine los flujos de datos (tenga en cuenta que ObjectOutputStream tiene un método writeInt
).
Sigo recibiendo esto, obtengo esta Exception
:
java.io.StreamCorruptedException: invalid stream header: 00000001
El lado del servidor que usé para enviar y recibir int, funciona bien.
Servidor:
new DataOutputStream(player1.getOutputStream()).writeInt(P1);
Cliente:
dataFromServer = new DataInputStream(socket.getInputStream());
dataFromServer.readInt();
Pero cuando intento enviar un objeto como este, me da el error.
Servidor:
new ObjectOutputStream(player2.getOutputStream()).writeObject(gameCrossword);
Cliente:
objectFromServer = new ObjectInputStream(socket.getInputStream());
crossword = (Crossword)objectFromServer.readObject();
Cualquier ayuda sería buena. Aquí estoy enviando el crucigrama inicialmente antes de la sesión del juego
Cambié el código para usar solo flujos de objetos en lugar de flujos de datos, siguiendo el consejo de 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);
Saludos, C.