[QUOTE=Unregistriert]Hey danke für die Antworten
Ich hab die ganze zeit das Problem im Kopf:
wenn jemand den Java code verändert - also beim client
und der server eine methode beim client aufruft dann kann alles mögliche passieren
also könnte er auch ein Thread.sleep(10000000000…) ein bauen
und der Server würde dann auch ewig warten.
[/quote]
Bei RMI wartet der wohl ewig. Ja. Das passiert bei SIMON nicht. Denn hier ist ein fest eingestellter Timeout vorhanden, so dass Methodenaufrufe zwar verdammt lange, aber nicht ewig dauern können (aktuell 1h). Und wenn dir eine Stunde zu viel ist, kannst du das noch selbst einstellen.
Das starten in einem extra Thread finde ich auch unsauber da ich den Thread ja auch irgentwie beenden will.
Threads lassen sich prima beenden. Du musst nur eine Abbruchbedingung einbauen. die Sache mit stop() ist bei einem Thread aber mit Vorsicht zu genießen.
Un RMICalls sind auch schwer abzubrechen
Afaik lassen die sich gar nicht abbrechen. Ebensowenig wie sich ein Methodenaufruf abbrechen lässt. Mir RMI hat das erstmal nix zu tun. Du musst nur schauen dass du sauber entwickelst und hier und da abbruchbedingungen einbaust.
Den Callback brauche ich um dem Client mitzuteilen das isch etwas verändert hat.
z.B: JETZT IST EINE NEUE NACHRICHT DA, JETZT STARTET DAS GAME, JETZT BRAUCHE ICH EINEN ZUG VON DIR
Eben wofür man Callbacks so einsetzt.
Das mit den Nachrichten kann ich durch polling lösen. Habe mir das so vorgestellt.
Der Client ruft getNachrichten auf und diese Methode liefert die aktuelle Nachrichten zurück
wenn keine Nachrichten vorhanden sind wird ein wait() auf gerufen und solange gewartet bis wieder eine nachricht da ist
Die Methode wird in einem Thread Beim client in einer endlos schleife aufgerufen
Mit den anderen Sachen hab ich mir des auch so vorgestellt.
Somit brauche ich garkeine callbacks mehr(hoffentlich) und somit werde ich auch keine probleme mit der FIREWALL bekommen.
Wozu der Stress? Dir geht’s doch hauptsächlich um die Sache mit dem durch den CLient blockierenden Thread am Server, oder?
In diesem Fall kann der Server über einen Callback eine Nachricht dem Client schicken. Die Nachricht wird aber mit dem Mehtodenaufruf nicht verarbeitet, sondern zur Verarbeitung in eine Liste/Queue gesteckt. Ein Thread im Client bearbeitet dann zyklisch/der Reihe nach alle Nachrichten die er in der Queue findet. Gibts gerade keine Nachrichten schläft der Thread. Gibt’s wieder neue Nachrichten, wird beim einfügen der Nachricht in die Queue der Thread wieder aufgeweckt.
Damit hast du kein lästiges Polling, der Client zwing den Server nicht zum schlafen weil er für die Verarbeitung lange bracht, und die hast nahezu 0 Zeitversatz (den du mit Polling hättest).
Okay, dann könnte man auf Clientseite immer noch den Code verändern und mutwillig ein Sleep von drölf trillionen Jahren einbauen. Aber da ist es wohl einfacher den Server anders in die Knie zu zwingen als da am Code rum zu fummeln.
Das einzigste Problem: wenn ich den server beenden will muss ich die ganzen poll mehtoden sauber beenden. Da ich das LockObject mit notifyall() aufwecken muss und danach die methode stoppen.
Was ist daran jetzt genau das Problem?
EINE FRAGE BLEIBT. Wenn der Client eine poll methode aufruft hängt er ja auch fest bis er eine antwort bekommt.
Wenn der client aber beenden will muss ich den thread irgentwie stoppen. Da dieser Thread aber einen RMI Call ausführt kann ich ihn nicht einfach interrupten oder?
Du verstrickst dich in was. Siehe meine letzter Lösungvorschlag.
Gruß
Alex
P.S. Oder nimm SIMON. Da hast du dein Timeout drin …