18.9 Einen Client programmieren
Ebenso wie der Server ist der Client ein normales Java-Programm, welches weder etwas mit Remote noch mit Serializable zu tun hat. 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.
Listing 18.5 AdderClient.java
import java.rmi.*;
public class AdderClient
{
public static void main( String args[] ) throws Exception
{
Adder a = (Adder) Naming.lookup( "rmi://localhost/adder" );
int sum = a.add( 2, 2 );
System.out.println( sum );
}
}
Damit ist das letzte Puzzlestück zusammen und das RMI-Beispiel vollständig. Naming.lookup() liefert zu einer URL ein Stub-Objekt, welches die gewünschte Schnittstelle Adder implementiert. Der Rückgabetyp ist Remote. Das ist jetzt wirklich einfach, und wir sehen, dass sich ein lokaler Funktionsaufruf nicht mehr von einem entfernten unterscheidet. Bedenken wir an dieser Stelle, dass die Rückgabe von lookup() das Stellvertreter-Objekt ist. Eine Typumwandlung in den Server oder in AdderImpl würde natürlich nicht funktionieren, denn dieser existierte ja nur auf der Server- und nicht auf der Client-Seite.
final class java.rmi.Naming
|
|
static Remote lookup( String name )
throws NotBoundException, MalformedURLException, RemoteException
Liefert eine Referenz auf den Stub, der mit dem entfernten Objekt name verbunden ist. Ist kein Dienst unter dem Namen verfügbar, kommt es zu einer NotBoundException. Ist der Namensdienst nicht erreichbar, folgt eine RemoteException. MalformedURLException kann durch eine falsch gebildete URL folgen. |
|
static String[] list( String name )
Liefert ein Feld mit angemeldeten Diensten. Der angegebene Name gibt die URL des Namensdienstes an. Ist die URL falsch konstruiert, so folgt eine MalformedURLException; ist die Registry nicht erreichbar, folgt eine RemoteException. |
18.9.1 Einfaches Logging
Um die Aktivität von RMI verfolgen zu können, haben die Entwickler einen einfachen Login-Mechanismus eingebaut. Er gibt Auskunft über die Objekte und entfernte Referenzen. Hier erfahren wir auch, ob alle gewünschten Objekte korrekt gefunden wurden. Das Logging lässt sich mit der Eigenschaft java.rmi.server.logClass einschalten, wenn der Wert auf true gesetzt ist. Dann erscheinen Ausgaben auf dem System.err-Fehlerkanal. Erweitern wir die Klasse RemoteServer, so erben wir zudem eine statische Funktion setLog(OutputStream), mit der sich der Fehlerausgabestrom individuell setzen lässt. Mittels getLog(), die einen PrintStream liefert und keinen OutputStream, gelangen wir wieder an den Fehlerkanal.
abstract class java.rmi.server.RemoteServer
extends RemoteObject
|
|
static void setLog( OutputStream out )
Loggt RMI-Aufrufe, indem sie in den Ausgabestrom out geschrieben werden. Ist out=null, wird das Logging beendet. |
|
static PrintStream getLog()
Liefert den Ausgabestrom für das RMI-Logging. |
Tipp Das Paket java.rmi.server hält noch eine andere Klasse bereit, die recht nützlich sein kann: UID. Mit dieser Klasse lässt sich eine einfache ID berechnen.
String s = new java.rmi.server.UID().toString();
|
|