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

Ähnliche Dokumente
Middleware. im Schweinsgalopp

Remote Method Invocation

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

Remote Method Invocation

Java-Programmierung. Remote Method Invocation - RMI

Java Remote Method Invocation (RMI)

Remote Method Invocation

Client/Server-Programmierung

Client/Server-Programmierung

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

Einführung: Verteilte Systeme - Remote Method Invocation -

Remote Methode Invocation (RMI) ETIS SS05

Mobile und Verteilte Datenbanken

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

Konzepte von Betriebssystem-Komponenten Middleware RMI

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

Mobile und Verteilte Datenbanken

Java RMI Remote Method Invocation

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

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

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

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

-Testen verteilter Anwendungen

8.1.5 Java RMI Remote Method Invocation

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

Musterlösung Übungsblatt 2 Netzprogrammierung WS 05/06

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

Überblick. Beispiel: get()-methodenaufruf am VSBoard aus Übungsaufgabe 1. Analyse einer Methode: java.lang.reflect.method

Warum EJB Technologie (1)?

1 Motivation. 1 Motivation. Standard Middleware für objektorientierte Anwendungen. Motivation. Fragmentierte Objektmodel. Java RMI

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

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

Remote Method Invocation (RMI)

5A Kooperation: Lösungen

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

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

Kommunikation. Björn und Georg

Überblick. Java Reflection API. Class-Objekte

CORBA. Beispiel einer Middleware-Plattform. Christian Fass WS 2013/14 Software Engineering: Basistechnologien

Dr. Monika Meiler. Inhalt

Kommunikation in verteilten Anwendungen

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

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

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

Einstieg in die Informatik mit Java

Objektorientierte Programmierung Studiengang Medieninformatik

12 Abstrakte Klassen, finale Klassen und Interfaces

Überblick. Java RMI Java Remote Method Invocation Marshalling und Unmarshalling Aufgabe 1. VS-Übung (SS12) Java RMI 1 1

RMI Server und Client

Verwendung der Gruppenkommunikation JGroups

Erzeugungsmuster. Kapselung der Objekt-Erzeugung

CORBA. Eine kurze Einführung. Common Object Request Broker Architecture. Ying Lu

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

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

Überblick. Java RMI Java Remote Method Invocation Marshalling und Unmarshalling Aufgabe 1. VS-Übung (SS16) Java RMI 1 1

Einstieg in die Informatik mit Java

39 Object Request Brokers. 40 Components of an ORB Stubs and Skeletons Stub

Client/Server-Programmierung

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Transkript:

RMI Remote Method Invocation Wir haben Komponenten auf einem Rechner Komp1 Komp2

zwei Rechner Wir wollen Komp1 Komp2 TCP/IP aber wie? Fallstudie Chat Einfluss der Architektur auf den Entwurf oder Man kann sich das Leben leicht oder schwer machen

Ein Chat System Aufgabe des Chat Systems ist es, die Kommunikation einer Menge von Clients untereinander zu ermoeglichen. Der Normalfall ist, dass ein Client einen kurzen Text (Nachricht) an einen Server schickt, diese wird dann an alle angemeldeten Clients weitergeschickt. Zusaetzlich ist es moeglich, eine Nachricht nur an einen bestimmten Client zu schicken. Ein angemeldeter Client, der zeitweise nicht auf Nachrichten antworten kann, kann ein sogenanntes "away" setzen, und damit den Grund seiner Abwesenheit mitteilen (z.b. beim Essen,...). Die Clients werden ueber einen (selbst gewaehlten) eindeutigen Namen identifiziert. Die Kommunikation zwischen den Clients und dem Server erfolgt ueber TCP/IP, prinzipiell sollte es jedoch moeglich sein, auf ein anderes Protokoll (z.b. UDP,...) umzustellen. Use cases

Entwurf Die Kommunikation erfolgt ueber TCP/IP, d.h. ueber sockets. Die Details ueber die Kommunikation sollten moeglichst gekapselt werden, da u.u. spaeter ein anderes Protokoll verwendet werden soll. Wegen der Plattformunabhaengigkeit und der einfachen Verwendung von Sockets wird das System in JAVA implementiert. Als Userinterface ist ein Kommandozeilenfenster ausreichend, es sollte aber spaeter ohne groessere Aenderungen in eine grafische Applikation umgewandelt werden koennen. Da der Server auch eine groessere Anzahl von Clients versorgen koennen soll, wird dieser mit einem Thread pro Client implementiert. Der Client muss wohl auch mehrere Threads haben (einen, der auf ankommende Meldungen vom Server wartet und einen, der mit dem Benutzer interagiert und Meldungen verschickt) Die prinzipielle Funktion ist die, dass Messages vom Client zum Server und vom Server an die Clients transportiert werden. Das System ist also letzlich so etwas wie eine "Nachrichtenverteilungsmaschine". Das zentrale Objekt ist also zum einen die Message selbst und zum zweiten die Verbindung, ueber die die Messages verschickt werden. Der Ablauf innerhalb des Systems (insbesondere innerhalb des Servers) wird also im wesentlichen vom Eintreffen (und Versenden) von Nachrichten bestimmt. Da sowohl Client als auch Server diese Funktionen in aehnlicher Weise (aber eben nicht ganz identisch, insbesondere was die Fehlerbehandlung,...) betrifft, wird die gemeinsame Funktionalitaet in der Klasse ChatConnection gekapselt, fuer Client und Server werden dann davon entsprechend spezialiserte Klassen abgeleitet. Die gesamte Kommunikation laeuft so ab, dass Message Objekte ueber die Verbindung (als Strings) uebertragen werden. Je nach Inhalt hat ein Message-Objekt einen entsprechenden Typ: MSG_UNKNOWN,MSG_CONNECT,MSG_DISCONNECT,MSG_SEND, MSG_BROADCAST,MSG_AWAY,MSG_REPLY Messages, die vom Server kommen, haben immer den Typ MSG_REPLY

Klassen Nachricht empfangen

senden (Client) senden (Server)

the Source [ibook:aktuell/chat/source] admin% ls AwayDialog.java Client.java MessageTest.java ChatClient.java ClientChatConnection.java ServerChatConnection.java ChatConnection.java ClientList.java TextClient.java ChatServer.java GrafClient.java ChatUI.java Message.java [ibook:aktuell/chat/source] admin% wc *.java 40 69 686 AwayDialog.java 130 332 3336 ChatClient.java 100 266 2428 ChatConnection.java 149 436 4369 ChatServer.java 16 28 406 ChatUI.java 122 345 2850 Client.java 40 110 1167 ClientChatConnection.java 108 288 2580 ClientList.java 167 406 4000 GrafClient.java 138 402 3031 Message.java 28 59 823 MessageTest.java 39 84 949 ServerChatConnection.java 119 322 3221 TextClient.java 1196 3147 29846 total Ergebnis? nicht zufriedenstellend unübersichtlich ziemlich aufwändig (über 1000 Zeilen) muss besser gehen! aber wie? nachdenken... Patterns

Observer konkret: Chatsystem auf einem Rechner (Assoziation) ist eher langweilig, wie erfolgt Kommunikation?

Proxy remote proxy realisiert Zugriff über Netzwerk in JAVA mit RMI implementiert!! allgemein K1 Proxy Proxy K2 TCP/IP Client spricht nicht mit dem Server, sondern mit (Proxy-) Objekt, das die gleiche Schnittstelle hat wie das Server-Objekt. Für K2 sieht es aus, als ob ein Aufruf vom Proxy kommt --> K1 und K2 müssen nicht modifiziert werden (außer Verbindungsaufbau) Proxy kümmert sich um Kommunikation

Dynamisches Modell Implementierung Client String line = r.readline(); while (line!= null) ChatServer.broadcast(line); line = r.readline(); Server for(int i=0;i<clients.size();i++) myclient = (ChatClientInterface) Clients.elementAt(i); myclient.showmessage((string)messages.elementat(j));

the Source [ibook:aktuell/chat/rmichat] admin% ls ChatClient.java ChatServer.java log ChatClientInterface.java ChatServerInterface.java [ibook:aktuell/chat/rmichat] admin% wc *.java 52 104 983 ChatClient.java 4 13 139 ChatClientInterface.java 96 177 1927 ChatServer.java 5 19 221 ChatServerInterface.java 157 313 3270 total Client ist hier primitiver (nur ein Thread) trotzdem: bedeutend einfacher!! Proxy überträgt Parameter (Objekte) übers Netz Serialisierung verschiedene Transportmechanismen möglich kümmert sich um Probleme wie: Verbindungsabbruch Übertragungsfehler Verschlüsselung Datenkonvertierung (hier nicht nötig, da alles Java) vgl. CORBA wird generiert: muß nicht programmiert werden

Vorgehen Schnittstelle definieren Java Interface keine eigene Sprache (vgl. CORBA) Schnittstelle implementieren (Server) Proxy erzeugen Wie finden Clients das Server-Objekt? registry Server muß angemeldet werden Beispiel: komplexe Berechnung import java.rmi.*; Schnittstelle public interface Rechner extends Remote public int compute(int par) throws RemoteException; interface, keine Klasse muß public sein erweitert Remote jede Methode kann RemoteException werfen (Fehler auf der anderen Seite)

Implementierung import java.rmi.*; import java.rmi.server.*; public class RechnerImpl extends UnicastRemoteObject implements Rechner // Default-Konstruktor muss implementiert werden // (kann RemoreException werfen public RechnerImpl() throws RemoteException public int compute(int par) throws RemoteException return par+1; Proxy erzeugen $> rmic RechnerImpl $> ls Rechner.class Rechner.java RechnerImpl.class RechnerImpl.java RechnerImpl_Skel.class RechnerImpl_Stub.class *_Stub ist der Proy auf Client-Seite *_Skel ist der Dispatcher auf Server-Seite Quellcode behalten mit rmic -keep

Dateien K1 Proxy Proxy K2 RechnerClient RechnerImpl_Stub RMI RechnerImpl_Skel RechnerImpl Stub public final class RechnerImpl_Stub extends java.rmi.server.remotestub implements Rechner, java.rmi.remote... $method_compute_0 = Rechner.class.getMethod("compute", new java.lang.class[] int.class);... public int compute(int $param_int_1) throws java.rmi.remoteexception Object $result = ref.invoke(this, $method_compute_0, new java.lang.object[] new java.lang.integer($param_int_1), -537915219968796873L); return ((java.lang.integer) $result).intvalue();...

Skel public final class RechnerImpl_Skel implements java.rmi.server.skeleton private static final java.rmi.server.operation[] operations = new java.rmi.server.operation("int compute(int)") ;... public void dispatch(java.rmi.remote obj, java.rmi.server.remotecall call, int opnum, long hash)... RechnerImpl server = (RechnerImpl) obj; switch (opnum) case 0: // compute(int) int $param_int_1; java.io.objectinput in = call.getinputstream(); $param_int_1 = in.readint();... int $result = server.compute($param_int_1); java.io.objectoutput out = call.getresultstream(true); out.writeint($result); #include "orb.idl" #ifndef Rechner #define Rechner interface Rechner ; Anmerkung: IDL long compute( in long arg0 ); #pragma ID Rechner "RMI:Rechner:0000000000000000" #endif rmic -idl Rechner erzeugt (CORBA-) IDL RMI kann über IIOP (Internet Inter Orb Protocol) augerufen werden

starten mit: rmiregistry Standard-Port: 1099 dann: Server registrieren: Registry+Server import java.rmi.*; import java.rmi.server.*; public class RechnerServer public static void main(string args[]) try // Naming.bind() bindet nur einmal, sonst Fehler // Naming.rebind() ersetzt ggf. Bindung Naming.rebind("rmi://localhost/Rechner",new RechnerImpl()); catch (Exception e) e.printstacktrace(); import java.rmi.*; Client holt sich die Referenz zum Remote-Objekt von der registry und los gehts public class RechnerClient public static void main(string args[]) try Rechner r = (Rechner) Naming.lookup("rmi://localhost/Rechner"); int ergebnis = r.compute(3); System.out.println(ergebnis); catch (Exception e) e.printstacktrace(); et voila

und zur Kasse Schnittstelle definieren Bestand.java Schnittstelle implementieren BestandImpl.java Proxy erzeugen Server programmieren in BestandImpl.java (main) Client programmieren remotekasse.java rmiregistry läuft schon (auf susi)