Socket Pushbackreader - Pushback buffer overflow

Volvagia

Top Contributor
Mal wieder ein Problem von mir. :(
Und zwar, wenn ich Daten vom Server via Socket lesen, kann es natürlich sein, das irgendwie etwas dazwischen kommt. Als Beispiel einfach die Nachricht, das eine neue PM oder so eingegangen ist. An sich ja kein Problem, und sollte eigendlich auch so sein, aber wenn etwas lade, und dafür eine Schleife einsetze, ist sowas natürlich nicht gut. (Ich weiß, Textanfänge sind nicht so mein Ding.)

Ich kann nicht in jeder Ladeschleife sämtliche Daten die möglicherweiße dazwischenkommen könnten handlen, da der Code dann unlesbar wäre. Deshalb war meine Idee, einen Befehl, der nichts mit der momentanen Schleife zu tun hat, wieder im Stream zurückzuschreiben. Dafür habe einen PushbackReader genommen. Allerdings fliegt mir bei jedem unread-Vorgang eine Excepiton:

Code:
java.io.IOException: Pushback buffer overflow
	at java.io.PushbackReader.unread(Unknown Source)
	at java.io.PushbackReader.unread(Unknown Source)
	at at.kai.applet.Command.pushBack(Command.java:276)
	at at.kai.applet.game.planetView.BuildPlanetView.readBuildings(BuildPlanetView.java:99)
	at at.kai.applet.game.planetView.BuildPlanetView.build(BuildPlanetView.java:78)
	at at.kai.applet.game.spaceView.planet.PlanetInfoFrame$1$1.run(PlanetInfoFrame.java:145)

Mein Code:
Anfangs habe ich das Array des String als eins übergeben, hat aber keinen Unterschied gegeben.

Java:
/**
 * Push back this command into inputstream of socket. 
 * @param socket The socket to push command into.
 */
public synchronized void pushBack(Socket socket)
{
	Reader reader = getReader(socket);
	PushbackReader pushbackReader = new PushbackReader(reader);
	try
	{
		char[] c = toString().toCharArray();
		for(char c2:c)
			pushbackReader.unread(c2);
	}
	catch (IOException e)
	{
		e.printStackTrace();
	}
	finally
	{
		try
		{
			pushbackReader.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
}

In der JavaDoc steht:

Code:
Throws: 
	IOException - If there is insufficient room in the pushback buffer, or if some other I/O error occurs

Allerdings habe ich nicht herausgefunden, wie man die Größe des Buffers ändert, und Google will mir auch nichts wirklich brauchbares ausspucken. :noe:


Ach ja, der Reader der benutzt wird ist ein BufferedReader -> InputStreamReader.


Edit: Ach ja, mit den Konstruktor die Größe zu ändern habe ich schon versucht, hat nichts gebracht.
 
Zuletzt bearbeitet:

Murray

Top Contributor
Was Du hier versuchst, kann so nicht gehen: der PushbackReader ist nicht wirklich in der Lage, Daten in den zugrundeliegenden Stream zurückzuschubsen; das unread bezieht sich nur auf die jeweilige PushbackReader-Instanz. Und davon machst Du ja in Deiner unread-Methode staändig neue auf.
 

Volvagia

Top Contributor
Wenn ich das richtig verstanden habe schreibt unread also eigendlich nur im internen Buffer der Instanz, und read ließt zuerst aus diesem und erst wenn er leer ist aus dem stream?

Das ist schade, aber danke. Dann muss ich das Ganze nochmal überdenken.
 
T

tuxedo

Gast
??

Wenn ich das richtig sehe, dann versucht der TS hier ein Problem zu lösen dass er sich selbst eingebrockt hat:

Unter verwendung eines "anständigen Protokolls" kann nicht "einfach so was dazwischen kommen".

Wenn der Client gerade in einer Schleife irgendwas liest, dann darf der Server seine "sende-schleife" unterbrechen, die Übertragung der PM dazwischen stecken und dann mit der Übertragung weiter machen, so dass der Client das dann wieder ausseinanderdividieren muss.

Korrekterweise gibt es eine Sendequeue... Da wird alles in eine Warteschlange gepackt was gesendet werden soll. Ein Thread arbeitet diese Queue Eintrag für Eintrag ab. Da kommt dann nix durcheinander, und der Client muss auch nicht seinen Empfang-Vorgang unterbrechen um eine "dazwischenkommende PM" zu lesen.

- Alex
 

Ähnliche Java Themen

Neue Themen


Oben