Java - Fachbereich Informatik Hochschule Darmstadt

Werbung
9. Remote Method Invocation
Grundlagen der
Programmierung II (Java)
Prof. Dr. Bernhard Humm
Hochschule Darmstadt – University of Applied Sciences
Sommersemester 2006
Übersicht Grundlagen der Programmierung II
Einordnung in den Kontext der Vorlesung
Anwendungsentwicklung (Referenzarchitektur, Softwarekategorien)
Anwendungs-Komponenten (Anwendungskern)
Datenbankzugriff
Graphische Benutzeroberflächen (Swing, JSF)
Client- / Serverkommunikation (RMI)
Berechtigungsverwaltung
Application Server (EJB)
Erweiterte Konzepte (Reflection, Threads, Design Patterns, …)
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 2
Agenda
Agenda
Prinzip
Prinzip
Beispiel
Architektur-Überlegungen
Literatur
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
13.6.2006
Seite 3
Prinzip
Prinzipielle Arbeitsweise von RMI
In einem Remote-Interface werden
Methoden definiert, die als aufrufbare
Dienste anderen Arbeitsplätzen zur
Verfügung gestellt werden sollen
Eine Serverklasse implementiert das
Interface und erzeugt eine oder
mehrere Instanzen (Remote-Objekte)
Die Remote-Objekte werden bei
einem Namens-Service registriert
Clients beschaffen mit Hilfe der RMIRegistry Referenzen auf die
benötigten Objekte und rufen die
gewünschten Methoden auf. Der
Rückgabewert wird an den Client
zurückübertragen
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 4
Prinzip
Stubs und Skeletons
Ein Stub ist eine Klasse, die - wie das
implementierende Remote-Objekt - das
Remote-Interface implementiert und
daher für den Client als Platzhalter für
den Zugriff auf das Remote-Objekt dient
Der Stub kommuniziert über eine TCPVerbindung mit dem Gegenstück auf der
Server-Seite (Skeleton). Das Skeleton
kennt das tatsächliche
Applikationsobjekt, leitet die Anfragen
des Stubs an dieses weiter und gibt den
Rückgabewert an ihn zurück.
Stub und Skeleton werden während der
Entwicklung mit Hilfe eines Tools (rmic)
generiert und verbergen die komplizierten
Details der Kommunikation zwischen
Server und Client
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 5
Prinzip
Parameterübergabe
Werden beim Aufruf einer Methode primitive Datentypen übergeben
oder zurückgegeben (int, char, boolean, usw.), werden sie wie
gewöhnlich per Wert übergeben (call by value – keinerlei Unterschied
zu lokalen Java-Programmen)
Lokale Objekte können dagegen nur dann als Parameter oder
Rückgabewert verwendet werden, wenn sie serialisierbar sind. Sie
werden bei der Übertragung kopiert und somit ebenfalls per Wert
übergeben. Eigene Klassen müssen das Interface Serializable
implementieren.
Verweise auf Remote-Objekte, wie sie beispielsweise vom NamensService zurückgegeben werden, haben dagegen Referenzcharakter
und werden wie gewöhnliche Objektreferenzen behandelt.
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 6
Prinzip
Serialisierung - Deserialisierung
Serialisierung: Speicherung von Objekten auf einen Stream
Deserialisierung: Erzeugung von serialisierten Objekten
Anwendungen: Speicherung in Dateien oder Datenbanken,
Netzwerkkommunikation (zum Beispiel RMI)
Serialisierung / Deserialisierung primitiver Typen (int, float, …): built-in
Serialisierung / Deserialilsierung von Objekten: Interface Serializable
implementieren
Objekt
muss Serializable
implementieren
Objekt
ObjectOutputStream ObjectInputStream
OutputStream
InputStream
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 7
Agenda
Agenda
Prinzip
Beispiel
Beispiel
Architektur-Überlegungen
Literatur
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
13.6.2006
Seite 8
Beispiel
Beispiel: TimeService
getTime
Client
Server
TimeService
TimeService liefert die aktuelle Uhrzeit vom Server
Durchzuführende Schritte:
1. Remote-Interface definieren
2. Remote-Interface implementieren
3. Stub und Skeleton erzeugen
4. Security-Policies festlegen
5. RMI-Repository starten
6. Remote-Objekte registrieren
7. Client implementieren und starten
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 9
Beispiel
Remote-Interface definieren
getTime liefert die aktuelle Uhrzeit als String vom Server
Interface TimeService muss Interface java.rmi.Remote erweitern
Alle Methoden müssen java.rmi.RemoteException werfen
import java.rmi.*;
public interface TimeService extends Remote {
public String getTime() throws RemoteException;
}
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 10
Beispiel
Remote-Interface implementieren
TimeServiceImpl wird von java.rmi.server.UnicastRemoteObjekt
abgeleitet
Verantwortlich für Details der Client / Server-Kommunikation
import …
public class TimeServiceImpl
extends UnicastRemoteObject implements TimeService {
…
public String getTime() throws RemoteException {
return (new Date()).toString();
}
}
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 11
Beispiel
Stub und Skeleton erzeugen
Stub und Skeleton Klassen müssen erzeugt werden
Generator-Tool rmic (Kommandozeilenprogramm aus dem JDK)
erwartet den Namen der Implementierungsklasse als Argument (falls
erforderlich, mit der vollen Paketbezeichnung) und erzeugt daraus die
beiden Klassendateien für Stub und Skeleton
Aus der Klasse TimeServiceImpl werden die Klassen
TimeServiceImpl_Stub und TimeServiceImpl_Skel erzeugt und als
.class-Dateien zur Verfügung gestellt
> rmic TimeServiceImpl
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 12
Beispiel
Security Policies festlegen
TCP-Kommunikation mit der RMI-Registry auf Port 1099 ermöglichen
Auf TCP-Port 80 eine Verbindung erlauben. Dort wird später der WebServer laufen, mit dem der Client die Klassendatei mit der TimeStoreImplementierung zur Verfügung stellt.
Entsprechende Einträge in der benutzerspezifischen Policy-Datei
vorzunehmen. Sie liegt im Home-Verzeichnis des aktuellen Benutzers
und heißt .java.policy
grant {
permission java.net.SocketPermission "ph01:1099", "connect,resolve";
permission java.net.SocketPermission "ph02:80", "connect";
};
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 13
Beispiel
RMIRegistry starten
RMIRegistry: Namensdienst für RMI
Start der RMIRegistry als Kommandozeilenprogramm
Standard-Portnummer: 1099
Starten unter Windows:
> start rmiregistry
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 14
Beispiel
Remote-Objekte registrieren
Installation SecurityManager: aus Sicherheitsgründen notwendig, wenn mittels
RMI Bytecode dynamisch geladen wird
java.rmi.Naming: Klasse zum Speichern und Wiederfinden von Referenzen auf
Remote-Objekte
Methoden bind / rebind zum Speichern von Objektreferenzen
URLs als Format für Referenzen: rmi://localhost:1099/TimeService
System.setSecurityManager(new RMISecurityManager());
try {
TimeServiceImpl tsi = new TimeServiceImpl();
Naming.rebind("TimeService", tsi);
} catch (Exception e) {
// error handling
}
TimeServiceRegistration.
java
> java -Djava.rmi.server.codebase=http://localhost/ TimeServiceRegistration
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 15
Beispiel
Interface Naming
public static void bind(String name, Remote obj)
throws AlreadyBoundException, MalformedURLException, RemoteException
public static void rebind(String name, Remote obj)
throws RemoteException, MalformedURLException
public static void unbind(String name)
throws RemoteException, MalformedURLException, NotBoundException
public static Remote lookup(String name)
throws NotBoundException, MalformedURLException, RemoteException
public static String[] list(String name)
throws RemoteException, MalformedURLException
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 16
Beispiel
Client implementieren und starten
Auffinden des Remote-Objektes: Naming.lookup
try {
String url = "rmi://localhost:1099/TimeService“;
TimeService ts = (TimeService) Naming.lookup(url);
System.out.println(" Server time is " + ts.getTime());
} catch (Exception e) {
// exception handling
}
TimeServiceClient.
java
WebServer unter Port 80 starten
Start des Programms:
> java TimeServiceClient
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 17
Agenda
Agenda
Prinzip
Beispiel
Architektur-Überlegungen
Architektur-Überlegungen
Literatur
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
13.6.2006
Seite 18
Architektur-Überlegungen
Architektur-Betrachtung
cd RMI
Application code
Technical code
«interface»
java.rmi.Remote
«interface»
ApplicationInterface
«realize»
«realize»
«interface»
RemoteInterface
«realize»
UnicastRemoteObject
ApplicationClass
«realize»
use via delegation
RemoteClass
Die naive
Implementierung mischt
Anwendungscode und
technischen Code
Saubere Trennung:
Anwendungsklasse und –
Interface wissen nichts
von
Kommunikationstechnik
RemoteInterface erbt von
Anwendungs-Interface
Remote-Klasse nutzt
Anwendungsklasse
(Delegation)
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 19
Agenda
Agenda
Prinzip
Beispiel
Architektur-Überlegungen
Literatur
Literatur
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
13.6.2006
Seite 20
Literatur
Literatur und Referenzen
Guido Krüger: Handbuch der Java-Programmierung,
Kapitel 46 Remote Method Invocation
Eclipse Plugin: http://www.genady.net/rmi/
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 21
Herunterladen