UNIVERSITÄT LEIPZIG. Mainframe Internet Integration SS2013. Java Remote Method Invocation RMI Beispiel

Ähnliche Dokumente
Remote Method Invocation

Remote Method Invocation

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

Java-Programmierung. Remote Method Invocation - RMI

7.1.5 Java RMI Remote Method Invocation ( (

Programmieren II. Remote Method Invocation (RMI) Heusch -- Ratz. Institut für Angewandte Informatik

Java RMI Remote Method Invocation

Konzepte von Betriebssystem-Komponenten Middleware RMI

Kurzanleitung RMI-Beispiel: gettime Seite 1 / 7. RMI Projekt gettime 1

Java Remote Method Invocation (RMI)

Remote Method Invocation

7 Remote Method Invocation (RMI)

8.1.5 Java RMI Remote Method Invocation

9. Remote Method Invocation Grundlagen der Programmierung II (Java)

B Java RMI B.2 B.4. 1 Java. 1.2 Methoden. 1.1 Objekte (2) 1.1 Objekte. Objektorientierte Sprache. Klassenbeschreibung. Methode ist eine Art Funktion

Remote Methode Invocation (RMI) ETIS SS05

Client/Server-Programmierung

Client/Server-Programmierung

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

RMI Server und Client

Mobile und Verteilte Datenbanken

Musterlösung Übungsblatt 2 Netzprogrammierung WS 05/06

Praktikum aus Softwareentwicklung 2, Stunde 8

Grundlagen verteilter Systeme

Übung zur Vorlesung "Einführung in Verteilte Systeme"

-Testen verteilter Anwendungen

Mobile und Verteilte Datenbanken

Komponententechnologien Winter 2016/17. Komponenten. 2. Die Anfänge. Peter Sturm, Universität Trier 1

Internetanwendungstechnik (Übung)

JAVA Remote Method Invocation JRMP Tutorial

4. Informatiktag NRW Projekt online Shop. Barbara Leipholz Schumacher Euregio Kolleg, Würselen

Themen. Web Service - Clients. Kommunikation zw. Web Services

Verteilte Systeme. Verteilte Objektorientierte Systeme I. Prof. Dr. Oliver Haase

Inhalt. Übung zur Vorlesung "Einführung in Verteilte Systeme" Das RMI-Schichtenmodell. Java Remote Method Invocation. Wintersemester 2004/05

Remote- und Server-Programmierung. Dr. Wolfgang Süß Thorsten Schlachter

Praktikum Verteilte Anwendungen

Programmieren II. Remote-Programmierung. Institut für Angewandte Informatik

Netzprogrammierung: Java RMI - Remote Method Invocation (Teil 1)

Janeva:.NET meets J2EE

Client/Server-Systeme

Remote Method Invocation (RMI)

Middleware. im Schweinsgalopp

J Fernmethodenaufrufe Remote Method Invocation (RMI)

Laborübung zu Verteilte Systeme : Aufgabe zu Java-RMI (1)

KAPITEL 1 RMI Verteilte Programmierung unter JAVA von Anja Austermann

Überblick. Middleware - Übung. Model-View-Controller. Entwurfsmuster (Design Patterns)

UNIVERSITÄT LEIPZIG. Mainframe Internet Integration SS2013. Java Remote Method Invocation Teil 2 RMI

Netzprogrammierung: Java RMI - Remote Method Invocation (Teil 2)

Mainframe Internet Integration. Prof. Dr. Martin Bogdan Prof. Dr.-Ing. Wilhelm G. Spruth SS2013. WebSphere Application Server Teil 4

JAVA Remote Method Invocation RMI/IIOP Tutorial

10.1 Remote Method Invocation (RMI)

1. Sie können die zentrale Idee und Bedeutung einer Schnittstelle, wie sie schon im RPC verwendet wird, erklären.

Kapitel 6: Verteilte Objekte durch RMI. Middleware in Java vieweg 2005 Steffen Heinzl, Markus Mathes

Klausur zur Vorlesung Einführung in Verteilte Systeme WS 05/06 Prof. Dr. Odej Kao 3. Februar 2006

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

RMI. Wir haben. Komponenten auf einem Rechner. Remote Method Invocation

Überblick. Class-Objekte. Bietet die Möglichkeit das Laufzeitverhalten von Applikationen zu analysieren und es gegebenenfalls sogar zu beeinflussen

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

CORBA-Konzept. Ziele. Common Object Request Broker Architecture CORBA. Plattformunabhängige Kommunikation Transparente Verteilung von Objekten

Java in Verteilte Systeme - RMI

Javakurs für Anfänger

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

C Java RMI. 1 Java. Objektorientierte Sprache

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Implementierung III. Implementierung IV

1 Abstrakte Klassen, finale Klassen und Interfaces

7 Praktische Aspekte (Wie mache ich...)

Client/Server-Programmierung

3 Objektorientierte Konzepte in Java

Oracle & Java HOW TO

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

H.2 Distributed Events

36.2 Example ClassLoader Example Appletviewer

Implementierung IV: Schnittstelle zur Umgebung. und. Integration und Test

Java in Verteilte Systeme

Szenario 3: Service mit erweiterter Schnittstelle

Einführung in die Programmierung 1

E.1 Object Request Brokers

Kommunikation. Björn und Georg

Warum EJB Technologie (1)?

Klausur zur Vorlesung Einführung in Verteilte Systeme WS 05/06 Prof. Dr. Odej Kao 30. März 2006

Übungen zu Verteilte Systeme : Aufgabe zu Java-RMI (1)

Grundlagen verteilter Systeme

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Ausnahmebehandlung. Ausnahmen werfen (auslösen) Eigene Ausnahmen definieren. Ausnahmen abfangen. Ausnahmen definieren

Client/Server-Systeme

Variablen manipulieren per JDI

Enterprise JavaBeans Überblick

Handbuch für die Erweiterbarkeit

3 Objektorientierte Konzepte in Java

Java Remote Methode Invocation - RMI Praxis

Remote Method Invocation

12 Abstrakte Klassen, finale Klassen und Interfaces

Verteiltes Rechnen. Verteilte Dienste mit Java Remote Method Invocation (RMI). Prof. Dr. Nikolaus Wulff

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Einführung in die Programmiersprache Java II

Eclipse Tutorial.doc

14 Abstrakte Klassen, finale Klassen, Interfaces

Transkript:

UNIVERSITÄT LEIPZIG Mainframe Internet Integration Prof. Dr. Martin Bogdan Prof. Dr.-Ing. Wilhelm G. Spruth SS2013 Java Remote Method Invocation RMI Beispiel el0100 copyright Abt. Technische Informatik, Institut für Informatik, Univ. Leipzig wgs 04-11

RMI Tutorial Was hier folgt, ist ein RMI Tutorial. Es ist nicht abgabepflichtig und wird hier aufgeführt, um ggf. Ihr Verständnis zu verbessern. Falls Sie Lust haben, können Sie es auf Ihrem PC implementieren. Ein Zugriff auf z/os ist nicht vorgesehen.

Ein einfaches RMI Beispiel Wir implementieren als ein einfaches Beispiel die folgende Anwendung. Client Server Registry Ein Klient sendet eine Anfrage an ein Server Objekt. Dieses erzeugt eine Antwort und sendet sie an den Klienten zurück. Damit der Klient das Server Objekt finden kann konsultiert er einen Namensdienst, die Java Registry. Normalerweise laufen Klient und Server auf getrennten Rechnern, die über ein TCP/IP Netz miteinander verbinden sind. In unserem einfachen Fall laufen sie als getrennte Prozesse in getrennten virtuellen Adressenräumen auf dem gleichen Rechner. Das Klientenprogramm QuadratClient sendet eine Ziffer an den Server. Dieser multipliziert die Ziffer mit sich selbst und sendet das Ergebnis zurück an den Klienten. Dieser gibt das Ergebnis auf dem Bildschirm aus.

Die Objekt-Registrierung rmiregistry Wie bekommt ein Client Zugriff auf ein Quadrat-Objekt? Wir wissen: Stub für Client, Skeleton für Server. Der Server muss das Skeleton unter einem (möglichst eindeutigen) Namen bei einer rmiregistry anmelden. Diese rmiregistry muss auf demselben Rechner laufen, auf dem das Remote-Objekt (Skeleton) ausgeführt wird! Der Client muss 1. den URL der rmiregistry kennen, von der er einen Stub des Objekts bekommen kann (z.b. : rmi://jedi.informatik.uni-leipzig.de:4711, und 2. den Namen des Objekts kennen, unter dem der Stub bei der Registry bekannt ist.

Vorgehensweise und Programmstruktur (1) In unserem Beispiel fordert ein Klient das Quadrat einer (Biginteger-) Zahl von dem Server an. Dies geschieht, indem er eine Methode Quadrat(BigInteger ) des Servers mit Benutzung der entfernten Referenz eines Serverobjekts aufruft. Auf der Seite des Servers werden wir dann die folgenden Schritte durchführen: 1. Eine Quadrat Schnittstelle (Quadrat.java) definieren; 2. Eine QuadratImpl Klasse (QuadratImpl.java) schreiben, welche die Quadrat Schnittstelle implementiert; 3. Eine Server Klasse (QuadratServer.java) mit einer main() Funktion für die Erzeugung des entfernten Objektes und seine Anbindung an das RMI-Registry schreiben.

Vorgehensweise und Programmstruktur (2) Interface Implementierung Client Server Unsere Anwendung heist Quadrat und besteht aus 4 Java Programmen: Quadrat.java QuadratImpl.java QuadratServer.java QuadratClient.java Sie bewirkt folgendes: Die File Quadrat.java definiert das entfernte Objekt. Es ist möglich, die Server Funktionen einer einzigen Klasse mit einer main() Funktion zu vereinigen. Die Aufteilung hat den Vorteil, dass mehrere entfernte Objekte mit einer main() Funktion erzeugt werden können. Die entfernte Interface implementiert QuadratImpl.java. Die Klasse QuadratImpl.java soll als Vorlage für die Erzeugung von Skeleton und Stub dienen und benutzt dafür die in Quadrat.java definierte Schnittstelle. Die Klasse QuadratServer.java soll eine main()-funktion beinhalten mit folgenden Aufgaben: Einen RMISecurityManager erzeugen und installieren und das entfernte Objekt bei der rmiregistry registrieren

Definition einer entfernten Schnittstelle Damit der Client eine entfernte Methode nutzen kann, muss er ein Stellvertreterobjekt befragen. Dieses packt die Daten ein und übermittelt sie. Diese Hilfsfunktionen sollen automatisch generiert werden. Damit der Generator korrekten Quellcode für die Übertragung erstellen kann, ist eine Beschreibung nötig. Die Definition muss die Signatur eindeutig spezifizieren, und damit weiß der Client, wie die Funktion aussieht, die er aufrufen kann, und der Server kann die Methode dann beschreiben. Normalerweise gibt es für die Spezifikation der entfernten Funktionen spezielle Beschreibungssprachen (wie IDL bei CORBA), doch bei RMI reicht es, ein Java-Interface mit den Methoden zu definieren.

Interface Quadrat.java Entfernte Methoden werden durch das Interface java.rmi.remote definiert: // Interface import java.rmi.*; import java.math.biginteger; public interface Quadrat extends Remote { public BigInteger quadrat(biginteger n) throws RemoteException; } Die entfernten RMI-Klassen sind durch Schnittstellen spezifiziert, welche java.rmi.remote erweitern sollen. In einer entfernten Schnittstelle werden die Methoden deklariert, die man von anderen Java Virtuellen Maschinen aufrufen kann. Für unser Beispiel definieren wir eine einzige Schnittstelle Quadrat, für die wir die Methode Quadrat(BigInteger ) deklarieren. Die Schnittstelle muss public sein, damit Klienten Zugang auf sie haben können. Eine RemoteException kann z.b. bei Kommunikations-fehlern auftreten: wenn das entfernte Objekt nicht mehr verfügbar ist, wenn das Netz gestört ist.

Eigenschaften der Schnittstellen-Beschreibung Wir können mehrere wichtige Eigenschaften der Schnittstelle feststellen: Die entfernte Schnittstelle ist öffentlich. Wenn sie nur paket-sichtbar oder eingeschränkter ist, kann der Client die entfernte Methode nicht finden, wenn er danach verlangt. Die eigene Schnittstelle erweitert die Schnittstelle Remote. Nur die Klassen, die Remote implementieren, können entfernte Methoden anbieten. Remote ist allerdings leer und damit eine Markierungsschnittstelle. Die angebotenen Methoden können nicht beabsichtigte Fehler auslösen, zum Beispiel, wenn das Transportsystem zusammenbricht. Für diesen Fall muss jede Methode RemoteException in einer throws-anweisung aufführen. Eine entfernte Funktion darf Parameter besitzen. Sind die Argumente primitive Werte, so werden diese einfach übertragen. Handelt es sich um Objekte, so müssen diese serialisierbar sein. http://www.galileocomputing.de/openbook/javainsel4/javainsel_18_004.htm#rxx365java18004040007541f015100

QuadratImpl.java // QuadratImpl.java, Quadrat implementation import java.rmi.*; import java.rmi.server.unicastremoteobject; import java.math.biginteger; import java.math.biginteger.*; public class QuadratImpl extends UnicastRemoteObject implements Quadrat { private int sum; public QuadratImpl() throws RemoteException { super(); } } public BigInteger quadrat(biginteger n) throws RemoteException { BigInteger res = new BigInteger("0"); res = n.multiply(n); return res; } Die QuadratImpl Klasse (QuadratImpl.java) implementiert die Quadrat Schnittstelle (Quadrat.java). Nur die in der entfernten Schnittstelle (Quadrat.java) deklarierten Methoden (hier quadrat(biginteger n) )können von Klienten aufgerufen werden. Server-Programme implementieren das Interface Remote und erweitern PortableRemoteObject, welches die wichtigsten Methoden für die Verwendung von RMI bereitstellt. Statt UnicastRemoteObject wird häufig PortableRemoteObject verwendet. PortableRemoteObject ermöglicht zusätzlich den Einsatz von RMI/IIOP.

Die Methoden des Servers werden letztendlich vom Client über die Stellvertreter genutzt. Der Server muss unterschiedliche Vorgaben erfüllen: Er muss eine spezielle Klasse erweitern, einen Konstruktor anbieten und die entfernte Schnittstelle implementieren. Dann kann ein Server-Objekt angemeldet werden. Das Server-Objekt implementiert daher die Geschäftslogik Da die Klasse eine Implementierung der Schnittstelle ist, geben wir ihr die Endung Impl. (Das ist eine bekannten Namensgebung aber keine Pflicht.) Die Implementierung erweitert die Klasse UnicastRemoteObject. Sie liegt im Paket java.rmi.server. Diese Klasse UnicastRemoteObject bietet Hilfe bei der Übertragung der Daten mittels Standard-TCP-Sockets an. Der Server kann so auf eingehende Anfragen reagieren und diese bearbeiten. Weiterhin zeigt UnicastRemoteObject an, dass ein Exemplar unserer Klasse existieren soll. Für den Konstruktor eines entfernten Objekts gelten zwei Eigenschaften: Wir müssen einen Standard-Konstruktor anbieten, und dieser muss ebenso wie die Methoden RemoteException anzeigen. public QuadratImpl() throws RemoteException { } Der Standard-Konstruktor ist notwendig, da eine Unterklasse genau diesen aufrufen möchte. Unser Konstruktor muss nichts machen. Er ruft aber automatisch den Konstruktor der Oberklasse auf, also den von UnicastRemoteObject. UnicastRemoteObject hilft bei der Übertragung; wenn ein entferntes Objekt konstruiert wird, dann bindet er diesen Dienst an einen anonymen Port und horcht auf einkommende Aufrufe. Wollten wir einen speziellen Port nutzen, müssten wir im Konstruktor unserer Unterklasse einen parametrisierten Konstruktor von UnicastRemoteObject aufrufen, der einen Port annimmt.

Im nächsten Schritt müssen die Methoden der Schnittstelle implementiert werden. Es steht frei, andere Methoden anzugeben, die nicht in der Schnittstelle vorgegeben sind, doch diese sind dann natürlich nicht nach außen sichtbar. public BigInteger quadrat(biginteger n) throws RemoteException { BigInteger res = new BigInteger("0"); res = n.multiply(n); return res; } Die Argumente und Rückgabewerte können von jedem beliebigen Datentyp sein.

RPC RPC RPC Service Service Service RPC Server andere Prozesse Betriebssystem Kernel Die RPC Services (RPC Dienstprogramme) können entweder in getrennten virtuellen Adressenräumen laufen, oder alternativ als Threads innerhalb eines virtuellen Adressenraums implementiert werden. Ein RPC Service wird auch als Implementation bezeichnet. Häufig Hunderte oder Tausende unterschiedlicher RPC Services auf dem gleichen Rechner. Der RPC Server stellt Verwaltungsdienste für seine RPC Services zur Verfügung, z.b. das Binding. Auf einem Rechner können mehrere RPC Server laufen, die z.b. unterschiedliche Arten von RPC Services gruppieren.

QuadratServer.java // QuadratServer.java import java.net.*; import java.rmi.*; import java.rmi.server.*; public class QuadratServer { public static void main(string args[]) { // Create and install the security manager System.setSecurityManager (new RMISecurityManager()); try { // Create QuadratImpl QuadratImpl QDR = new QuadratImpl(); Naming.rebind("Quadrat", QDR); System.out.println ("Quadrat Server ready."); } catch (RemoteException e) { System.out.println ("Exception: " + e.getmessage()); } catch (MalformedURLException e) { System.out.println(e); } } } Das Server-Programm enthält eine main()-funktion, die die ganze Anwendung startet. Ein QuadratImpl Objekt, das auf Abfragen von Klienten wartet, wird dabei erzeugt und mit einem Namen bei der Registry angemeldet.

Die java.rmi Package enthält eine Default Security Manager Implementierung die mit System.setSecurityManager(new RMISecurityManager()); installiert wird.

In unserer Serverklasse haben wir 1. einen security manager erstellt und installiert: System.setSecurityManager(new RMISecurityManager()); Ohne dies ist kein entfernter Methodenaufruf möglich. 2. eine Instanz eines entfernten Quadrat Objekts erstellt: QuadratImpl QDR = new QuadratImpl(); Dieses Objekt wird automatisch exportiert, da die Implementierungsklasse die PortableRemoteObject Klasse erweitert. 3. das entfernte Objekt beim Namensdienst mit der Methode rebind() eingetragen (mit dem RMI-registry registriert): Naming.rebind("Quadrat", QDR); Die Funktion rebind() bindet den Namen "Quadrat" an die Referenz des entfernten Objekts (der Name Quadrat wird mit dem Objekt QDR gebunden). Klienten können danach einen lookup nach dem Objekt mit diesem Namen ausführen und dadurch eine entfernte Referenz auf das Objekt erhalten.

QuadratClient.java // QuadratClient.java import java.rmi.*; import java.math.biginteger; public class QuadratClient { public static void main(string args[]) { BigInteger res; Remote remote = null; System.setSecurityManager (new RMISecurityManager()); //System.out.println (System.getSecurityManager()); try { remote = Naming.lookup("rmi://" +args[0]+ "/Quadrat"); Quadrat myqdr = (Quadrat) remote; System.out.println("OK"); BigInteger n = new BigInteger(args[1]); res =myqdr.quadrat(n); System.out.println(res); } catch(exception e) { System.err.println("System Exception" + e); } } } System.exit(0);

Das Klientenprogramm QuadratClient.java nimmt 2 Argumente auf der Kommandozeile auf: Den Namen der Servermaschine, wo das entfernte Objekt registriet ist, und die Zahl, von der das Quadrat berechnet soll Unser Klientenprogramm ist zunächst ein normales Java-Programm. Um die entfernte Methode Quadrat(Biginteger ) des Servers aufrufen zu können, werden wir in der entsprechenden main() Funktion die folgende Schritte durchführen: einen Securitymanager erstellen und installieren; einen lookup()-aufruf ausführen, um eine Referenz auf das entfernte Objekt zu bekommen: Naming.lookup("rmi://Serverhost/Quadrat"); Um nun die entfernte Methode zu nutzen, muss ein entferntes Objekt gesucht und angesprochen werden. Dazu fragen wir den Namensdienst. Der Name für das Objekt setzt sich zusammen aus der URL und dem Namen des Dienstes. Bei Port-Angaben dürfen wir nicht vergessen, diesen wieder hinter einem Doppelpunkt anzugeben. Der Typ des entfernten Objektes, den die Naming.lookup() Methode zurückgibt, muss der Typ der entfernten Schnittstelle Quadrat sein. In unserer Klientenanwendung werden die Adresse der Servermaschine in args[0], und die Zahl, von der das Quadrat berechnet soll, in args[1] eingegeben.

Vorgehensweise 1. Interface definieren, mit der das Remote Object aufgerufen wird. > extends interface java.rmi.remote. 2. Implementierung der Server Anwendung schreiben. Muss die Remote Interface implementieren.. > extends java.rmi.server.unicastremoteobject 3. Klassen kompilieren. 4. Mit dem Java RMI Compiler Client Stubs und Server Skeletons erstellen. > rmic xyzserverimpl 5. Klient implementieren und übersetzen. 6. Start Registry, Server starten, Klienten starten.

Rmic Compiler Optionen Bevor rmic zum Zuge kommt, müssen die entfernten Klassen und Schnittstellen übersetzt sein. Danach geben wir auf der Kommandozeile ein: rmic QuadratImpl Die erzeugten Klassen werden standardmäßig im aktuellen Verzeichnis platziert. (Mit der Option -D lässt sich der Zielort ändern.) Das RMI-Protokoll gibt es mittlerweile in unterschiedlichen Version. Mit dem Schalter vxxx beziehungsweise -iiop lässt sich dies genauer angeben. Weitere rmic Compiler Optionen: -v1.1 erzeugt Stub und Skeleton für das Protokoll unter JDK 1.1. -v1.2 erzeugt den Stub für das Java-SDK 1.2. Skeletons werden dort benötigt, da das System automatisch die Methoden des Servers findet und aufruft. -vcompat Das Standardprotokoll unter dem JDK 1.2. Es ist kompatibel mit dem neuen 1.2 Stub-Protokoll und dem älteren von 1.1. -iiop erstellt die für CORBA passenden Bausteine (neben iiop hat Corba weitere Protokolle standardisiert, die aber nur wenig Bedeutung haben). Mit der Option -idl kann zusätzlich für CORBA eine Spezifikationsdatei erstellt werden. Möchten wir zu den generierten Klassen den Quellcode sehen, so müssen wir -keep angeben. An den generierten Klassen lässt sich schön ablesen, wie die Kommunikation über die Leitung wirklich abgewickelt wird.

Der RMI Namensdienst (Registry) Durch den Namensdienst kann ein Server entfernte Objekte mit einem Namen anmelden, und Clients können die entfernten Objekte unter einem Namen finden. Für den Namensdienst können unterschiedliche Programme eingesetzt werden, beim Java-SDK ist ein einfaches Programm dabei. Der beigefügte Namensdienst ist ein vereinfachter Object Request Broker (ORB), wie er bei CORBA bekannt ist. Unter Windows starten wir den Dienst in einer DOS-Box als getrennten Prozess (sozusagen im Hintergrund) mit folgender Zeile: start rmiregistry Die Registry können wir uns somit als einen einfachen Assoziativspeicher vorstellen, der Namen und Stub-Objekte verbindet. Der Zustand des Stubs wird bei der Registry hinterlegt.

Registry Port Der Namensdienst läuft standardmäßig auf dem Port 1099. Für Dienste hinter einer Firewall ist es bedeutend, dass dieser Port auch anders lauten kann. Eine andere Port-Nummer lässt sich einfach als Argument angeben: start rmiregistry 2001 Der angegebene Port dient nur der Vermittlung vom Client zum Namensdienst. Die Kommunikation von Client und Server läuft über einen anderen Port.

Implementierung Schritt 1: Vorgefertigte Java Programme übersetzen Wir kompilieren die vorgefertigten Client- und Server-Quellcode-Programme. Hierzu die DOS Kommando-Zeile Eingabe Aufforderung aufrufen. In das Verzeichnis C:\example\jrmp wechseln. Das Verzeichnis enthält 4 *.java Files. C:\example\jrmp>dir Verzeichnis von C:\example\jrmp 20.01.2005 11:01 <DIR>. 20.01.2005 11:01 <DIR>.. 08.11.2003 21:29 76.java.policy 17.11.2002 11:35 189 Quadrat.java 14.12.2002 18:08 852 QuadratClient.java 17.11.2002 11:35 521 QuadratImpl.java 15.11.2002 10:23 619 QuadratServer.java

C:\example\jrmp>javac *.java C:\example\jrmp>dir Verzeichnis von C:\example\jrmp 20.01.2005 11:01 <DIR>. 20.01.2005 11:01 <DIR>.. 08.11.2003 21:29 76.java.policy 17.11.2002 11:35 189 Quadrat.java 14.12.2002 18:08 852 QuadratClient.java 17.11.2002 11:35 521 QuadratImpl.java 15.11.2002 10:23 619 QuadratServer.java 20.01.2005 16:38 238 Quadrat.class 20.01.2005 16:38 1.229 QuadratClient.class 20.01.2005 16:38 526 QuadratImpl.class 20.01.2005 16:38 1.061 QuadratServer.class

Diese 4 *.java Files übersetzen mit javac *.java Wenn die Eingabeaufforderung ohne Ausgabe einer weiteren Meldung erscheint, war die Übersetzung erfolgreich. In dem Verzeichnis C:\example\jrmp befinden sich jetzt zusätzlich zu den 4 *.java Files weitere 4 entsprechende *.class Files. C:\example\jrmp>javac *.java C:\example\jrmp>dir Verzeichnis von C:\example\jrmp 20.01.2005 11:01 <DIR>. 20.01.2005 11:01 <DIR>.. 08.11.2003 21:29 76.java.policy 17.11.2002 11:35 189 Quadrat.java 14.12.2002 18:08 852 QuadratClient.java 17.11.2002 11:35 521 QuadratImpl.java 15.11.2002 10:23 619 QuadratServer.java 20.01.2005 16:38 238 Quadrat.class 20.01.2005 16:38 1.229 QuadratClient.class 20.01.2005 16:38 526 QuadratImpl.class 20.01.2005 16:38 1.061 QuadratServer.class

Stub- und Skeleton-Compiler rmic Für eine Klasse, die das Interface Remote implementiert, erzeugt der RMI-Compiler rmic die benötigten Stubs und Skeletons. Der Aufruf erzeugt: rmic QuadratImpl QuadratImpl_Stub.class und QuadratImpl_Skel.class

Implementierung Schritt 2: Stubs und Skeletons mit dem rmic Compiler erzeugen Jetzt für die vorgefertigte Server Anwendung QuadratImpl mit Hilfe des rmic Compilers Stubs und Skeletons erstellen mit dem Kommando rmic QuadratImpl Jetzt befinden sich in dem Verzeichnis C:\example\jrmp zusätzlich die beiden class Files QuadratImpl_Skel.class und QuadratImpl_Stub.class. C:\example\jrmp>rmic QuadratImpl C:\example\jrmp>dir Verzeichnis von C:\example\jrmp 20.01.2005 11:01 <DIR>. 20.01.2005 11:01 <DIR>.. 08.11.2003 21:29 76.java.policy 17.11.2002 11:35 189 Quadrat.java 14.12.2002 18:08 852 QuadratClient.java 17.11.2002 11:35 521 QuadratImpl.java 15.11.2002 10:23 619 QuadratServer.java 20.01.2005 16:38 238 Quadrat.class 20.01.2005 16:38 1.229 QuadratClient.class 20.01.2005 16:38 526 QuadratImpl.class 20.01.2005 16:38 1.061 QuadratServer.class 20.01.2005 18:46 3.301 QuadratImpl_Stub.class 20.01.2005 18:46 1.770 QuadratImpl_Skel.class C:\example\jrmp>

Die Policy Sicherheitsaspekte Wenn eine benötigte class-datei von einem öffentlichen Web-Server oder aus einem entfernten Verzeichnis(-Dienst) geholt werden soll, müssen gewisse Regelungen bzgl. Sicherheit getroffen werden. Für diesen Zweck wird in den RMI-Programmen der RMISecurityManager gesetzt. Dieser verhält sich gemäß den Regeln, die in der Datei $HOME/.java.policy angegeben werden. Am einfachsten, aber auch am unsichersten, wäre folgendes.java.policy: grant { permission java.security.allpermission; }; RMI (bzw. das zugrunde liegende Protokoll JRMP) verwendet Sockets, deshalb müssen mindestens SocketPermissions gesetzt werden, etwa: grant { permission java.net.socketpermission "localhost", "accept,connect,listen"; permission java.net.socketpermission "*. lrz-muenchen.de", "accept,connect,listen"; };

Die Pakete java.rmi und java.rmi.server selbst definieren keine Permissions. Daher müssen in.java.policy keine weiteren RMI-spezifische Permissions gesetzt werden. Einen Überblick über mögliche Permissions gibt http://java.sun.com/j2se/1.4.2/docs/guide/security/permissions.html. Weitere Beispiele für Policy-Files z.b. in http://java.sun.com/j2se/1.4.2/docs/guide/security/policyfiles.html#examples. Zur Erstellung der Datei.java.policy kann auch das GUI-basierte policytool aus dem JDK verwendet werden. Dokumentation in http://java.sun.com/j2se/1.4.2/docs/tooldocs/solaris/policytool.html.

Damit sind wir in der Lage, unsere Anwendung in Betrieb zu nehmen. Neben unserem Klienten brauchen wir 3 weitere Prozesse: den eigentlichen Server Prozess den Namensdienst Java Registry den RMISecurityManager, das Policy Tool In unserem Beispiel laufen diese drei Prozesse auf dem gleichen Rechner wie der Klient. In diesen Prozessen laufen eigene JVMs (Java virtuelle Maschinen). In der Praxis würden diese Prozesse normalerweise auf getrennten Servern laufen, obwohl es durchaus sinnvoll sein kann, mehrere JVMs auf dem gleichen Server zu unterhalten, Hiervon macht z.b. die z/os Version von WebSphere Gebrauch. Die drei Prozesse Server, Registry und Policy müssen auf ihren jeweiligen Rechnern gestartet werden, ehe die Klientenanwendung durchgeführt werden kann. In unserem Beispiel starten wir die drei Prozesse auf dem gleichen Rechner auf dem unser Klient läuft. Dies geschieht mit Hilfe des Start Kommandos: start policytool start rmiregistry start java QuadratServer Nachdem die Prozesse gestartet sind können wir unseren Klienten aktivieren mit dem Kommando Es geht los. java QuadratClient ( parameter )

Inbetriebnahme Schritt 1: auf der Command Line eingeben start policytool Es werden zwei neue Fenster geöffnet: C:\j2sdk1.4.0_02\bin\policytool.exe und Richtlinietool. Diese repräsentieren den Security Prozess.

Inbetriebnahme Schritt 2: Ausserdem erscheint in der untersten Leiste rechts ein Eintrag Richtlinientool. Auf diesen Eintrag mit der linken Maustaste einmal klicken. Jetzt im Verzeichnis C:\example\jrmp auf der Command Line eingeben start rmiregistry Das C:\j2sdk1.4.0_02\bin\rmiregistry.exe Fenster erscheint. Der Registry Prozess wurde gestartet

Inbetriebnahme Schritt 3: Jetzt im Verzeichnis C:\example\jrmp auf der Command Line eingeben start java QuadratServer Damit wird der Server gestartet. Das H:\j2sdk1.4.0_02\bin\java.exe Fenster erscheint.

Inbetriebnahme Schritt 4: Jetzt im Verzeichnis C:\example\jrmp auf der Command Line eingeben java QuadratClient localhost 5 Bezeichnung des Server Objektes Internet Adresse des Server Objektes Eine attraktiven Präsentationslogik gefällig? Die Ziffer 5 ist das Argument, was von der Server Anwendung quadriert werden soll. Die folgende Message erscheint C:\example\jrmp>java QuadratClient localhost 5 OK 25 Und dies ist das Ergebnis der Anfrage des Clienten : java QuadratClient localhost 5 Das Ergebnis ist 25

Ergebnis der Anfrage des Clienten : Glückwunsch. Sie haben erfolgreich ein RMI Programm erstellt.

Dies sind die 4 übrigen geöffneten Fenster