# RMI - Verständnisfragen



## HerrVorragend (18. Jun 2009)

Hi,

an der Universität nehme ich in einer Gruppe an einem Softwareentwicklungsprojekt teil. Zu programmieren ist ein System mit Server und Client, die per RMI kommunizieren, wobei der Client ein Thin-Client ist, d.h. möglichst viele Funktion im Server sein sollen.

Unsere Aufgabe ist es nun anhand eines UML-Entwurfdokuments den Server zu programmieren, sodass der Client, den die Betreuer programmiert haben und uns unbekannt ist, später genau drauf passt.

In dem UML-Dokument ist nun eine Klasse NanoHTTPD abgebildet. Also habe ich mich schlau gemacht im Internet und bin bald auf die codebase bzgl. RMI gestoßen. Dazu habe ich weitere Tutorials gelesen und weiß nun, dass man den Webserver dazu braucht, damit sich der Client, sobald er (serialisiert) ein Objekt vom Server erhalten hat, anhand der Codebase die zugehörige .class-Datei herunterlädt. Stimmt das soweit?

Meine Fragen nun:
- Wieso braucht er die class-Datei, wenn er doch das Objekt schon hat? (Quelle: Jini Planet: How Codebase Works)
- Wie funktioniert das mit MySQL-Abfragen? Die müssen ja auf dem Server ablaufen, aber wie kommunizieren die Methoden in dem Objekt, das nun auf Client-Seite ist, wieder mit dem Server?
- Die Webserver (hier ist NanoHTTPD vorgegeben) ist nur dazu gut, um dem Client die angeforderten Dateien zu liefern, richtig? D.h. ich kann davon ausgehen, dass der Client das HTTP-Protokoll benutzt?
- Muss ich auf dem Client irgendwas vornehmen (außer lookup) oder läuft dieses Nachladen automatisch ab (ich frage, weil ich einen Testclient schreiben will, um sicher zu sein, dass die RMI-Sachen klappen)?

So, das wars erst mal. Wäre super, wenn mir jemand helfen würde, am best recht zeitnah, weil wir einen festen Abgabetermin haben.

Danke und Gruß


----------



## HerrVorragend (19. Jun 2009)

Hi,

ich bin jetzt schon mal zumindest ein wenig weiter.
Nun ist mir klar, dass man serializable-Objekte und remote-Objekte unterscheiden muss. Die Klassen, die auf die Datenbank zugreifen, sollten von remote erben, damit sie nicht übertragen werden. Die Ergebnisobjekte können jedoch von serializable erben, da sie nur ein paar Parameter enthalten, und können somit problemlos übertragen werden. Ist das soweit richtig?
Bliebe noch die Frage, wozu die class-Datei noch übertragen werden muss. Ich dachte beim Übertragen wird das Objekt komplette serialisierte Objekt übertragen und dann auf Clientseite wieder deserialisiert, dann hat der Client doch alles, was er braucht, oder nicht?


----------



## SlaterB (19. Jun 2009)

in der Serialisierung sind die Klassen nicht vorhanden, nur die Daten,
stell dir eine Klasse mit 1000 Zeilen Code aber nur zwei int-Werten vor, soll die jedes mal mit 50 KB übertragen werden?

siehe auch den von die geposteten Link


> When the sender of an object serializes that object for transmission to another JVM, it annotates the serialized stream of bytes with information called the codebase. This information tells the receiver where the implementation of this object can be found.
> [..]
> The actual information stored in the codebase annotation is a list of URLs from which the classfile for the needed object can be downloaded.


wenn da überhaupt was drin ist, dann der Klassenname/ URL oder so


----------



## HerrVorragend (19. Jun 2009)

Okay, danke, also werden beim Serialisieren nur die Objektvariablen übertragen und der Client holt sich selbst die class-Datei, in der der restliche Aufbau der Klasse steht (sofern er sie noch nicht hat), um dadurch dann das komplette Objekt zusammenzubauen. Und damit der Client die Klasse anfordern und erhalten kann brauche ich den Webserver, die einfach nur die angefragte Klasse per HTTP schickt.

Habe ich es nun richtig verstanden?


----------



## SlaterB (19. Jun 2009)

das mit dem WebServer kann ich nicht bestätigen,
wenn Daten mit RMI übertragen werden können, dann auf diesem Weg vielleicht auch die .class-Datei,
wichtig wäre aus meiner Sicht, dass das nur einmal passiert wenn nötig, nicht bei jeder Objektübertragung

vielleicht benutzt aber RMI selber HTTP, solche Details möchte ich nicht überzeugend kommentieren


----------

