03.03.2013 Aufrufe

Verteilte Systeme - Proteus

Verteilte Systeme - Proteus

Verteilte Systeme - Proteus

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!