# Welches Konstrukt?



## gast (15. Feb 2009)

hey,

ich schreibe grade ein einfache Klasse mit Socket, als Design nutze ich das Listener Pattern.

Meine Klasse S1 macht eine Client Socket Verbindung auf und while(true) werte sie empfangene Daten aus in einer connect() Methode!

Nun kommt das Problem

S1 s = new S1(...);

s.connect() // Hier Start der while Schleife 

s.addListener(...); //Die Listener reagieren und funktionieren

s.writePufferLine(...); //Diese Zeile wird niemals erreicht da connect() läuft,
wenn ich nun die connect() Methode in einen Thread verpacke kann ich s.writePufferLine(...) aufrufen jedoch kommt es zu folgendem Problem:

Wenn die connect() Methode noch nicht mit einem Server verbunden ist und diese in einem Thread läuft... wird ja direkt nach connect() s.writePufferLine aufgerufen und naja ich kann ja nix über das Socket schicken wenn die Verbindung noch nicht besteht!

Wie löse ich?

Ich habe mal in den connect() Thread einen Timer eingebaut sodass nach dem Aufruf s.connect() erst 10 Sekunden vergehen bis s.writePufferLine(...) erfolgt bzw. das Programm weiter läuft...

Eine andere Lösung wäre ich schreibe mir noch einen Listener "afterConnect"...

Wie lößt man dieses Problem am besten?

Vlg


----------



## tuxedo (18. Feb 2009)

Das hänt doch davon ab was du in der connect() Methode machst. Klar, die blockiert erstmal solange bis du verbunden bist. Aber danach sollte sie nicht mehr blockieren. Tut sie's doch, hast du wohl irgend etwas eingebaut das weiter blockiert. 

Lass doch mal n bisschen Code sehen statt das hier im trockenen zu diskutieren.

gruß
Alex


----------



## 23 (18. Feb 2009)

Die Frage ist ja wie geht man vor? 

Blockieren bis alles steht oder Event droppen oder etwas ganz anderes?


----------



## tuxedo (19. Feb 2009)

Was heisst hier "wie geht man vor"?

Natürlich solltest du "blocken" bis du verbunden bist... Wo kämen wir denn hin wenn Anwendungen das nicht tun?

Kenne keinen Browser der schon das klicken auf einer noch nicht verbundenen Webseite erlaubt. Manche Anwendungen haben einen "Offline" Modus. Manche ICQ Clients und viele Mailclients z.B.

Da wird jedoch nicht gleich versucht die Nachricht auf dem Socket zu verschicken. Da wird in einer abstrakten Ebene weiter oben "gepuffert" und die "Tasks" in eine Warteliste eingereiht. Geht der Client dann online werden die Tasks abgearbeitet, sprich nach unten weiter gereicht und letztendlich gesendet. 

Dieser Offline-Modus findet also nicht auf Netzwerk-Ebene statt, sondern weiter oben in der Logik. 

Fazit: Es macht in meinen Augen wenig Sinn auf dem noch nicht verbundenen Socket zu schreiben, und im noch-offline-Fall irgendwas zu droppen.

Lass "connect()" einfach blocken solange bis die Verbindung wirklich steht. Das ist gang und gebe.

Nebenbei: Code haben wir jetzt immer noch nicht gesehen...

Gruß
Alex


----------



## 23 (19. Feb 2009)

Hey,

alles klar 

Danke für die Antwort!

vlg


----------

