# RMI: Wieviele Clients können sich gleichzeitig anmelden?



## Angel4585 (24. Nov 2007)

Hallo,

ich möchte eine RMI Anwendung entwickeln, würde aber gerne wissen wieviele Clients zur gleichen zeit drauf zugreifen können ohne das sich die Serveranwendung verabschiedet oder sonst was in der Art.


----------



## trazzag (24. Nov 2007)

probier's aus ;-)


----------



## stevieboy (24. Nov 2007)

Ich habe bisher noch nichts von einer Begrenzung gelesen.

Ich denke eher, dass die Updategeschwindigkeit der Clients ab einer bestimmten Zahl einfach in die Knie gehen wird - das musst Du, wie trazzag schon sagte, einfach ausprobieren.

Was willst Du denn aufsetzen? Vielleicht wäre bei einer hohen Anzahl von Clients eine Socket-Verbindung eher angebracht?!


----------



## Angel4585 (26. Nov 2007)

Es soll ein kleines Onlinegame werden, ein Fussballmanager.
Ich weis nochnicht wieviele Clients ich überhaupt pro Server/Welt zulasse, aber wenn es ein paar Tausend wären, wäre das schonmal gut.


----------



## stevieboy (26. Nov 2007)

Ich glaube,dann würde ich es nicht mit RMI sondern mit Sockets realisieren. (Fühlt sich richtiger an. Sorry, eine bessere Begründung habe ich nicht.)


----------



## trazzag (26. Nov 2007)

Bei einem derartigen Online-Game, würde es sich da vllt. nicht anbieten, daß ganze einfach als Browsergame zu konzipieren? Dann würdest du auch um RMI herum kommen...


----------



## Angel4585 (26. Nov 2007)

Browsergames gibt es schon sooo viele, ich möcht einfach ein Clientgame machen 
Ausserdem stell ich mir ein 2D-Spiel wo sich evtl die Spieler als Punkte übers Feld bewegen in php schwierig vor 

Wenn ich das Ganze mit Sockets mach, muss ich mir wieder ein Protokoll ausdenken, RMI arbeitet im Hintergrund ja auch nur mit Sockets, kann ich das doch direkt nehmen.


----------



## tuxedo (26. Nov 2007)

Bei RMI gibt es AFAIK keine Clientbegrenzung. Windows begrenzt aber von Haus aus die ANzahl der offenen Verbindungen. D.h. wenn du den RMI-Server/RMI-Registry auf einer Windows-Maschine laufen lässt, solltest du mit XP AntiSpy über's Menü die Anzahl der gleichzeitigen Verbindungen hochsetzen. 

Und noch was:

Wenn du in RMI eine Callback-Funktion (Server ruft Methoden auf dem Client auf) drin hast, dann kriegst du Probleme wenn sich deine Clients hinter einem Router befinden. Besser wäre es für diesen Fall die Clients ein polling ausführen zu lassen: AM Server immer mal wieder anfragen, statt dass der Server sich selbstständig bei den Clients meldet.

Da mir das mächtig auf den Zeiger geht, hab ich mich schon drangesetzt ein eigenes RMI zu basteln, das dieses Problem nicht hat. Bin aber noch lange nicht fertig ;-(

- Alex


----------



## Angel4585 (26. Nov 2007)

Wäre in diesem Zusammenhang "WebStart" ein Thema? Was genau macht das? Also wie arbeitet das?


----------



## tuxedo (26. Nov 2007)

Soll ich dir jetzt Webstart erklären? Denke da hast du schneller gegoogelt und gelesen als ich getippt.

- Alex


----------



## Angel4585 (26. Nov 2007)

Also wirklich verstanden hab ich das gegoogelte nicht, nur das immer die aktuellste Version vom Server geladen wird, was schonmal sehr gut klingt.

Aber wie kommuniziert diese Anwendung jetzt mit dem Server?
Wie ich das verstanden habe ist das imemrnoch ne ganz normale Client/Server Anwendung, was heisst das es an meinem ursprünglichen problem nichts ändert.


----------



## tuxedo (26. Nov 2007)

Na und wo ist jetzt das Problem wenn du alles verstanden hast?

Webstart hilt nur "bei der beschaffung der Anwendung" und achtet halt auf neue Versionen etc.

Mit "Netzwerk" und RMI hat das ja sogesehen nix zu tun. Und mit der von Windows begrenzten Anzahl von gleichzeitigen Netzwerkverbindungen hat das auch nix zu tun. Und mit deiner Frage, die ja schon beantwortet wurde, hat das auch nix zu tun.

Also entweder steh ich jetzt ganz gewaltig auf dem Schlauch oder du... ;-)


----------



## Angel4585 (26. Nov 2007)

Ne ich hab irgenwo was gelesen vonwegen Anwendungen direkt  auf Server ausführen usw. aber ich glaub da war was anderes gemeint


----------



## tuxedo (26. Nov 2007)

Ja, das Wörtchen "Server" hat vielerlei Bedeutung ;-)

Mit welchem Betriebssystem soll denn dein RMI-Server laufen? Windows oder Linux oder was anderes?

- Alex


----------



## Angel4585 (26. Nov 2007)

Windows und Linux sollten gehen, momentan entwickle ich auf Windows, aber es soll später mal auf Linux laufen


----------



## tuxedo (26. Nov 2007)

Bei Windows halt einfach die Sache mit der limitierten Verbindungsanzahl und XP AntiSPy im Hinterkopf behalten.


----------



## Angel4585 (27. Nov 2007)

Aber wie ist das jetzt genau mit dem Routern wenn ich vom Server was auf dem Client mache?

Ich mein ich geh ja schon über den DSL-Router ins INet, meinst du das? Weil das wär bissl blöd..


----------



## tuxedo (27. Nov 2007)

Wenn du dem Server bei einem Methodenaufruf ein Callback-Objekt gibst, mit dem der Server Methoden der Callback-Klasse auf dem Client ausführen kann, DANN gibts "Probleme" mit Clients die sich hinter einem Router (NAT) befinden. 

Du kannst das Problem umgehen, indem du kein Callback nutzt, und den Client stattdessen den Server immer wieder fragen lässt: "Gibt's was neues was mich interessieren könnte?". Also ruft beispielsweise der Client immer wieder eine Methode "getEvents()" auf, welche dann eine Liste mit noch nicht abgeholten Events enthält. Wie die Events aussehen ist deine Sache ;-)

- Alex


----------



## Angel4585 (27. Nov 2007)

Alternative wäre ein eigenes Protokoll mit SocketChannel etc oder?


----------



## tuxedo (27. Nov 2007)

Jepp. Aber SocketChannel _muss_ nicht unbedingt sein. Normale Sockets tuns auch (RMI nutzt auch nur normale Sockets). Oder du bastelst dir dein eigenes RMI ... Hab wie gesagt schon angefangen mit Proxyklassen etc. "Normale RMI" Funktion hab ich shcon hinbekommen. Fehlt nur noch das mit den Callbacks über ein und dieselbe Socket-Verbindung. Ist etwas knifflig, aber durchaus machbar. Werde mich nach meiner Diplomarbeit da nochmal dransetzen ...

Bei RMI hat man nämlich das Problem, dass zum Teil mehrere Verbindungen aufgebaut werden. Unter anderem auch eine für den Callback. Und da baut der Server zum client eine Verbindung auf. Das lässt den Client dann quasi auch zum Server werden. Und am Router des Clients bleibt dieser Verbindungsaufbau dann hängen.


----------



## Angel4585 (27. Nov 2007)

Ich versteh schon das und warum es mit dem Callback nich funzt.

SocketChannel war doch von Vorteil dacht ich, weil nicht pro Client ein Thread  erzeugt wird.

Nur wie schicke ich Objekte? Ich kann da doch nur Strings verschicken..


----------



## tuxedo (27. Nov 2007)

Schonmal was von ObjectOutputStream gehört? Oder von DataOutputStream? Oder von "serialisieren"?

Basieren tut alles auf "einfachen" InputStream und OutputStreams. Beide "transportieren" Bytes. Darauf aufbauend kannst du Streams drüberlegen die gleich ganze Objekte oder Variablen verarbeiten.

Vielleicht wär's für dich einfacher doch bei RMI, nur halt ohne aktives Callback, zu bleiben....

- Alex


----------



## Angel4585 (27. Nov 2007)

Ich bin einfach noch Java Anfänger, aber ich lerne dazu, also werd ich mir die Teile mal anschaun 

Das Problem für mich ist nur: Java besitzt soviel zeug, das kann man nich gleich alles auf Anhieb kennen.


----------



## tuxedo (27. Nov 2007)

Ne, aber man kann logisch kombinieren ;-) Was wäre Java für eine Sprache wenn man nur Strings übers Netz schicken könnte ;-)


----------



## Angel4585 (27. Nov 2007)

Vorallem wenn man soo mit Internet usw prahlt 
Naja aber ich programmiere jetzt seit 2 Jahren jeden Tag im Betrieb, bisher halt nur Delphi, da ist Java schon ne ordentliche Umstellung


----------



## HoaX (27. Nov 2007)

naja, so viel anders ist delphi nun auch wieder nicht


----------



## tuxedo (27. Nov 2007)

Auch in Delphi wird es Streams geben. Und auch in Delphi wird man nicht nur Strings senden ;-)


----------



## DocRandom (27. Nov 2007)

..jup und es gibt dort auch Serialisierung! 

lg
DocRandom


----------



## tuxedo (27. Nov 2007)

Sachen gibts ;-) ...


----------



## Angel4585 (27. Nov 2007)

dort habe ich aber auch noch nix mit sockets etc gemacht, da hab ich db-anwenudngen gemacht usw, aber keine client server geschichten


----------



## tuxedo (27. Nov 2007)

Wenn du aber von einer "Umstellung" redest, geht man eigtl. davon aus, dass du "die eine Seite" (in diesem Fall Delphi) schon kennst ;-) 

Aber da du ja in Delphi auch noch nix mit Sockets gemacht hast, ist es ja keine Umstellung ;-) Okay, genug mit dem "kleinkarierten" ...

- Alex


----------



## Angel4585 (27. Nov 2007)

Ich zieh mir jetz einfach mal den ObjectOutputStream und den ObjectInputStream rein.

Stimmt das, dass ich das über 

ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(new MyObject());

usw realisiere? Also stimmt mein Anfang schonmal?


----------



## tuxedo (27. Nov 2007)

korrekt.


----------



## Angel4585 (22. Dez 2007)

Hier mal ein Links zu RMI Clallbacks: http://java.sun.com/developer/onlineTraining/rmi/RMI.html#RMIClientSideCallbacks
Da steht au bissl was über die geschichte mit Firewalls. Stichwort: HTTP-Tunnel


----------



## tuxedo (23. Dez 2007)

Wobei der HTTP Tunnel doch sehr langsam sein dürfte ... Zumal das einrichten mit dem CGI-Teil glaub nicht ganz trivial ist. "Nach meinem Geschmack" ist das jedenfalls nicht so der Bringer.


----------

