Errore: java.io.StreamCorruptedException: invalid type code: AC
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1716)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:499)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:457)
at ClientHandler.run(ClientHandler.java:53)
su questo codice:
import java.awt.event.KeyEvent;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.SocketException;
public class ClientHandler implements Runnable {
private ObjectOutputStream outputStream;
private ObjectInputStream inputStream;
private boolean running;
private Player player;
private Socket socket;
public ClientHandler(Socket socket, Player player) {
this.player = player;
this.socket = socket;
try {
outputStream = new ObjectOutputStream(this.socket.getOutputStream());
inputStream = new ObjectInputStream(this.socket.getInputStream());
} catch(IOException e) {
e.printStackTrace();
}
}
public void close() throws IOException {
running = false;
inputStream.close();
outputStream.close();
}
public void sendPacket(Object obj) {
try{
outputStream.reset();
System.out.println("SERVER INVIA: "+obj.hashCode());
outputStream.writeObject(obj);
outputStream.flush();
} catch(IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
running = true;
while(running) {
try {
String userInput = (String) inputStream.readObject();
if(userInput!=null) {
System.out.println("SERVER RICEVE: "+userInput);
if(userInput.equals("w")) {
player.setKeyPressed(KeyEvent.VK_W);
player.setKeyReleased();
} else if(userInput.equals("s")) {
player.setKeyPressed(KeyEvent.VK_S);
player.setKeyReleased();
}
}
} catch (EOFException | SocketException e){
running = false;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
L'oggetto che gli passo in write è una Classe Serializzata, UpdatePacket che contiene i riferimenti alla palla e ai due paddle.
L'errore me lo da su un readObject, Stringa che riceve dal client che fa riferimento al movimento della racchetta di quel player.
Ora so che questo errore dovrebbe indicare che ci sono altri flussi aperti su quella socket, ma i due Stream istanziati sono unici per questa classe. Ne ho istanziati altri due nel Client, per ricevere e inviare gli oggetti. Sbaglio qualcosa?
EDIT: scrivendo la parte sottolineata mi sono reso conto che nel client ad ogni nuova chiamata su sendPacket o ReceivedPacket, aprivo un nuovo Stream. Quindi
ho risolto. Ora devo solo capire come fare un draw sugli oggetti del JPanel acquisiti.
EDIT: Ok ho risolto tutto, il giochino starta tranquillamente con due client, il server riceve elabora e invia i dati. Se posso postare tutto su github magari da ricevere un feedback, su cosa potrei migliorare. Nel frattempo ringrazio l'utente
migliorabile, di cui ho grandissima stima, in quanto reputo i suoi consigli, di grandissima utilità in ogni occasione.