Rechnernetze Verteilte Systeme

RMI-Programmierung

Am Beispiel des schon bei der Socket-Programmierung behandelten Echo-Client / Servers soll die Erstellung einer analogen RMI-Implementierung dargestellt werden.

 

i. Remote Interface Jedes entfernte Objekt (remote object) muss ein remote interface implementieren. Dieses muss public sein und aus java.rmi.Remote abgeleitet werden; weiterhin muss es java.rmi.RemoteExeption in seiner throws - Klausel deklarieren:

package echo;

import java.rmi.*;

 

public interface Echo extends java.rmi.Remote

{

  public String sendEcho(String arg) throws java.rmi.RemoteException;

}

ii. Implementierungsklasse Das zu erstellende Remote Object besteht aus einer Klasse, die ein oder auch mehrere Remote Interfaces implementiert und im Standardfall von der Klasse java.rmi.server.UnicastRemoteObject abgeleitet ist. Neben dem Konstruktur für das Remote Objekt müssen natürlich die Remote Methoden implementiert werden. Weiterhin muss ein Security Manager (RMISecurityManager oder eigener) installiert und eine oder mehrere Instanzen des Remote Objektes erzeugt werden. Abschließend ist das Remote Objekt unter einem Namen zu registrieren, damit ein Client (Aufrufer) eine Objekt-Referenz über diesen Namen erhalten kann1.

package echo;

import java.rmi.*;

import java.rmi.server.*;

import java.net.*;

 

public class EchoImpl extends UnicastRemoteObject implements Echo {

  private String name;

  private String buf;

  public EchoImpl(String s) throws RemoteException {

  super();

  name =s;

}

 

 

public String sendEcho(String arg) throws RemoteException {

  System.out.println("EchoServer: " + arg);

  buf =arg;

  return ("ServerString= " + buf );

}

 

 

public static void main(String args[]) {

System.setSecurityManager(new RMISecurityManager());

try {

  EchoImpl serv = new EchoImpl("EchoServer");

  Naming.rebind("EchoServer", serv);

  System.out.println("Echo Server registriert");

}

catch (RemoteException re) {

 System.err.println("Exception in EchoImpl.main: " + re);

}

 catch (MalformedURLException e) {

System.err.println("MalformedURLException in EchoImpl.main: " + e);

}

}

}

iii. Client-Klasse Zum Aufruf der Remote Methoden eines oder mehrerer Remote Objekte muss der Client zunächst eine Referenz auf das / die Remote Objekte erhalten; dies geschieht durch Name-Lookup auf dem Server, der die registrierten Remote Objekte enthält. Als Security Manager ist zweckmäßigerweise der RMISecurityManager zu installieren. Anschließend können die Remote Methoden aufgerufen werden:

package echo;

import java.rmi.*;

 

public class EchoClient {
 

public static void main(String args[]) {

if (args.length < 2) {

System.out.println("Usage: java EchoClient [host] [Text]");

System.exit(1); }
 

System.setSecurityManager(new RMISecurityManager());

try {

  Echo serv = (Echo) Naming.lookup("//" + args[0] + "/EchoServer");

  String message = serv.sendEcho("Clientstring = " + args[1]+ " \n");

  System.out.println("EchoClient: " + message);

}

catch (Exception e) {

System.err.println("Exception in main: " + e);

}

}

}

Übersetzen und Starten von Server + Client

Nach Übersetzung des Remote Interface (i), der Implementierungsklasse (ii) sowie der Client-Klasse (iii) werden die Stub- und Skeleton-Klassen mit dem RMI-Compiler rmic aus der Implementierungsklasse erzeugt (alle Dateien des package echo liegen im Unterverzeichnis echo):

rmic echo.EchoImpl
erzeugt die Stub- und Skeleton-Klassen EchoImpl_Stub.class und EchoImpl_Skel.class Alle erzeugten Klassen müssen zur Laufzeit im jeweiligen CLASSPATH liegen.

Server:
rmiregistry &
(Registry, falls nicht schon gestartet)
java -Djava.security.policy=java.policy echo.EchoImpl &


Client:
java -Djava.security.policy=java.policy echo.EchoClient
Registryadresse Text

Ruft die Methode sendEcho des auf dem adressierten Host registrierten Echo-Servers (Internet-Adresse) mit dem eingegebenen Textstring auf und gibt den Antwortstring aus.

 

Beispiel für Java-policy- Datei:

grant { permission java.security.AllPermission; };

 

 

1 Dazu muss das Programm rmiregistry oder rmid auf einem bekannten System laufen.