Client-Seite - ETH TIK

Werbung
ETH Zürich, SS2001
Programmieren wie mit lokalen Objekten
wenig Programmier-Overhead
verteilte Applikationen
•
•
•
Java RMI
Aufruf einer Methode eines “remote”-Objektes
Zweck:
•
•
Analogon zum RPC (Remote Procedure Call)
•
Objekte in verschiedenen Java-VM’s
Ausführung der Methoden auf einem entfernten
Rechner
•
•
spezielle Technik aus dem Java-Umfeld
•
Remote Method Invocation
Seite 1
ETH Zürich, SS2001
Client
Stub
lookup
2
4
result
Java RMI
3
1
Server
(re)bind
Namensdienst
Skeleton
Server-Seite
call
Client-Seite
Netzwerk
RMI-Architektur ( I )
Seite 2
Server-Seite:
•
Client-Seite:
ETH Zürich, SS2001
Java RMI
//Referenz (Stub) des entfernten Objektes bekommen
rmi.Naming.lookup(“rmi://some.server.com/ObjectName“)
•
//entfernte Objekt abmelden
rmi.Naming.unbind(“ObjectName“, RemoteObject)
//entfernte Objekt anmelden
rmi.Naming.bind(“ObjectName“, RemoteObject)
Namensdienst wird ganz am Anfang gestartet
•
RMI-Architektur ( II )
Seite 3
besitzt auch nicht remote-aufrufbare Methoden (nicht exportiert)
ist mit einem Ort assoziiert
•
•
muß exportierte Methoden kennen
•
Java RMI
muß Klasse des Servers kennen
•
ETH Zürich, SS2001
muß Ort des Servers kennen
•
Client:
muß Methoden nach außen verfügbar machen (exportieren)
•
Server:
RMI Probleme
Seite 4
Schritt 7: Client starten
•
ETH Zürich, SS2001
Schritt 6: Server starten
Java RMI
- Starten der Namensdienst mit rmiregistry
Schritt 4: Namensdienst aktivieren
- Methoden-Aufruf wie auf dem lokalen Objekt
- Anfrage im Repository nach dem entfernten Server
Schritt 3: Client-Seite Implementieren
- automatische Generierung mittels rmic
Schritt 2: Stub und Skeleton generieren
- Server Implementation
- Basis Interface
Schritt 1: Implementierung der Server-Seite
•
•
•
•
•
RMI-Benutzung
Seite 5
Punkt-zu-Punkt Kommunikation,
Garbage-Collection
ermöglicht das Weiterleiten der
eventuellen Fehlermeldungen
ETH Zürich, SS2001
Java RMI
public ServerImpl throws RemoteException {
super();
}
public do_something() { ... }
public static void main (String args[]){
try {
ServerImpl server=new ServerImpl();
Naming.rebind(“MyServer“, server);
} catch (Exception e){
e.printStackTrace;
}
}
}
Hier wird die entfernt aufrufbare
Methode implementiert
ermöglicht entfernter Zugriff auf die im
Basis-Interface aufgelistete Methoden
public class ServerImpl extends UnicastRemoteObject implements Server {
import java.rmi.*;
import java.rmi.server.*;
Implementation des Server-Objektes
interface Server extends Remote {
public void do_something() throws java.rmi.RemoteException
}
Deklaration der entfernt zugreifbaren Methoden in einem Basis-Interface
RMI-Beispiel ( I ) - Der Server
Seite 6
ETH Zürich, SS2001
MyServer
Java RMI
implements
MyServerInterface
java.rmi.UnicastRemoteObject
extends
java.rmi.Remote
Interfaces
java.rmi.RemoteObject
Klassen
RMI Klassen und Interfaces
Seite 7
Java RMI
ServerImpl_Skel.class
- Skeleton für die Server-Seite
ServerImpl_Stub.class
- Stub für die Client-Seite
Dabei entstehen folgende Klassen:
ETH Zürich, SS2001
•
Für automatische Erzeugung wird Tool rmic verwendet
•
>rmic ServerImpl
ServerImpl.java compilieren
•
Klassen Stub und Skeleton werden automatisch wie folgt erzeugt:
RMI-Beispiel ( II ) - Stub und Skeleton
Seite 8
spezielles Tool rmiregistry:
•
Seite 9
Fehlermeldung falls Port bereits von einem anderen Prozess verwendet wird
•
Java RMI
Portnummer ist ein optionaler Parameter (per Definition wird 1099
eingestellt).
•
ETH Zürich, SS2001
Namensdienst wird gestartet
•
> rmiregistry <port> &
Verzeichnis der zur Verfügung gestellten entfernten Objekte
•
RMI-Beispiel ( III ) - Namensdienst
}
}
Java RMI
Server server=(Server) Naming.lookup(“rmi://some.server.com/MyServer“);
server.do_something();
}
catch (RemoteException e){
System.out.println(e) }
try{
public static void main (String args[]) {
public class ClientImpl {
import java.rmi.*;
Seite 10
keine zusätzliche Vererbung von Interfaces und Objektklassen nötig
Client findet den Server, indem er sich an den Namensdienst in dem ServerRechner wendet
bei Implementation assoziierter Name wird für die Nachfrage benutzt
ETH Zürich, SS2001
•
•
•
RMI-Beispiel ( IV ) - Der Client
enthält Referenzen auf Remote-Objekte
Referenzen über Namen identifizierbar
Namen sind wie URL’s zusammengesetzt
Naming-Methoden:
•
•
•
•
ETH Zürich, SS2001
Katalog von verfügbaren Remote-Objekten
•
Java RMI
• Remote lookup(String url)
• String[] list(String url)
• void unbind(String url)
Seite 11
rmi://host.domain/objectname
• void rebind(String url, Remote reference)
• void bind(String url, Remote reference)
java.rmi.Naming - Service
•
Remote-Objekte müssen erreichbar sein:
RMI-Naming
aber: neue Fehlerquellen + Exceptions
(fast) gleiche Behandlung von lokalen und Remote-Objekten
Remote-Objekt fungiert als Server (exportiert Methoden)
Client kann über ein Interface auf das Remote-Objekt zugreifen
RMI-Paket bietet einfachen Naming-Service
Parallele Ausführung von Methodenaufrufen im Server mittels
Threads (erfordert Synchronisation!)
•
•
•
•
•
•
Java RMI
vereinfacht das Programmieren
•
ETH Zürich, SS2001
RMI bietet Methode zum Verstecken von Verteilung
•
Zusammenfassung
Seite 12
Herunterladen