diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Reference Architectures and Patterns/hjp5/html/k100299.html | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100299.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100299.html | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100299.html b/Master/Reference Architectures and Patterns/hjp5/html/k100299.html new file mode 100644 index 0000000..f5ff4e4 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100299.html @@ -0,0 +1,267 @@ +<html>
+<head>
+<title>
+Handbuch der Java-Programmierung, 5. Auflage
+</title>
+</head>
+<body>
+<a name="startofbody"></a>
+<script language="JavaScript" src="hjp4lib.js">
+</script>
+<script language="JavaScript">
+installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100298.html;106,k100298.html;107,k100300.html;108,k100302.html");
+</script>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100298.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100298.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100300.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100302.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">Kapitel 47 - Remote Method Invocation
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id047001"></a>
+<h2>47.1 Einleitung </h2>
+<hr>
+<ul>
+<li><a href="k100299.html#sectlevel2id047001">47.1 Einleitung</a>
+<ul>
+<li><a href="k100299.html#sectlevel3id047001001">47.1.1 Prinzipielle Arbeitsweise</a>
+<li><a href="k100299.html#sectlevel3id047001002">47.1.2 Einzelheiten der Kommunikation</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel3id047001001"></a>
+<h3>47.1.1 Prinzipielle Arbeitsweise </h3>
+
+<p>
+Im vorigen Kapitel wurde die Netzwerkprogrammierung mit Hilfe von
+Sockets und URL-Objekten erläutert. Dabei wurden im wesentlichen
+Dienste verwendet, deren Aufgabe es war, <i>Daten</i> zwischen zwei
+Netzwerkknoten zu übertragen. Höhere Anwendungen, wie etwa
+das Kopieren von Dateien, die Manipulation von Verzeichnissen oder
+das Starten von Programmen auf dem Server, wurden mit zusätzlichen
+Anwendungsprotokollen wie FTP oder HTTP realisiert.
+
+<p>
+Neben der reinen Übertragung von Daten besteht eine weitere wichtige
+Anwendung von Netzwerkstrukturen darin, Programmcode zu verteilen
+und von unterschiedlichen Arbeitsplätzen im Netz aufzurufen.
+Auf diese Weise können spezielle Aufgaben einer Applikation (wie
+etwa der Datenbankzugriff oder die Kommunikation mit externen Systemen)
+an geeignete Server delegiert und so die Applikationslast gleichmäßiger
+verteilt und die Skalierbarkeit des Systems erhöht werden.
+
+<p>
+Mit RMI (<i>Remote Method Invocation</i>) stellt das JDK seit der
+Version 1.1 einen Mechanismus zur Verfügung, der es ermöglicht,
+Objekte auf einfache Weise im Netz zu verteilen und ihre Dienste anderen
+Arbeitsplätzen zur Verfügung zu stellen. Die prinzipielle
+Arbeitsweise von RMI läßt sich wie folgt skizzieren (siehe
+<a href="k100299.html#rmi1">Abbildung 47.1</a>):
+<ul>
+<li>In einem <a name="ixa103412"><i>Remote-Interface</i></a> werden
+eine oder mehrere Methoden definiert, die als aufrufbare Dienste anderen
+Arbeitsplätzen zur Verfügung gestellt werden sollen.
+<li>Eine Serverklasse implementiert das Interface und erzeugt eine
+oder mehrere Instanzen, die als <a name="ixa103413"><i>Remote-Objekte</i></a>
+bezeichnet werden.
+<li>Die Remote-Objekte werden bei einem <a name="ixa103414"><i>Namens-Service</i></a>
+registriert, der von potentiellen Clients abgefragt werden kann. Mit
+der <a name="ixa103415"><i>RMI-Registry</i></a> ist ein einfacher
+Namens-Service bereits Bestandteil des RMI-Pakets.
+<li>Clients beschaffen mit Hilfe der RMI-Registry Referenzen auf die
+benötigten Objekte und rufen die gewünschten Methoden auf.
+Die beim Aufruf übergebenen Parameter werden an das Remote-Objekt
+übertragen, und die passende Methode wird dort ausgeführt.
+Der Rückgabewert wird an den Client zurückübertragen.
+Die Referenzen auf die Remote-Objekte werden als <a name="ixa103416"><i>Remote-Referenzen</i></a>
+bezeichnet.
+</ul>
+<p>
+<a name="rmi1"></a>
+<img src="images/RMI1.gif">
+<p>
+
+<p><i>
+Abbildung 47.1: Prinzipielle Arbeitsweise von RMI</i></p>
+
+<p>
+RMI etabliert also eine Client-Server-Architektur zwischen lokalen
+Java-Objekten und den von ihnen aufgerufenen Remote-Objekten. Die
+eigentliche Kommunikation zwischen den Teilnehmern ist fast vollständig
+unsichtbar.
+
+<p>
+Die Rollen von Client und Server sind dabei keineswegs statisch festgelegt.
+So kann ein Client durchaus Server-Funktionalitäten implementieren
+oder ein Server kann zur Ausführung eines Client-Calls die Hilfe
+eines anderen Remote-Objekts in Anspruch nehmen. Eine interessante
+Eigenschaft von RMI besteht auch darin, fehlenden Code dynamisch nachzuladen.
+Benötigt beispielsweise ein Server zur Ausführung eines
+Auftrags eine bis dato unbekannte Klasse vom Client (die natürlich
+ein ihm zur Compilezeit bekanntes Interface implementiert), so kann
+er diese dynamisch vom Client laden und - dank der Plattformunabhängigkeit
+von Java - auf dem Server ausführen.
+
+<!-- Section -->
+
+<a name="sectlevel3id047001002"></a>
+<h3>47.1.2 Einzelheiten der Kommunikation </h3>
+
+<p>
+Bei der Kommunikation mit RMI hat der Client den Eindruck, Methoden
+von Objekten aufzurufen, die auf dem Server liegen. In Wirklichkeit
+liegen die Dinge natürlich etwas komplizierter, denn der Client
+hat von der RMI-Registry lediglich ein <a name="ixa103417"><i>Stub</i></a>-Objekt
+erhalten, und das Remote-Objekt hat den Server nicht wirklich verlassen.
+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.
+
+<p>
+Der Stub kommuniziert über eine TCP-Verbindung mit dem als <a name="ixa103418"><i>Skeleton</i></a>
+bezeichneten Gegenstück auf der Server-Seite. 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 generiert und verbergen die komplizierten Details der Kommunikation
+zwischen Server und Client.
+<p>
+<a name="imageid047002"></a>
+<img src="images/RMI2.gif">
+<p>
+
+<p><i>
+Abbildung 47.2: Stubs und Skeletons</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+RMI verfolgt mit der Verteilung von Objekten im Netz einen ähnlichen
+Ansatz wie <a name="ixa103419"><i>CORBA</i></a> (die <i>Common Object
+Request Broker Architecture</i>, siehe beispielsweise <a href="http://www.omg.org">http://www.omg.org</a>).
+Da auch CORBA von Java sehr gut unterstützt wird, muss man sich
+als Entwickler natürlich die Frage stellen, welche der beiden
+Architekturen in einem entsprechenden Projekt die bessere Wahl ist.
+Für CORBA spricht die Vielzahl der verfügbaren Implementierungen,
+die größere Verbreitung und die Tatsache, dass neben Java
+auch andere Programmiersprachen unterstützt werden (etwa C++).
+Es ist daher ideal für heterogene Projekte, deren Größe
+eine gewisse kritische Masse überschreiten.
+
+<p>
+RMI ist dagegen einfacher zu erlernen, bietet dynamischen Code-Austausch,
+erfordert keine zusätzlichen Lizenzen und kommt mit insgesamt
+weniger Aufwand aus. Für reine Java-Projekte könnte es sich
+daher als geeignete Wahl erweisen. Seit der Version 1.3 unterstützt
+das JDK die RMI-Kommunikation auch auf der Basis des CORBA-Protokolls
+<a name="ixa103420"><i>IIOP</i></a> und erleichtert so die Integration
+von RMI- und CORBA-Anwendungen.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Bei der Kommunikation zwischen Client und Server (wenn also der Client
+eine Methode auf einem Remote-Objekt aufruft) sind drei Arten von
+Datentypen zu unterscheiden:
+<ul>
+<li>Werden beim Aufruf einer Methode primitive Datentypen übergeben
+oder zurückgegeben (<a href="index_i.html#ixb100244"><font color=#000080><tt>int</tt></font></a>,
+<a href="index_c.html#ixb100215"><font color=#000080><tt>char</tt></font></a>,
+<a href="index_b.html#ixb100072"><font color=#000080><tt>boolean</tt></font></a>,
+usw.), werden sie wie gewöhnlich per Wert übergeben (<i>call
+by value</i>). In diesem Fall besteht also überhaupt kein Unterschied
+zu lokalen Java-Programmen.
+<li>Lokale <i>Objekte</i> 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 (siehe <a href="k100260.html#kapitelserialisierung">Kapitel 41</a>).
+Viele Klassen des JDK, wie etwa <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>,
+<a href="index_c.html#ixb100557"><font color=#000080><tt>Calendar</tt></font></a>,
+die numerischen Wrapper-Klassen oder die Collection-Klassen sind bereits
+serialisierbar und können direkt verwendet werden. Eigene Klassen
+müssen das Interface <a href="index_s.html#ixb100454"><font color=#000080><tt>Serializable</tt></font></a>
+implementieren.
+<li>Verweise auf Remote-Objekte, wie sie beispielsweise vom Namens-Service
+zurückgegeben werden, haben dagegen Referenzcharakter und werden
+wie gewöhnliche Objektreferenzen behandelt.
+</ul>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Objekte, die weder Remote-Referenzen noch serialisierbar sind, können
+per RMI nicht ausgetauscht werden. Beispiele dafür sind die Klassen
+<a href="index_t.html#ixb100591"><font color=#000080><tt>Thread</tt></font></a>,
+<a href="index_s.html#ixb100435"><font color=#000080><tt>System</tt></font></a>
+oder <a href="index_r.html#ixb101016"><font color=#000080><tt>RandomAccessFile</tt></font></a>.
+Derartige Objekte haben allerdings auch meist nur lokale Bedeutung,
+und die Übertragung an eine andere virtuelle Maschine macht wenig
+Sinn.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
+<tr>
+<td><font color="#FFFFFF"> Warnung </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+<hr>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
+Wesley, Version 5.0.1
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100298.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100298.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100300.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100302.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">© 1998, 2007 Guido Krüger & Thomas
+Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
+</table>
+<a name="endofbody"></a>
+</body>
+</html>
|
