StreamCorruptedException: invalid type code: AC

Kai008

Erfahrenes Mitglied
...wird mir gethrowt, wenn ich mehrmals versuche, mit einen ObjectInputStream zu lesen.
An falschen Instanzen liegt es nicht, ich verwende nur 2 Methoden, und das Serialisierte Objekt ist final. (JavaDoc: "Control information in the stream is inconsistent.")
Das komischere finde ich, dass die Exception nach einer variablen Anzahl von empfangenen Objecten von der Methode readObject() fliegt.
Hat damit zufällig schon jemand Erfahrung gemacht? Ich habe gelesen, dass es daran liegen kann, dass ich jedes mal eine neue Stream-Instanze erstelle, aber das hat dass Problem leider nicht gelöst.

Java:
public synchronized Command readCommand()
{
	Command command = null;
	
	try
	{
		if(inputStream == null)
			inputStream = new ObjectInputStream(socket.getInputStream());
		command = ((Command)(inputStream.readObject()));
	}
	catch (SocketException e)
	{
		try
		{
			socket.close();
		}
		catch (IOException e1)
		{
			e1.printStackTrace();
		}
	}
	catch (IOException e)
	{
		e.printStackTrace();
	}
	catch (ClassNotFoundException e)
	{
		e.printStackTrace();
	}
	return(command);
}
Java:
public void sendCommand(Command command)
{
	try
	{
		ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
		outputStream.writeObject(command);
	}
	catch (IOException e)
	{
		e.printStackTrace();
	}
}
Java:
package core;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public final class Command implements CommandConstants, Serializable
{
	private static final long serialVersionUID = 1L;

	private String command;
	private String location;
	private List<String> parameterList;
	
	public Command(String command, String location)
	{
		super();
		this.command = command;
		this.location = location;
		this.parameterList = new ArrayList<String>();
	}
	public void addParameter(String parameter)
	{
		parameterList.add(parameter);
	}
	public String getCommand()
	{
		return(command);
	}
	public String getLocation()
	{
		return(location);
	}
	public String getParameter(int i)
	{
		return(parameterList.get(i));
	}
}
 
Hi,
der InputStream wird bei dir nur einmal, der OutputStream dagegen jedesmal neu erstellt. Das könnte zu einem Problem führen. Probiere mal den Outputstream ebenfalls nur einmal zu erstellen und dann weiter zu verwenden.

Grüße!
 
Danke, ich glaube, ich weiß in etwa was los ist.
Beim umschreiben des Clients (die Exception flog am Server) habe ich die Methode syncronisiert (am Server ist sie wieder desyncronisiert, war in dem Fall quatsch). Aber jetzt bleibt er in der Output-Methode hängen. Kann das evenutell davon kommen, dass ich mehrere Threads zum versenden verwende? Der Dispatch-Thread errechnet den neuen Status des Players ausgehend von den aktuellen und den Tastendruck, dieser wird dann am Server gesendet, wo das Command an alle Spieler auf der aktuellen Karte verteilt wird, ein 3. Thread empfangt am Client das Command und dieser setzt der Darstellung den Status. Der andere Thread sendet in kontinuierlichen Abständen die eigenen Koordinaten und das aktuelle Bild des Charsets zum Verteilen am Server, damit durch die Verzögerung entstandene Differenzen ausgebessert werden.

Mein Gedanke war jetzt so, dass beide Threads relativ gleichzeitig gesendet haben, und so irgendwie die Object's in den Socket-Buffer des Server hintereinander geschrieben werden, dass der Lesevorgang bei der Fingerprint-Prüfung oder so einen Fehler verursacht hat. Ich komme nur nicht dahinter, wieso er im Output hängen bleibt.

Fällt euch dazu eventuell etwas ein?

Java:
public synchronized void sendCommand(Command command)
{
	try
	{
		if(outputStream == null)
			outputStream = new ObjectOutputStream(socket.getOutputStream());
		outputStream.writeObject(command);
		outputStream.flush();
	}
	catch (IOException e)
	{
		e.printStackTrace();
	}
}

Edit: Ich habe hier: http://krum.rz.uni-mannheim.de/jhpc/sess-3.html gelesen, dass man die Erzeugung der Streams in einer bestimmten Reihenfolge passieren soll. Das hat aber leider auch nichts gebracht.
 
Zuletzt bearbeitet:
So, es hat sich erledigt. Habe herumprobiert (z. B. Reihenfolge der Erstellung verändert, Buffered...Stream dazwischen verwenden, dabei hat er btw. beim Input blockiert), irgendwann hat es plötzlich wieder funktioniert, und ich weiß nicht warum. Hoffentlich tritt es nicht wieder auf, aber interessieren würde mich schon, warum er sich so seltsam verhalten hat.
 
Zurück