Client "kicken"
Hallo Alex und alle Anderen,
ich würde gerne serverseitig die Verbindung von bestimmte Klienten trennen können, quasi diese kicken. Problem hierbei ist, dass ich da keinen sauberen Weg finde. Gibt es momentan überhaupt einen?
Bei mir scheitert es momentan entweder daran das ich a) den Client auffordere die Verbindung zu trennen, was zu einer Exception führt, da ich ja in dem moment ne Funktion vom Server aufm Client ausführe, oder b) der Client ist laut Server getrennt (unreferenced etc. ausgeführt) aber der der Client kann munter mit dem Server interagieren?!
1.) Also nochmal konkret, gibt es da ne saubere Möglichkeit Verbindungen serverseitig zu beenden?
2.) Noch ein anderes kleines Problem, welches sich aber aus dem anderen ergibt... Wie teile ich einem Client mit, dass der Server während der Verbindung zB. abgestellt wurde?
Danke für die Hilfe,
schöne Grüße
Sich
Replies (10)
RE: Client "kicken" - Added by achristian 11 months ago
Moin,
ein SIMON Feature das Clients kickt gibt es bis dato nicht. Klingt aber nach einer guten Idee. Aber lass mich mal überlegen ob es nicht doch einen SIMON-Weg gibt Clients sauber zu trennen:
Wenn der Server den Client auffordert die Verbindung zu trennen, dann musst du das eigentliche trennen der Verbindung auf Client-seite entkoppelt. D.h. du müsstest einen Thread oder Timer starten der (verzögert) die Verbindung trennt, so dass der Trennwunsch-Call vom Server sauber zurückkehren kann. Der Trick ist also, den Call-Stack nicht zwischendrin abzuwürgen.
Einen anderen, sauberen Weg sehe ich mit der aktuellen Implementierung nicht.
Zu deiner Frage #2:
Du kannst auf Client-Seite einen ClosedListener registrieren. Damit wirst du über verbindungsabbrüche benachrichtigt. Du kannst den ClosedListener über das Lookup-Interface registrieren: http://dev.root1.de/project-sites/simon/apidocs/de/root1/simon/Lookup.html
Bzgl. des Client-Kick-Features: Erstell am besten ein neues Ticket ("new issue") und beschreibe wie du dir das Feature vorstellst. Ich schau's mir dann an und plane entsprechend.
Gruß
Alex
RE: Client "kicken" - Added by sich 11 months ago
Danke für deine schnelle Antwort,
die beiden Tipps bzw. Lösungen werde ich die Tage mal ausprobieren.
Ein neues Ticket habe ich auch angelegt, wusste ehrlich gesagt nicht genau wie und vor allem auch wie genau ich das formulieren sollte.
Ich werde dann an dieser Stelle nochmal bescheid geben, ob ich das so Umsetzen konnte.
Schöne Grüße
Sich
RE: Client "kicken" - Added by achristian 11 months ago
Hab das Ticket mal kommentiert und schon eine erste Implementierungs-Idee skizziert.
Bin gerade am überlegen ob es nicht auch ohne Callback-Objekt geht und ob ich da nicht irgendwas neues einführen könnte mit dem man eine Referenz auf einen bestimmten Client hat. Aber das "Problem" ist ja, dass es dem Server erstmal egal ist wer was aufruft.
Bei ersten Lookup wird die Socket-Verbindung vom Client zum Server aufgebaut. Bis hier ist noch keine Zeile selbstgeschriebener Servercode involviert. Nur hat die Simon-internas.... Wenn ein Client dann einen Aufruf macht, dann sendet er den Aufrufwunsch über die bestehende Socketverbindung. Beim Simon-Server kommt dieser Aufrufwunsch an. SIMON sucht dann das dazu passende Serverobjekt das man zuvor in die Registry eingehängt hat raus, und ruft die gewünschte Methode auf. Es gibt da nicht wirklich eine Möglichkeit im Servercode herauszufinden, welcher Client den Aufruf losgetreten hat. Den in der Serverimplementierung braucht man ja irgend ein Objekt, irgend eine Variable die den Client referenziert. Bis dato geht das nur via Callback-Objekt das der Client dem Server mit dem Methodenaufruf mitschickt.
Hmm, überlege gerade ob ich nicht irgendwas an den Thread, der den Methodenaufruf auf dem Server ausführt anhängen kann... grübel
Ah, Idee.... Muss ich aber erst mal praktisch ausprobieren: Ich könnte in dem Worker-Thread, der den Methodenaufruf ausführt eine Referenz des Threads in Kombination mit der Session in eine HashMap oder so stecken. Wenn dann der Servercode ausgeführt wird, könnte ich mir folgende Hilfsfunktion vorstellen:
1Simon.getCurrentClientSession() -> returns clientSession
Intern wird Simon dann nachschauen welcher Thread diese Methode aufruft, und dann in der HashMap die dazu zugehörige Session suchen. Hmm, könnte gehen.
Damit könnte man dann, ohne CallbackObjekt vom Client, RawChannels aufmachen, oder auch Client's in einer Liste speichern um später einen zu kicken oder so.
Ich glaub ich formulier da gleich mal ein neues Ticket... :-)
Man, für 1.2.0 hab ich dann ja ganz schön viel vor ...
Gruß
Alex
RE: Client "kicken" - Added by sich 11 months ago
Hmm...
Ich kann mir lebhaft vorstellen, dass für Version 1.2.0 ne Menge Features und somit auch Arbeit auf dich wartet!
Aber die Idee mit der HashMap hört sich schonmal sehr viel versprechend und interessant an. Würde dann ja auch gleich, wie du schom meintest mehrere neue Möglichkeiten (und evtl. neue Probleme für dich ;-) ) schaffen.
Die Implementierung mit den Callback werde ich wie gesagt spätestens am Wochenende mal ausprobieren. Denke so sollte das ja auch (erstmal) funktionieren... ;-)
Gruß
Sich
RE: Client "kicken" - Added by achristian 11 months ago
Ich sehe momentan noch ein Problem:
Wie bekommt der Client den Kick möglichst sauber mit? Erste naive Idee wäre, neben dem ClosedListener Interface, noch ein eine Art "KickedListener" anzubieten, welches der Client implementieren und registrieren kann. Aber besonders gut gelöst ist das irgendwie nicht. Ich werd' da mal weiter überlegen und grübeln müssen um das möglichst geschickt einzubauen. Denkbar wäre auch das aufbohren des ClosedListener Interfaces. Nur damit wird die Version wohl inkompatibel (was aber aufgrund des Versionssprungs von 1.1.x auf 1.2.x vertretbar wäre)...
Weitere Ideen sind willkommen...
Gruß
Alex
RE: Client "kicken" - Added by sich 11 months ago
Moin,
das mit dem aufbohren des ClosedListener, ist auch die Variante an die ich erstmal gedacht habe. Hatte gestern Abend auch noch mal so ein wenig überlegt, wie man das sonst noch umsetzen könnte, bin aber irgendwie immer bei nem Observer/ Listener gelandet... Es gibt ein Event das sagt: "Hey Client du bist gekickt".. Falls mir doch noch eine Idee kommt bist du der erste dem ich sie sage ;-)
Gruß
Sich
RE: Client "kicken" - Added by sich 11 months ago
Moin,
habe das jetzt so implementiert wie du es in deiner ersten Antwort aufgezeigt hattest. Es klappt auch so. Also hat sich mit diesem "Workaround" mein Problem gelöst, also danke für deinen Tipp.
Jetzt warte ich natürlich gespannt auf die 2.0 Version von SIMON.
Gruß
Sich
RE: Client "kicken" - Added by achristian 11 months ago
Prima. Wieder ein Problem gelöst. Version 1.2.0 wird wohl noch ein weilchen (nachwuchsbedingt) dauern.
Gruß
Alex
RE: Client "kicken" - Added by NegroManus 2 months ago
Gibt es zu diesem Thema eigentlich Neuigkeiten?
Version 1.2.0 ist ja derzeit veröffentlicht, aber mir ist noch kein Weg aufgefallen, das anders als du im 2. Posts schriebst, zu machen.
RE: Client "kicken" - Added by achristian 2 months ago
1.2.0 gibt's aktuell nur als SNAPSHOT. Snapshots sind keine Stable-Releases. SNAPSHOT bedeutet: Noch nicht fertige Entwickler-Version.
Bin noch nicht dazu gekommen weitere features zu implementieren. Bedingt durch die Faschingszeit (aktiver Karnevalist), Krankheit und Beruf bin ich noch nicht dazu gekommen... Steht aber noch auf dem Plan.
(1-10/10)