# Lauschen unterbrechen



## The_S (25. Jan 2007)

Hi,

ich habe einen Server und einen Client. Nachdem der Client eine Verbindung zum Server aufgebaut hat, lausche ich in einem neuen Thread an dessen InputStream ob eine Nachricht eintrifft. Das Ganze läuft in einer Schleife. Wie schaffe ich es jetzt am intelligentesten, dass ich nach einer bestimmten Aktion im SERVER, das Lauschen am Port unterbrechen (Solang vom Client keine neue Nachricht eintritt, wird der Thread ja gelockt  ). Dabei kann ich nicht einfach den Socket closen, da ich die Verbindung sonst später nicht mehr aufbauen kann. Auch möchte ich nach Möglichkeit darauf verzeichten, den Client ein Signal zu schicken, dass dann von diesem an den Server zurückgeschickt wird und im zeigt, dass er die Verbindung unterbrechen soll.

Hoffe mein Problem ist einigermaßen klar. Danke!


----------



## -frank (26. Jan 2007)

kannst du nicht nicht-blockierend lesen vom Stream? (und wenn nichts mehr reinkommt, die andere bedingung überprüfen (also ob Lauschen gestoppt werden soll oder nicht)) und dann halt ne weile den thread schlafen lassen)


----------



## The_S (26. Jan 2007)

Wenn du mir sagst wie ich nicht-blockierend lese gerne


----------



## -frank (26. Jan 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Wenn du mir sagst wie ich nicht-blockierend lese gerne



hmm, naja ... 
du könntest es umgehen, also einen zweiten Thread machen. der erste liest (blockierend) vom stream, speichert das gelesene aber nur in irgendein Puffer-Objekt. der eigentliche server thread kann dann nicht blockierend auf dieses objekt zugreifen und zb byteweise auslesen, nach jedem byte aber auch die lausch-bedingung prüfen, etc.
oder gehts dir wirklich darum, dass vom stream selbst kein einziges byte mehr gelesen wird, sobald diese bedingung erfüllt ist?


----------



## The_S (26. Jan 2007)

die stopp bedingung wird mir ja nicht zugesand. Dann wäre das ja kein Problem. Ich möchte einfach nur einen blockierenden InputStream dazu bringen mit den blockieren aufzuhören


----------



## -frank (26. Jan 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> die stopp bedingung wird mir ja nicht zugesand. Dann wäre das ja kein Problem. Ich möchte einfach nur einen blockierenden InputStream dazu bringen mit den blockieren aufzuhören



ich verstehe schon, dass die stopp-bedingung vom server selbst kommt. was ich wissen wollte, war, ob es dich wirklich stört, wenn der Thread weiterliest bzw. blockiert und es nicht reicht, wenn nach der stopp-bedingung gelesenes einfach nicht (sofort) verarbeitet wird, sondern eben nur gepuffert wird. dann könntest du nicht-blockierend lesen von diesem puffer. dass der eigentliche lese-thread noch immer blockiert, würde den server nicht dran hindern, in seinem eigenen thread entsprechende dinge abzuarbeiten (die halt nötig sind aufgrund der stop-bedingung). für den server-thread wäre es dann so als würde er nicht-blockierend lesen. 

aber ich weiß ja nicht genau, was dein ziel ist. wenn es keinen weiteren thread geben darf bzw. es auf keinen fall blockieren darf, gehts so natürlich nicht.

mir ist das unlängst untergekommen:
http://sourceforge.net/project/showfiles.php?group_id=57510&package_id=53225

verwendet habe ich den code nicht, weiß auch nicht, wie er funktioniert (könnte genauso mit threads sein).
aber da steht zb bei NonBlockingSocket als beschreibung:
* A NonblockingSocket is a socket which exports nonblocking input/output
 * streams. It is otherwise idential to a standard socket.

vielleicht ist das ja was für dich. aber wenns nur darum geht, dass der server nicht blockieren und auf die stopp-bedingung überprüfen soll, dann würde ich einfach nen zweiten thread machen.


----------



## The_S (26. Jan 2007)

Ne, so einfach isses leider nicht. Das Ding ist schon Multi-Threaded  . Der Server soll expliziet damit aufhören an dem Socket zu horchen, auch wenn der Client nichts schickt und ohne den Socket zu closen.

Werds dann wohl doch so lösen, dass ich an den entsprechenden Client ein Signal sende, damit von diesem das "Hör-Auf-Zu-Lauschen"-Signal an den Server übermittelt werden kann.

Trotzdem danke und falls noch jemanden was einfällt, bin für alles offen  .


----------

