ObjectOutputStream kontinuierlich

Scarabol

Mitglied
Hi Leute,

ich benutze die ObjectOutputStream Klasse, um zwischen Client und Server zu kommunizieren. Nun ist es wichtig, dass die Objecte permanent übertragen werden, damit der Client alle Änderungen an den Objekten sieht und umgekehrt, der Server auch.

Der Server schickt das erste Object, dann wartet er und schickt auf jede Antwort erneut seine aktuellen Daten. Der Client wartet von vornerein, dass der Server etwas schickt und sendet dann ebenfalls auf jede Antwort seine Daten.

Sollte eigentlich kontinuierlich laufen, tut es ohne reset auch wunderbar (nur das ich immer die gleichen Objekte bekomme). Wenn ich reset benutze funktioniert die Übertragung nur einige Sekunden und bleibt dann hängen im Schreibvorgang auf der anderen Seite hängen.

Hier mal der Auszug meiner eigentlich unendlichen Schleife:
Java:
	while (!Thread.interrupted()) {
		Object obj = null;
		try {
			// reset here? reset input too?
			obj = socketInp.readObject();
		} catch (SocketException e) {
			// may be socket closed - just quit silent
			break;
		} catch (IOException e) {
			e.printStackTrace();
			break;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			break;
		}
		if (obj != null && obj instanceof Entity) {
			Entity gameObj = (Entity) obj;
			// yeah we got a message, add it to our buffer
			lockIn.lock();
			bufferIn.put(gameObj.getID(), gameObj);
			System.out.println(this.getClass().getName()+" received "+gameObj.getClass().getName());
			lockIn.unlock();
		}
		// nothing to say? - wait
		while (bufferOut.isEmpty()) {
			try {
				Thread.sleep(0, 1);
			} catch (InterruptedException e) {
				this.close();
				return;
			}
		}
		try {
			// reset here???
			// so we got a message send back our cached data
			lockOut.lock();
			for (Entity e : bufferOut.values()) {
				socketOut.writeObject(e); // <<<< genau hier bleibt der Ablauf hängen
			}
			socketOut.flush();
			System.out.println(this.getClass().getName()+" send: "+bufferOut.size());
			bufferOut.clear();
			// reset here???
		} catch (IOException e) {
			e.printStackTrace();
			break;
		} finally {
			lockOut.unlock();
		}
	}
	this.close();

Danke im Voraus
Scarabol
 

Scarabol

Mitglied
LOL, ich liebe diese Forum!

Immer wenn ich hier was poste finde ich die Antwort 10min später selbst :D

[JavaSpecialists 088] - Resetting ObjectOutputStream

hier noch meine Änderung
Java:
		lockOut.lock();
		for (Entity e : bufferOut.values()) {
			socketOut.writeObject(e);
		}
		socketOut.flush();
		resetCounter++;
		if (resetCounter > 20) {
			socketOut.reset();
			resetCounter = 0;
		}
		System.out.println(this.getClass().getName()+" send: "+bufferOut.size());
		bufferOut.clear();

Gruß
Scarabol
 

Scarabol

Mitglied
My fault again :)

I send all objects on their own, but if an object is received the other side try to answer. This bring them both into writting state and kill the network communication.

My Solution:
I send my complete bufferOut object to the client as ONE object and answer also with ONE object to make it work nice and smoothy :)

Und dann fällt mir so auf kacke du schreibst ja Englisch :D

Danke Leutz und viel Spaß beim lesen :D

Gruß
Scarabol
 

Ähnliche Java Themen

Neue Themen


Oben