Small logo of ETH main building ETH Zurich : Computer Science : Pervasive Computing : Distributed Systems : Education : DS WS 2005/2006

Verteilte Systeme

Hinweise zum RMI Teil der Übung 2

rmic

Falls es auf den Linux PCs beim Aufruf von rmic zu seltsamen Fehlern kommt, dann wurde das rmic Tool der GNU GCJ Umgebung gestartet. Dies lässt sich durch das explizite Aufrufen des rmic Tools des Sun JDK 1.4 beheben: rmic-1.4.2

(Ab Java Version 1.5 ist es nicht mehr nötig Stubs mittels rmic zu erzeugen.)

Der Client und die Stub Klassen.

Damit die RMI Aufrufe funktionieren können, benötigt der Client die generierten Stub Klassen. Hierfür gibt es 2 Möglichkeiten die nicht vermischt werden sollten:
  • Die erste und einfachste ist, wie in der RMI Einführung beschrieben, dass der Client die Stub Klassen schon im eigenen CLASSPATH hat, weil er im gleichen Verzeichnis wie der Server gestartet wird.
  • Oder der Client lädt die Stub Klassen über RMI dynamsich nach. Siehe hierzu die nächste Sektion.
Wir sind mit beiden Varianten zufrieden.

Dynamische Nachladen der Stubs

Beim dynamischen Nachladen der Stub Klassen zeigt sich die Mächtigkeit von RMI. Damit dies funktioniert müssen jedoch ein paar Dinge beachtet werden und zum Teil anders als in der RMI Einführung gemacht werden. Speziell muss ein Security Manager gesetzt werden und diesem das dynamische Laden von Bytecode erlaubt werden.
  • Die rmiregistry muss in einem Verzeichnis ohne .class files gestartet werden
  • Beim Aufruf des Servers wird der angegeben, welche Klassen geladen und per RMI auch dem Client Übertragen werden. Hierzu braucht es eine gültige URL unter der die Klassen verfügbar sind, z.b. https://... für den Zugriff über das HTTP-Protokoll. Wenn gerade kein Webserver zur Verfügung steht, kann man aber auch eine file://... URL angeben. Diese sollte dann jedoch absolut sein, oder zumindest aus Sicht von Client und Server korrekt sein. Beachte die Anzahl der '/' in der URL. Bei einem absouten Pfad kommt zu den beiden '//' der URL noch ein '/' vom Pfad.
    Starten des Servers:
    java -Djava.rmi.server.codebase=file:///home/nethzaccount/RMI-aufgabe/ Server
  • In der Client Anwendung muss zuerst ein RMISecurityManager instantiiert werden:
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
    
  • Beim Client muss es eine Java Security Policy Datei geben, welche beim Start als Parameter angegeben wird. Es kann die Datei java.policy mit folgenden Inhalt verwendet werden:
    grant {
        permission java.security.AllPermission;
    };
    
  • Aufruf des Client mit Angabe der java.policy Datei:
    java -Djava.security.policy=java.policy Client
ETH ZurichDistributed Systems Group
Last updated June 20 2023 01:44:59 PM MET msr