Verteilte Systeme - Proteus
Verteilte Systeme - Proteus
Verteilte Systeme - Proteus
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Prof. Dr. Th. Letschert<br />
CS5001<br />
<strong>Verteilte</strong> <strong>Systeme</strong><br />
Master of Science (Informatik)<br />
- Netzwerkprogrammierung -<br />
© Th Letschert FH Gießen-Friedberg
Plattformen der Verteiltheit<br />
Netzwerk-Programmierung :<br />
<strong>Verteilte</strong> <strong>Systeme</strong> als interagierende Prozesse<br />
Themen:<br />
● ein Blick zurück<br />
● Socket-API<br />
● Server-Struktur<br />
● einfache Abstraktionen oberhalb der Socket-Ebene in Java<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 2
Plattformen der Verteiltheit<br />
Plattformen der Verteiltheit : ein Blick zurück<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 3
Plattformen der Verteiltheit – Ende 1980er<br />
Plattformen der Verteiltheit ~ Ende 1980-er<br />
– LAN- / X25-Zeitalter : LANs und Fern-Netze: getrennte Welten<br />
– wichtige Protokolle (Protokoll-Stack kein Standard-Bestandteil eines BS)<br />
● Netbios<br />
– ~1984 eingeführt als API für LAN-Controller, IBMs PC_LAN Netze<br />
– ungerouteter Protokoll-Stack (keine Schicht-3 / keine Router)<br />
● SPX/IPX:<br />
● X25<br />
– Protokoll in Novell-Netzen, bis Mitte der 1990er Markt-beherrschend<br />
– basierend auf Xerox Internetworking Protokollen<br />
– geroutetes Protokoll ähnlich zu TCP/IP<br />
– Protokoll (Schicht 2 / 3) in Telekom-Netzen<br />
– dominierend in kommerziellen eingesetzten Fern-Netzen<br />
● TCP/IP<br />
– kommerziell (fast) bedeutungslos<br />
– Einsatz (fast) nur in Fern-Netzen von Universitäten und<br />
Forschungsinstituten<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 4
Plattformen der Verteiltheit – 1980er<br />
Plattformen der Verteiltheit : 1980-er<br />
– Anwendungsplattform LANs<br />
● Netzwerk-Betriebssysteme für Standard-Dienste<br />
– Betriebssysteme (d.h. DOS) wird um Zugriff auf gemeinsame<br />
Ressourcen erweitert<br />
DOS-Aufrufe (Interrupts) werden abgefangen und umgeleitet<br />
– typische Ressource: File- / Drucker-Server (unter speziellem<br />
Multitasking-BS)<br />
● Entwicklung angepasster verteilter Anwendungen<br />
auf der Ebene von<br />
– Interrupt-Handlern<br />
– C- / Assembler-Routinen<br />
– Anwendungsplattform Fern-Netze<br />
● Kommerzielle <strong>Systeme</strong>: X25, Proprietäre Protokolle mit entspr.<br />
speziellen APIs<br />
● Forschung: OSI-Protokolle, TCP/IP mit speziellen APIs<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 5
Plattformen der Verteiltheit – 1980er<br />
Anwendungsplattform<br />
Beispiel: Datenpaket unter IPX empfangen<br />
● Interrupt-Handler schreiben (in Assembler)<br />
– System-Kontext: Kein User-Stack<br />
– Register-Paar ES:SI enthält Zeiger auf ECB<br />
– ECB, Event-Control-Block: Datenstruktur mit Info über das Ereignis und mit<br />
Zeigern auf Fragmente des empfangenen Datenpakets<br />
– Aufruf C-Routine zur Annahme der Daten<br />
– Interrupt-Handler installieren<br />
● Empfangs-Routine in C schreiben<br />
– System-Kontext: Kein User-Stack<br />
– Grobe Analyse des ECB<br />
– Ablage der Daten im Userspace<br />
● Anwendungs-Programm<br />
– Test ob Daten angekommen<br />
– Daten annehmen, verarbeiten / Fehler behandeln<br />
● Notwendige Kenntnisse der Anwendungsentwickler<br />
– Assembler / C / komplexe APIs (Kontroll-Blöcke)<br />
– BS: Interrupts, Scheduling-/Tasking-Probleme, Funktion bestimmter Register,<br />
Stack, Stack-Frames, User-Space vs. System-Space, ...<br />
– Protokoll: Paketformat, ...<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 6
Plattformen der Verteiltheit – Ende 1980er<br />
Plattformen der Verteiltheit ~ Ende 1980-er<br />
– Protokolle<br />
● BS mit integriertem Protokoll-Stack<br />
– Unix-Varianten: TCP/IP<br />
– Mainframes, Mini-Computer (z.B. DEC): proprietäre Protokolle<br />
– (Lan-) Netz-Server (Netware): IPX/SPX<br />
– (Lan-) Netz-Server (IBM / MS, bis Bruch mit IBM->NT), OS/2): NETBIOS<br />
● installierbare Protokolle<br />
– PC: Netbios (IBM/MS), SPX/IPX (Netware), TCP/IP (Sun)<br />
– Mainframes, Mini-Computer: X25, TCP/IP, OSI-Protokolle<br />
– Typische Anwendungsplattform<br />
● Fernnetze: wie Ende 1980er, X25<br />
● LANs: Netbios, SPX/IPX mit speziellen APIs<br />
(abhängig von Protokoll- und Protokoll-Implementierung und BS)<br />
– Notwendige Kenntnisse der Anwendungsentwickler<br />
weit verbreit: LANs (vor allem unter Netware), X25 in Fernetzen<br />
● LANs unter NETWARE, NETBIOS: BS (Protokoll-Installation, -Konfiguration), API<br />
● WANs unter X25, TCP/IP, propr. Protokollen: BS-spezifische APIs<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 7
Plattformen der Verteiltheit – Frühe 1990er<br />
Plattformen der Verteiltheit ~ Frühe 1990-er<br />
– Protokolle<br />
● BS mit integriertem Protokoll-Stack<br />
– Unix-Varianten, Mini-Computer: TCP/IP<br />
– Mainframes, Mini-Computer (z.B. DEC): proprietäre Protokolle<br />
– (Lan-) Netz-Server (Netware): IPX/SPX<br />
– (Lan-) Netz-Server (MS-NT): NETBIOS<br />
● installierbare Protokolle<br />
– PC: Netbios (IBM/MS), SPX/IPX (Netware), TCP/IP (Sun)<br />
– Mainframes, Mini-Computer: X25, TCP/IP<br />
– Typische Anwendungsplattform<br />
Beginn der Vereinheitlichung der LAN- / WAN-Netze unter TCP/IP<br />
● Socket-API für TCP/IP und SPX/IPX<br />
● NETBIOS-API für Netbios-basierte LANs<br />
● Interaktion auf API für Nutzung von Schicht-4-Diensten, z.B. via Socket-API<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 8
Plattformen der Verteiltheit – Frühe 1990er<br />
– Interaktion auf Schicht-4<br />
● Rechner-Identifikation (IP-Adresse, DNS-Name, ..)<br />
● Anwendungs-Identifikation (Port, well-known-port, ..)<br />
● Datenaustausch (Pakete senden/empfangen, Verbindungen aufbauen nutzen, ..)<br />
● <strong>Verteilte</strong> Anwendung: Mangement von Inter-Prozess-Kommunikation<br />
● Entwicklung einer verteilte Anwendung ~ Socket-Programmierung<br />
– Notwendige Kenntnisse der Anwendungsentwickler<br />
● LAN / WAN: Schicht-4- API<br />
(Netbios / Socket-) API, Protokolle, Konfiguration der Protokoll-SW<br />
● WAN: BS-spezifische Schicht-4-APIs<br />
● Tiefere BS-Kenntnisse nicht mehr notwendig<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 9
Plattformen der Verteiltheit – Mitte 1990er<br />
Plattformen der Verteiltheit ~ Mitte 1990-er<br />
– Protokolle<br />
● alle BS mit integriertem Protokoll-Stack<br />
– TCP/IP weit verbreitet<br />
– Trennung der Technologie von LAN und WAN beendet<br />
– Anwendungsplattformen<br />
● typisch: Nutzung einer Schicht-4-API (Sockets)<br />
● Forschungsthema, Anwendung durch fortgeschrittene Entwickler<br />
– Abstraktion von Schicht-4 Diensten<br />
● z.B. OSI: Presentation- / Session-Layer<br />
– Unterstützung durch spezielle Dienste<br />
● z.B. Namensdienste<br />
– Standard-Code-Bausteine (generiert / bereit gestellt)<br />
● z.B. RPC<br />
– Bereitstellung von Standardlösungen in Bibliotheken<br />
● z.B. XDR<br />
– Integration in Programmiersprachen<br />
Middleware,<br />
SOA,<br />
....<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 10
Plattformen der Verteiltheit – Mitte 1990er<br />
● Protokoll-Stack bis Schicht-4 in BS integriert<br />
● Anwendungs-Protokolle als Anwendungsprogramme<br />
● Schicht-4- (Socket-) API in Programmiersprachen integriert<br />
● Höherwertige Unterstützung der Verteilung<br />
– Wetzwelt / OSI: als Schicht-4 / -5 konzipiert<br />
– Informatik<br />
● Forschung:<br />
– Fortsetzung der Integration in das BS (transparente Verteiltheit)<br />
● Praxis: Beginn der Middleware<br />
– Bibliotheken<br />
– Generierungs-Werkzeuge<br />
– Standard-Dienste<br />
zur Unterstützung der Entwickler / Entlastung von Standard-<br />
Aufgaben<br />
Nicht erfolgreich<br />
(Warum?)<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 11
Plattformen der Verteiltheit<br />
Plattformen der Verteiltheit :<br />
<strong>Verteilte</strong> <strong>Systeme</strong> als interagierende Prozesse<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 12
Plattformen der Verteiltheit<br />
<strong>Verteilte</strong>s <strong>Systeme</strong> auf Schicht-4 Diensten<br />
System = interagierende Prozesse<br />
in der Regel Client-Server-Struktur<br />
Interaktion: Kommunikation über Socket-API<br />
Themen<br />
Nutzung der Socket-API<br />
Struktur der Prozesse (der Server)<br />
Nebenläufigkeit der System-Komponenten<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 13
Protokolle: OSI / Internet<br />
Schicht 7<br />
Schicht 6<br />
Schicht 5<br />
Schicht 4<br />
Schicht 3<br />
Schicht 2<br />
Schicht 1<br />
Protokoll - (De-) Multiplexing<br />
Anwendungs-Protokolle<br />
Session/Presentation -> Middleware-Protokolle<br />
Internet-Protokolle<br />
ISO/OSI<br />
Protokolle<br />
Rahmen- / Paket-Struktur<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 14
Schicht-4 Service Access Point (SAP) : Sockets<br />
System<br />
FTP<br />
Anwendungen<br />
...<br />
SMTP<br />
verbindungsorientiert<br />
P-ID<br />
Ethernet<br />
Port<br />
TCP P-ID UDP<br />
IP<br />
TFTP<br />
verbindungslos<br />
Token-Ring Seriell<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 15<br />
...<br />
NFS<br />
Socket-API<br />
(De-)Multiplexing
Schicht-4 API: Socketkommunikation<br />
Sockets<br />
● Schnittstelle zur Schicht-4-Implementierung (BS)<br />
ursprünglich BSD-Unix,<br />
heute 'alle' <strong>Systeme</strong> (z.B. WinSock)<br />
Schicht-4 unabhängige Schnittstelle<br />
heute meist für TCP/IP Protokollstack<br />
● Verbindungsendpunkt (SAP Service-Accesspoint)<br />
● UPD<br />
Server stellt Daten-Socket bereit<br />
wartet auf Daten-Pakete von Client und antwortet<br />
● TCP<br />
Server stellt Verbindungs-Socket bereit<br />
wartet auf Verbindungswünsche von Clients<br />
Verbindung -> Daten-Socket<br />
-> bi-dirketionaler Datenstrom zum Client<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 16
Socket-Abstraktionen: Zugriff auf Schicht-4-API<br />
in Sprachen integriert<br />
Java (Package java.net)<br />
ServerSocket<br />
lokale Adr: IP+Port<br />
Server: accept<br />
● Socket<br />
● Client:<br />
ferne Adr: IP+Port<br />
Verbindungsaufbau, Kommunikation<br />
● Server:<br />
autom: ferne Adr<br />
Komminikation<br />
C# (Namespace system.net)<br />
● low-level:<br />
● Socket<br />
● IPEndPoint, IPAddress,...<br />
● high-level:<br />
● TCP-Client<br />
● TCP-Listener<br />
andere: Perl, TCL, Python, ...<br />
als Klassenbibliotheken<br />
z.B. C++: ACE (Adapitve<br />
Communication<br />
Environment)<br />
etc.: diverse andere<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 17
Prozesse / Threads: Nebenläufigkeit in Komponenten<br />
<strong>Verteilte</strong> <strong>Systeme</strong><br />
bestehen aus Komponenten,<br />
die durch Nachrichten<br />
kommunizieren<br />
Komponenten sind in der Regel<br />
nebenläufige <strong>Systeme</strong>, die<br />
aus Threads und/oder<br />
Prozessen bestehen<br />
Prozesse/<br />
Threads<br />
Nebenläufige<br />
Komponente<br />
<strong>Verteilte</strong>s System<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 18
<strong>Verteilte</strong> <strong>Systeme</strong> als interagierende Prozesse<br />
<strong>Verteilte</strong> <strong>Systeme</strong> als interagierende Prozesse:<br />
Struktur der Komponenten / Server<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 19
Struktur der Komponenten / Server : Nebenläufigkeit in Komponenten<br />
Nebenläufigkeit<br />
vereinfacht SW-Organisation<br />
unabhängige Ereignisverarbeitung,<br />
z.B. blockiernde I/O-Operationen möglich<br />
Verbesserung des Durchsatzes<br />
Nutzung mehrerer CPUs, Parallelität in sonstiger HW<br />
Nebenläufigkeit in Client/Server-<strong>Systeme</strong>n<br />
besonders wichtig für Server<br />
hohe Anforderungen effiziente HW-Nutzung (hohe Last)<br />
hohe Anforderung an Verfügbarkeit<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 20
Struktur der Komponenten / Server : Server-Architektur<br />
Architektur des Servers<br />
Ziele<br />
keine ignorierten Service-Anforderungen ( Denial-of-Service )<br />
hoher Durchsatz<br />
Einflussfaktoren<br />
Randbedingungen<br />
Plattformeigenschaften (HW / BS)<br />
Struktur der Anwendung<br />
Nutzung der Anwendung<br />
Protokoll-Struktur<br />
Verbindungslos / Verbindungsorientiert<br />
Request-Response / Sessions-Konzept<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 21
Serverarchitektur : Einflussfaktor Protokollstruktur<br />
Protokollstruktur<br />
● synchrones Request-Response Protokoll<br />
– Neue Anfragen erst nach Antwort auf die vorhergehende<br />
– Einsatz<br />
● Neue Anfragen hängen von der Antwort ab<br />
● Kurze Bearbeitungszeit + geringe Netz-Latenz (LAN)<br />
● Einfachheit vor Performanz<br />
● asynchrones Request-Response Protokoll<br />
– Anfragen und Antwort entkoppelt<br />
– Einsatz<br />
● Anfragen und Antworten sind nicht<br />
eng gekoppelt (z.B. HTTP-Gets)<br />
● Latenz im Netz groß (WAN)<br />
● Performanz vor Einfachheit<br />
synchrones<br />
Protokoll<br />
asynchrones<br />
Protokoll<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 22
Serverarchitektur : Einflussfaktor Protokoll<br />
Dienstdauer<br />
● Protokoll mit kurz andauerndem Dienst (short duration service)<br />
– Dienst umfasst eine kurze (feste) Zeitdauer<br />
– Oft eine Frage / eine Antwort<br />
– Oft verbindungslos<br />
– Beispiele:<br />
● HTTP<br />
● ARP<br />
● Time<br />
● Protokoll mit lang andauerndem Dienst (long duration service)<br />
– Dienst umfasst eine (unbestimmt) lange Zeitdauer<br />
– Oft Austausch mehrerer Nachrichten<br />
– Oft verbindungsorientiert<br />
– Beispiele<br />
● Telnet<br />
● FTP<br />
● etc.<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 23
Serverarchitektur : Einflussfaktor Dienststruktur<br />
● interner Dienst<br />
– Dienst wird im Adressraum des Servers ausgeführt<br />
– geringere Latenzzeit<br />
– Server in größerer Gefahr (Absturz / Hänger)<br />
– Bindung: Dienst<br />
● statisch<br />
● dynamisch zum Server gebunden<br />
● externer Dienst<br />
– Dienst wird in eigenem Adressraum ausgeführt (Prozess starten)<br />
– höhere Latenzzeit<br />
– Server weniger in Gefahr<br />
● Beispiel inetd<br />
– kann konfiguriert werden Dienste intern oder extern auszuführen<br />
– kurze Dienste intern / Lange Dienste extern<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 24
Serverarchitektur : Einflussfaktor Dienststruktur<br />
● zustandsloser Dienst (stateless service)<br />
– Dienst wird ohne Zustandsinformation im Server ausgeführt, jede Anfrage enthält alle<br />
Informationen, die notwendig sind, um sie auszuführen<br />
– Beispiel:<br />
● einfache Dienste,<br />
● NFS<br />
● HTTP (ohne Cookies, etc.)<br />
● zustandsbehafteter Dienst (stateful service)<br />
– Anfragen werden in Zustand ausgeführt,<br />
– Zustand<br />
● Verbindungs-/Sitzungs -Zustand: Protokoll wickelt FSM (endlichen Automat) ab<br />
● dauerhafter Zustand: Zustand dauerhaft (über die Dauer einer Sitzung hinaus)<br />
● Zustand Absturz-resistent<br />
– Beispiel:<br />
● Telnet / FTP: Sitzungszustand<br />
● Naming-Services: Absturz-resistent<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 25
Serverarchitektur : Einflussfaktor Dienststruktur<br />
● einfacher Dienst (single service server)<br />
– Server ist auf einen Dienst spezialisiert<br />
– Jeder Dienst benötigt seinen eigenen Server<br />
– Erhöhter Ressourcenbedarf / adminstrativer Aufwand<br />
– Robust<br />
● multipler Dienst (multi-service server)<br />
– Server bedient mehrere Dienste<br />
– Server bedient mit internem oder externem Dienst<br />
– Geringerer Rssourcenverbrauch / adminstrativer Aufwand<br />
– weniger robust<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 26
Serverarchitektur: Einflussfaktor Bereitschaft<br />
● Temporärer Server (one shot server)<br />
– Server wird auf ein Anfrage/Sitzung hin erzeugt, bedient nur diese<br />
– geringer Ressourcenbedarf<br />
– erhöhte Latenz<br />
● stehender Server (standing server)<br />
– Server wird bei Systemstart erzeugt<br />
– existiert permanent im Adressraum<br />
– Beispiel Apache Web-Server<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 27
Serverarchitektur: Einflussfaktor Verbindungs-/Sitzungskonzept<br />
Verbindungen und Sitzungen<br />
Verbindung (Connection)<br />
– Schicht-4 Konzept<br />
– Fehler-/Flusskontrolle erfordert Verbindung<br />
(Verbindung = Information über den Zustand der Kommunikation)<br />
Sitzung (Session)<br />
– Anwendungskonzept<br />
– „logische“ Verbindung der Kommpunikationspartner für die Dauer einer<br />
Interaktion<br />
– OSI-Modell: Session-Layer (so praktisch nie realisiert)<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 28
Verbindung / Session : Beispiel HTTP<br />
Beispiel HTTP<br />
basiert auf TCP-Verbindung<br />
Request-Response<br />
Kommunikation<br />
Session nach HTTP-<br />
Protokoll= Frage / Antwort<br />
reale Session der<br />
Anwendung oft länger<br />
Anwendung: Session = Einkaufstour<br />
HTTP: Session = Request / Response<br />
Schicht-4 : TCP Verbindung<br />
Schicht-3 : IP / verbindungslos<br />
Schicht-2 : Ethernet / verbindungslos<br />
Schicht-1 : physikalische Verbindung<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 29
Verbindung / Session : Multiplexing<br />
Verbindungen und Sitzungen<br />
Client-Threads<br />
ohne Multiplexing der Sitzungen<br />
● Jede Beziehung Client (Thread) – Service-Provider (Thread) (Session /<br />
Sitzung)<br />
hat ihre eigene Verbindung<br />
mit Multiplexing der Sitzungen<br />
● Eine gemeinsame Verbindung für jede Beziehung Client – Service-Provider<br />
Sitzungen Sitzungen<br />
TCP-Verbindung<br />
Server-Threads<br />
Client-Threads Server-Threads<br />
TCP-Verbindungen<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 30
Serverarchitektur: iterativer Server<br />
Iterativer Server<br />
● behandelt eine Anfrage komplett ab bevor die nächste betrachtet wird<br />
– WS-Strategie<br />
● Warteschlange für eintreffende Anfragen<br />
● Ignorieren<br />
● geeignet für<br />
– Dienste mit kurzen Bearbeitungszeiten<br />
– unregelmäßig und eher selten angefragte Dienste<br />
● Struktur<br />
for ever:<br />
retrieve request<br />
perform service<br />
send response<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 31
Serverarchitektur: iterativer Server<br />
● Vorteil<br />
– einfach<br />
– kein Thread- / Prozess-Overhead<br />
● Nachteil<br />
– eventuell schlechte Nutzung der Plattform-Fähigkeiten<br />
mehrere CPU's, asynchroner DMA-Transfer, ...<br />
– schlechte Antwortzeiten / Verlust von Anfragen<br />
– eventuell Sende-Wiederholung bei Time-out -> Problemverschärfung<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 32
Serverarchitektur: Nebenläufiger Server<br />
Nebenläufiger Server<br />
● bearbeitet mehrere Anfragen gleichzeitig<br />
– Threads (oder Prozesse)<br />
● Service-Art<br />
– single service : ein Dienst<br />
– multiple service : verschiedene Dienste<br />
● Einsatz<br />
– I/O-intensive Dienste<br />
– lang andauernde Dienste<br />
● Struktur<br />
– Thread (Prozess) pro Verbindung / Session<br />
– Thread (Prozess) pro Anfrage<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 33
Serverarchitektur: Nebenläufiger Server<br />
Struktur: Thread pro Session / Verbindung<br />
do for ever {<br />
handle = accept new connection;<br />
thread = get SessionThread(handle);<br />
thread.start();<br />
}<br />
Client C<br />
Client B<br />
Client A<br />
Clients<br />
while ( ! finished ) {<br />
msg = handle.getMsg();<br />
answer = preform service<br />
handle.send(answer)<br />
}<br />
Connection-Handler Protocol / Session=-Handler<br />
neuer<br />
Client<br />
Protocol/Session-Handler<br />
Connection-Handler<br />
Server<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 34
Serverarchitektur: Nebenläufiger Server<br />
Struktur: Thread pro Aufgabe: Leader / Follower<br />
do for ever {<br />
handle = accept new connection;<br />
thread = get LeaderThread(handle);<br />
thread.activate(handle);<br />
}<br />
Connection-Handler<br />
Clients<br />
Conn.-<br />
Handler<br />
Worker<br />
Leader<br />
Followers<br />
Synchronzier<br />
Leader / Followers Muster, synchron<br />
request = handle.getMsg();<br />
answer = preform service<br />
handle.send(answer)<br />
if ( ! finished ) {<br />
followerThread = Synchronizer.getThread ();<br />
followerThread.activate(handle);<br />
}<br />
Worker-Tread<br />
Leader nimmt die Anfrage an,<br />
gibt sie an den Follower weiter<br />
der damit zum Leader wird<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 35
Serverarchitektur: Reaktiver Server<br />
Reaktive Server (Reactive Server)<br />
● Verarbeiten mehrere Anfragen / Verbindungen<br />
virtuell gleichzeitig<br />
– ein Thread / Prozess<br />
– leichtgewichtiges (Anwendungs-) Multitasking<br />
● Struktur<br />
for ever<br />
requestEvents = select()<br />
for each event in requestEvents<br />
receive request<br />
perform service<br />
send response<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 36
Serverarchitektur: Reaktiver Server<br />
● Vorteil<br />
– kein Thread / Prozess – Overhead<br />
● Nachteil<br />
– kein Ausnutzen von Plattform-Parallelismus<br />
– Probleme in einer Verbindung / Verarbeitung (Deadlock / Loop)<br />
betrifft den gesamten Server<br />
– komplexere Programmierung<br />
● Programmierung<br />
– kurze / zustandslose Dienste: OK<br />
– Dienst mit Client-spezifischem Kontext :<br />
● FSM (endlicher Automat) pro Client verwalten<br />
– lange andauernde Dienste (z.B. Filetransfer)<br />
● blockieren Server oder<br />
● müssen mit Unterbrechungen (auf Anwendungsebene)<br />
realisiert werden (Multitasking auf Anwendungsebene)<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 37
Serverarchitektur: Reaktiver Server<br />
● Struktur<br />
– Warte auf I/O-Ereignis an einem von mehreren Handlern (select)<br />
– Verarbeite Ereignis<br />
Clients<br />
synchroner Event-Demultiplexer<br />
BS: select-System-Call<br />
Java: SocketChannel<br />
Server<br />
Reaktiver Server<br />
Client-spezifische<br />
Kontexte<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 38
Serverarchitektur: Reaktiver Server<br />
● Reaktor-Muster<br />
Gestaltung reaktiver Server<br />
beobachtet<br />
channel<br />
z.B. channel<br />
bearbeitet<br />
I/O-Ereignis<br />
Nach Douglas C. Schmidt: Reactor, An Object Behavioral Pattern for<br />
Demultiplexing and Dispatching Handles for Synchronous Events.<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 39
Serverarchitektur: Halb reaktiver / Halb nebenläufiger Server<br />
Mischform: Halb reaktiv / Halb nebenläufig (Half-sync / Half async)<br />
● Annahme der Anfragen / Verbindungen reaktiv<br />
● Weiterverarbeitung iterativ<br />
Clients<br />
Clients<br />
IO-Thread<br />
Worker<br />
Queue<br />
Leader<br />
Followers<br />
Synchronzier<br />
Worker<br />
Half-Sync / Half-Async<br />
mit Task-Queue<br />
Half-Sync / Half-Async<br />
mit Leader- und Follower-Threads<br />
Struktur<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 40
Serverarchitektur: Thread-Management<br />
Threads erzeugen / aufspannen (Thread Spawning)<br />
● Erzeugungs-Strategien<br />
– Im Voraus erzeugen (eager spawning)<br />
– Bei Bedarf erzeugen (on demand spawning)<br />
● Im Voraus erzeugte Threads<br />
– bei Start erzeugen und in einem Pool platzieren<br />
– vermeidet Erzeugungs-/Vernichtungs-Overhead<br />
– erfordert Thread-Verwaltung<br />
– Größe des Thread-Pools<br />
● ~ Zahl der CPUs<br />
● ~ Last<br />
● ~ dynamisch variabel<br />
– ~ Last<br />
– ~ aktuelle Länge der Warteschlange der Anfragen<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 41
Serverarchitektur: Thread-Management<br />
● Bei Bedarf erzeugen (on demand spawning)<br />
– Vorteil<br />
● Ressourcen-Schonung<br />
● einfacher<br />
– Nachteil<br />
● Schlecht konfigurierbar<br />
● Performance Probleme<br />
● längere Reaktionszeit<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 42
Serverarchitektur: Thread-Management<br />
● Task-basierte Thread-Zuteilung<br />
– pro Aufgabe ein Thread<br />
IO-Thread Task-1 Task-2<br />
Message<br />
– Nachrichten-basierte Thread-Zuteilung<br />
● pro Nachricht / Session / Verbindung ein<br />
Thread<br />
Message<br />
Message<br />
Task-1<br />
Task-2<br />
...<br />
Task-1<br />
Task-2<br />
...<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 43<br />
...<br />
Muster z.B.:<br />
Pipes and Filters<br />
Muster z.B.:<br />
Half-sync / Half-Async
Server-Architektur: Threading-Strategie<br />
Threading-Strategie<br />
– ein Thread<br />
● select<br />
● Bedienen der Ereignisse<br />
● andere Aktivitäten<br />
– zwei Threads<br />
● select / Ereignise bedienen<br />
● andere Aktivitäten<br />
– Thread-Pool<br />
● Thread: select<br />
● Thread-Pool: Ereignisse bedienden<br />
– Mehrere Threads / Thread-Pools<br />
● Thread: select<br />
● Thread(-Pool) A: Ereignisklasse A<br />
● Thread(-Pool) B: Ereignisklasse B<br />
● etc.<br />
Schlecht: select blockiert<br />
OK bei 1-Prozessor System<br />
(welcher Server ist das noch?)<br />
Anpassbar an System<br />
Ereignisbehandlung<br />
konfigurierbar (Wichtigkeit, ...)<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 44
Server-Architektur: Thread-Erzeugung / Thread-Aufgaben<br />
● Thread-Erzeugung und Thread-Aufgaben<br />
– Thread-Erzeugung<br />
● Wann / Wie werden Threads erzeugt<br />
– Thread vs. Task<br />
● Welche Aufgaben werden den Threads zugeteilt<br />
– Thread vs. I/O Ereignis<br />
● welche(r) Thread(s) bearbeiten I/O-Ereignisse<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 45
Plattformen der Verteiltheit<br />
Plattformen der Verteiltheit :<br />
Einfache Abstraktionen über der Socket-Ebene in Java<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 46
Abstraktionen oberhalb der Socket-Ebene in Java<br />
Einfache Abstraktionen über der Socket-Ebene in Java:<br />
URL<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 47
URL Uniform Resource Locator<br />
Ein URL lokalisiert Web-Ressourcen: Wo und wie finde ich etwas<br />
Beispiele:<br />
http://en.wikipedia.org/wiki/Uniform_Resource_Identifier#References<br />
shttp://meine.bank.de<br />
http://127.0.0.1:8080/factorize?number=1234<br />
ftp://anonymous:anonymous@fileserver.irgend.wo/downloads<br />
mailto://admin@mailserv.fh-giessen.de<br />
URL Aufbau Beispiel<br />
Scheme (Protocol) Zugriffsprotokoll http<br />
Authority Besitzer www.fh-giessen.de<br />
Path lokaler Weg zur Ressource /home/~hg51/index.html<br />
Query-String Suche in der Ressource searchString=java<br />
Fragment Id (Ref) Index in der Ressource #intro<br />
einzelne Bestandteile können fehlen<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 48
URL Uniform Resource Locator<br />
Syntax / Beispiel (aus RFC 3986):<br />
foo://example.com:8042/over/there?name=ferret#nose<br />
Zeichensatz:<br />
foo Schema<br />
example.com:8042 Authority<br />
/over/there Path<br />
name=ferret Query<br />
nose Fragment<br />
US-ASCII-Zeichen in der Codierung 'der Umgebung' (umgebender Text /<br />
Übertragungs-Protokoll)<br />
a .. z, A .. Z, 0 .. 9, -, ., _, ~ (Alphanumerisch, Punkt, Bind-/Unterstrich, Tilde)<br />
Zeichen mit besonderer Bedeutung: / ? # [ ] @ : ! $ & ' ( ) * + , ; = %<br />
%HEX-Code für alle anderen und die mit besonderer Bedeutung<br />
z.B. %25 für % . Sonderformen möglich, z.B. + für ' ' (Blank)<br />
Hexcode ist abhängig von der (impliziten) Codierung!<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 49
URL in Java<br />
Umschlagklasse für einen URL: java.net.URL<br />
mit:<br />
Konstruktoren zur Konstruktion<br />
getter-/setter-Methoden für die URL-Komponenten<br />
Methoden zum Aufbau einer Verbindung zur Ressource<br />
Verbindungsaufbau<br />
basiert auf Protocol-Handler<br />
Protocol-Handler<br />
von JVM implementiert (abhängig von der JVM)<br />
von der Anwendung zur Verfügung gestellt<br />
java.net Class URL<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 50
URL in Java<br />
Beispiel : Test welche Protokoll-Handler stellt die JVM zur Verfügung ?<br />
import java.net.MalformedURLException;<br />
import java.net.URL;<br />
public class JVMProtocolHandler {<br />
public static void main(String[] args) {<br />
String[] standardProtocols = {<br />
"http", "https", "ftp", "mailto",<br />
"telnet", "file", "ldap"};<br />
for ( String p : standardProtocols)<br />
try {<br />
URL url = new URL(p+"://some.where");<br />
System.out.println(p + "\t is OK");<br />
} catch(MalformedURLException e) {<br />
System.out.println(p<br />
+ "\t is not supported");<br />
}<br />
}<br />
}<br />
mögliche Ausgabe<br />
Die Tests auf<br />
Wohlgeformtheit der<br />
URL sind grob und<br />
nicht Protokollspezifisch<br />
(z.B.<br />
mailto-URL ist nicht<br />
korrekt). Die<br />
Verfügbarkeit des<br />
Handlers wird<br />
geprüft. - Kein Test<br />
ob die URL<br />
erreichbar ist.<br />
http is OK<br />
https is OK<br />
ftp is OK<br />
mailto is OK<br />
telnet is not supported<br />
file is OK<br />
ldap is not supported<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 51
Zugriff auf URL-Ressource<br />
Zugriff auf die Daten der Ressource auf die eine URL zeigt<br />
mit Hilfe der URL-Methoden:<br />
InputStream openStream();<br />
verbindet sich mit der Ressource liefert InputStream zum Lesen der Daten<br />
URLConnection openConnection();<br />
erzeugt Verbindung zur Ressouce zm lesen / schreiben von Daten,<br />
Zugriff auf weitere Info<br />
URLConnection openConnection(Proxy proxy);<br />
erzeugt Verbindung via Proxy<br />
Object getContent();<br />
liest Daten der Ressource und erzeugt ein Objekt aus diesen Daten<br />
Object getContent(Class[] classes);<br />
liest Daten und erzeugt ein Objekt daraus, die Klassen sind<br />
Vorschläge für die Klasse des neu erzeugten Objekts<br />
java.net Class URL<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 52
Zugriff auf URL-Ressource / Beispiel openStream<br />
public class URLViewer {<br />
public static void main(String[] args) {<br />
Scanner scan = new Scanner(System.in);<br />
String urlString = scan.nextLine();<br />
try {<br />
URL url = new URL(urlString);<br />
InputStream inS = url.openStream();<br />
int c;<br />
while ( (c = inS.read()) != -1 ) {<br />
System.out.print((char)c);<br />
}<br />
} catch (MalformedURLException e) {<br />
System.err.println("malformed url "+e);<br />
} catch (IOException e) {<br />
e.printStackTrace();<br />
}<br />
}<br />
}<br />
erzeugt:<br />
Zugriff auf lokalen Tomcat mit<br />
der URL-Eingabe:<br />
http://127.0.0.1:8080<br />
<br />
<br />
<br />
<br />
Apache Tomcat/5.0<br />
.... etc ...<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 53
Zugriff auf URL-Ressource / Beispiel getContent<br />
public class URLContentGetter {<br />
public static void main(String[] args) {<br />
Scanner scan = new Scanner(System.in);<br />
String urlString = scan.nextLine();<br />
Class[] urlTypes = { String.class, Image.class, InputStream.class };<br />
try {<br />
URL url = new URL(urlString);<br />
}<br />
}<br />
Eingabe:<br />
Ausgabe:<br />
Object obj = url.getContent(urlTypes);<br />
if ( obj instanceof String ) {<br />
System.out.println("String found at "+urlString);<br />
} else if ( obj instanceof Image ) {<br />
System.out.println("Image found at "+urlString);<br />
} else if ( obj instanceof InputStream ) {<br />
System.out.println("InputStream found at "+urlString);<br />
} else<br />
System.out.println("Can not handle "+urlString);<br />
} catch (MalformedURLException e) {<br />
System.err.println("malformed url "+e);<br />
} catch (IOException e) { e.printStackTrace(); }<br />
file:///home/thomas/Documents/Pictures/applelogo.gif<br />
Image found at file:///home/thomas/Documents/Pictures/applelogo.gif<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 54
Zugriff auf URL-Ressource / Beispiel openConnection<br />
public class ConnectionOpener {<br />
public static void main(String[] args) {<br />
Scanner scan = new Scanner(System.in);<br />
String urlString = scan.nextLine();<br />
try {<br />
URL url = new URL(urlString);<br />
}<br />
}<br />
URLConnection connection = url.openConnection();<br />
System.out.println(connection.getContentEncoding());<br />
System.out.println(connection.getContentType());<br />
Object obj = connection.getContent(<br />
new Class[]{ String.class, InputStream.class});<br />
if ( obj instanceof String ){<br />
System.out.println("String found: "+(String)obj);<br />
}<br />
if ( obj instanceof InputStream ){<br />
System.out.println("InputStream found ");<br />
}<br />
} catch (MalformedURLException e) { System.err.println("malformed "+e);<br />
} catch (IOException e) { e.printStackTrace(); }<br />
Eingabe:<br />
Ausgabe:<br />
http://127.0.0.1:8080<br />
null<br />
text/html;charset=ISO-8859-1<br />
InputStream found<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 55
Abstraktionen oberhalb der Socket-Ebene in Java<br />
Einfache Abstraktionen über der Socket-Ebene in Java:<br />
URI<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 56
URI Uniform Resource Identifier<br />
Ein URI identifiziert eine Ressource<br />
Verallgemeinerung der URL<br />
Beispiele:<br />
URL lokalisiert<br />
URI identifiziert die Identifikation kann auch lokalisieren,<br />
sie muss aber nicht.<br />
Alle URLs sind URIs (aber nicht umgekehrt)<br />
URI Verwendung: als URL / zur Identifikation in div. XML-Technologien<br />
http://en.wikipedia.org/wiki/Uniform_Resource_Identifier<br />
tel:+1-816-555-1212<br />
urn:isbn:0-395-36341-1<br />
urn:oasis:names:specification:docbook:dtd:xml:4.1.2<br />
URI Aufbau Beispiel<br />
Scheme Name : urn :<br />
Schema-spezifischer Teil oasis:names:specification:docbook:dtd:xml:4.1.2<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 57
URI Uniform Resource Identifier<br />
URI Schemes Beispiele (http://www.iana.org/assignments/uri-schemes.html)<br />
URI Scheme Description Reference<br />
acap application configuration access protocol [RFC2244]<br />
cid content identifier [RFC2392]<br />
dns Domain Name System [RFC4501]<br />
fax fax [RFC3966]<br />
file Host-specific file names [RFC1738]<br />
ftp File Transfer Protocol [RFC1738]<br />
http Hypertext Transfer Protocol [RFC2616]<br />
https Hypertext Transfer Protocol Secure [RFC2818]<br />
imap internet message access protocol [RFC2192]<br />
info Information Assets with Identifiers in Public Namespaces [RFC4452]<br />
ldap Lightweight Directory Access Protocol [RFC4516]<br />
mailto Electronic mail address [RFC2368]<br />
news USENET news [RFC1738]<br />
nfs network file system protocol [RFC2224]<br />
nntp USENET news using NNTP access [RFC1738]<br />
pop Post Office Protocol v3 [RFC2384]<br />
tel telephone [RFC3966]<br />
telnet Reference to interactive sessions [RFC4248]<br />
urn Uniform Resource Names [RFC2141]<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 58
URI / URL / URN<br />
URI<br />
Uniform: Syntax entspricht RFC 2396: Uniform Resource Identifiers (URI): Generic<br />
Syntax.<br />
Resource: Irgendetwas<br />
Identification: Identifizieren / Lokalisieren / Holen<br />
URL URN URI Entwicklung: Identifizieren / Lokalisieren<br />
Ausgangskonzept URL: Identifizieren / Holen<br />
URI : Verallgemeinerung von URL<br />
URN: Uniform Resource Name<br />
Identifikation einer Ressource unabhängig von Ort und<br />
Zugriffsmethode/Möglichkeit („Ein http-URI ist ein URL“)<br />
URN wird (eventuell) abgebildet auf URL-1, URL-2, ...<br />
URI seit 2001 (http://www.w3.org/TR/uri-clarification)<br />
URI ist Oberbegriff<br />
URL informales Konzept lokalisierbarer Ressourcen („Klick-bar“)<br />
URN ist Schema (hierachisch aufgebaut) (urn:xx:yy:zz)<br />
Resolution (Auflösung): nicht global geklärt<br />
(dns-URIs haben global definierte Auflösung, andere nicht)<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 59
URI in Java<br />
java.net.URI<br />
Umschlagklasse für URIs (konstruieren / analysieren)<br />
Vergleich zur java.net.URL<br />
eher konform zu aktuellen WEB-Standards<br />
URI identifiziert nur: kein (direkter) Verbindungsaufbau<br />
relative und absolute URIs möglich<br />
java.net Class URI<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 60
URI / URL / URLConnection<br />
Idee<br />
Schema -> Protokoll -> Protokoll-Handler<br />
Klassen<br />
URL / URLStreamHandler / URLConnection ...<br />
definieren zusammen<br />
Protokoll-Handler<br />
Bewertung<br />
OK für vordefinierte Schemata (Protokolle)<br />
speziell für HTTP GET / POST (?)<br />
Neue Protokolle ~> müssen JVM bekannt gegeben werden<br />
Umständliche / Verwirrende API, kaum Mehrwert gegen Sockets<br />
Kaum genutzt<br />
Neue / Eigene Protokolle ~> Socket-Kommunikation<br />
„In the early days of Java, Sun promised<br />
that protocols could be installed at runtime<br />
from the server that used them. [...]<br />
However, the loading of prtocol handlers<br />
from web sites was never implemented,<br />
and Sun doesn't talk much about it<br />
anymore.<br />
Elliotte Rusty Harold<br />
in Java Network Programming, O'Reilly<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 61
URI in Java / Beispiel get-Abfrage Verbindungsaufbau via URL<br />
public class URIViewer {<br />
public static void main(String[] args) {<br />
try {<br />
URI uri = new URI(<br />
"http", //Scheme<br />
null, //Authority<br />
"192.168.187.196", //Host<br />
8080, //Port<br />
"/hg51WebApp/GetFactorizer", //Path<br />
"zahl=12&submit=los+gehts", //Query<br />
null //Fragment<br />
);<br />
URL url = uri.toURL();<br />
InputStream inS = url.openStream();<br />
int c;<br />
while ( (c = inS.read()) != -1 ) {<br />
System.out.print((char)c);<br />
}<br />
} catch (MalformedURLException e){ e.printStackTrace();<br />
} catch (URISyntaxException e) { e.printStackTrace();<br />
} catch (IOException e) { e.printStackTrace(); }<br />
}<br />
}<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 62
URI in Java / Beispiel get-Abfrage / HTML als HTML anzeigen<br />
public class URIViewer {<br />
public static void main(String[] args) {<br />
try {<br />
URI uri = new URI( "http",null,"192.168.187.196",<br />
8080,"/hg51WebApp/GetFactorizer",<br />
"zahl=12&submit=los+gehts",null);<br />
URL url = uri.toURL();<br />
InputStream inS = url.openStream();<br />
byte[] byteA = new byte[1024];<br />
int c; int i = 0;<br />
while ( (c = inS.read()) != -1 ) {<br />
byteA[i++] = (byte)c;<br />
}<br />
JEditorPane jp = new JEditorPane();<br />
jp.setContentType("text/html");<br />
jp.setText(new String(byteA, 0, i, "UTF8"));<br />
JFrame jf = new JFrame("Result");<br />
jf.setContentPane(jp);<br />
jf.setSize(512, 254);<br />
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
jf.setVisible(true);<br />
} catch (MalformedURLException e){ e.printStackTrace();<br />
} catch (URISyntaxException e) { e.printStackTrace();<br />
} catch (IOException e) { e.printStackTrace(); }<br />
}<br />
}<br />
<strong>Verteilte</strong> <strong>Systeme</strong> Th Letschert, FH Giessen 63