19
Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierun g Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011 WS 2011/2012

Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Embed Size (px)

Citation preview

Page 1: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Java für FortgeschritteneKurseinheit 06

Netzwerkprogrammierung

Thomas KlutschFlorian KöttnerDienstag, 26. Juli 2011 WS

2011/2012

Page 2: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Aufbau der Einheit:

1. Einleitung: Terminolgie

Zugriff auf eine URL

2. Socket für Server/Client-Applikation Server

Client

3. RMI für Server/Client-Applikation Server

Client

Netzwerkprogrammierung Folie 2 von 19

Page 3: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

1. Einleitung

Terminologie:

Host: am Netz angeschlossener Rechner. IP-Adresse: Identifikation eines Hosts, IPv4 als 32-Bit-Zahl, IPv6 128-

Bit-Zahl. DNS (Domain Name Service): Zuordnung eines Namens zur IP-

Adresse.

Kommunikation zweier Host über Datenpakete welche über den IP (Internet Protocol) Standard vermittelt werden (Datenpaket = body + header).

Weiterleitung von Paketen über Router (Routing Protokolle). IP als verbindungsloses Protokoll, Daten können verloren/verdoppelt

werden TCP/IP, also Transmission Control Protocol als Erweiterung zur

korrekten Reihenfolgeeinhaltung und Verlustmanagement bei IP-Paketen.

Weitere Protokolle: User Datagram Protocol (UDP)

Java: Programmierung auf Sockets, einer API auf TCP-Ebene

Folie 3 von 19

Netzwerkprogrammierung

Page 4: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Zugriff auf eine URL (Uniform Resource Locator):

• Klasse URL aus java.net

Folie 4 von 19

Netzwerkprogrammierung

1. Einleitung

Page 5: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Aufgabe 1:

Geben sie den Inhalt der Textdatei unter http://dl.dropbox.com/u/1482728/Text.txt auf der Konsole aus!

1. Erstellen Sie eine neue Klasse mit dem Namen: ReadFromUrl

2. Erstellen Sie ein URL-Objekt mit obiger Pfadangabe!

3. Benutzen Sie geeignete Methoden aus dem Kapitel Input/Output um die Textdatei auszulesen und auf der Konsole anzeigen zu lassen.

Netzwerkprogrammierung

1. Einleitung

Folie 5 von 19

Page 6: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

• Klasse: URL-Connection Abstrakte Klasse zum Empfang der Inhalte der URL-Objekte

enthält verschiedene Methoden um z.B. den Header einer HTTP-Seite auszulesen

• Klasse: Authenticator Geeignet bei Authentifizierungsbitte/Passwortabfrage

Netzwerkprogrammierung

1. Einleitung

Folie 6 von 19

Page 7: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

• Klasse InetAdress Gibt uns Methoden zum Auslesen der IP-Adresse oder des Hostnamens

einer URL

„wir können also die Rolle des DNS übernehmen“

ebenso kann die lokale IP-Adresse des eigenen Rechners mit getLocalHost() ausgelesen werden

Netzwerkprogrammierung

1. Einleitung

Folie 7 von 19

Page 8: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

2. Sockets

2. Sockets für eine Server/Client-Applikation• Bisher: high-level Programmierung ohne Einblick in TCP/IP Protokolle

• Nun: eigene Server/Client-Applikationen mit sicherer/verlustfreier Verbindung

Java-Sockets

Ein Socket ist eine Datenstruktur zur Administration von (Netzwerk-) Verbindungen. Ein Socket ist ein Endpunkt einer bidirektionalen Kommunikationsbeziehung zwischen zwei im Netz laufenden Programmen (Prozessen).

Endpunkt 1: Server

Javaklasse: ServerSocket (TCP)

Dieser bietet einen Dienst an und wartet auf eingehende Verbindungen Endpunkt 2: Client

Javaklasse: Socket (TCP)

Dieser verbindet sich zu einem Server und benutzt den angebotenen Dienst des Servers

Netzwerkprogrammierung Folie 8 von 19

Page 9: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Die wichtigsten Klassen aus java.net zur Realisierung von Socketverbindungen (TCP):

.Socket

.ServerSocket

.DataInputStream

.PrintStream

.DataOutputStream

.URL

.URLConnection

2. Sockets

Netzwerkprogrammierung Folie 9 von 19

Page 10: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Erstellung eines Sockets als Serverendpunkt einer Verbindung:

1. Schritt: Ein ServerSocket Objekt erzeugen:

ServerSocket listenSocket = new ServerSocket(portNumber);

2. Schritt: Ein Socket Objekt aus dem ServerSocket erzeugen:

while (someCondition) { Socket server = listenSocket.accept();

doSomethingWith(server); }

3. Schritt: Ein “input stream” erzeugen:

BufferedReader in = new BufferedReader(new InputStreamReader(

server.getInputStream()));

4. Schritt: Ein “output stream” erzeugen:

PrintStream out = new PrintStream(server.getOutputStream());

5. Schritt: Nutzdaten senden und empfangen.

in.readLine(); out.println();

6. Schritt: Ströme schließen: out.close(); in.close();

7. Schritt: Socket schließen: server.close();

2. Sockets

Netzwerkprogrammierung Folie 10 von 19

Page 11: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Erstellung eines Sockets als Clientendpunkt einer Verbindung

1. Schritt: Ein Socket Objekt erzeugen (Öffnen eines Sockets):

Socket client = new Socket(“hostname”,portNumber);

2. Schritt: Ein “output stream” erzeugen, um Daten zu senden:

PrintStream out = new PrintStream(client.getOutputStream()); bzw.

DataOutputStream out2 = new DataOutputStream(client.getOutputStream());

3. Schritt: Ein “input stream” erzeugen, um die Antwort des Servers zu

empfangen:

DataInputStream in = new DataInputStream(client.getInputStream()); bzw.

BufferedReader in = new BufferedReader(

new InputStreamReader(Client.getInputStream()));

4. Schritt: Nutzdaten senden und empfangen.

in.readLine(); out.println(); aber out2.writeBytes();

5. Schritt: Ströme schließen: out.close(); in.close();

6. Schritt: Socket schliessen: client.close();

Netzwerkprogrammierung

2. Sockets

Folie 11 von 19

Page 12: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Aufgabe 2:

Schreiben sie eine Server/Client-Applikation auf Basis von Sockets und dem TCP-Verbindungsprotokoll, welche folgendes ermöglicht:

1. Eine Klasse TCP-Server wartet auf die Verbindung eines Clients.

2. Eine Klasse TCP-Client verbindet sich mit dem Server und liest eine Benutzereingabe auf der Konsole ein.

3. Dies Konsoleneingabe soll über eine Socketverbindung an den Server geschickt werden, welcher die Eingabe in „upper-case“-Darstellung dem User zurückgibt.

4. Nach erfolgreicher Rückgabe wird der Client geschlossen, der Server wartet jedoch weiterhin auf Verbindungen!

Netzwerkprogrammierung

2. Sockets

Folie 12 von 19

Page 13: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

3. RMI für eine Server/Client-Applikation

Ziel: entfernte Objekte und Methoden aufrufbar! Sicht auf entfernte Dienste wie auf Methoden innerhalb einer

Laufzeitumgebung ein Methodenaufruf auf einen Server soll so aussehen, als ob er eine

lokale Methode wäre.

RMI (Remote Method Invocation) macht es möglich, auf hohem Abstraktionsniveau zu arbeiten und entfernte Methodenaufrufe zu realisieren.

Automatisch generierte Stellvertreter nehmen die Daten entgegen und übertragen sie zum Server. Nach der Antwort präsentiert der Stellvertreter das Ergebnis.

3. RMI

Netzwerkprogrammierung Folie 13 von 19

Page 14: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

3 Teile von RMI:

1. Server stellt das entfernte Objekt mit einer Methodenimplementierung bereit, er leitet also eingehende Anfragen vom Netzwerk an diese Methode weiter.

2. Ein Namensdienst (Registry) verbindet Objekte mit ihren Methoden unter einem eindeutigen Namen. Der Server meldet Objekte mit ihren Methoden beim Namensdienst an.

3. Der Client möchte auf eine Methode des entfernten Objektes zugreifen und frägt demnach erst beim Namensdienst an, um Zugriff zu bekommen.

Netzwerkprogrammierung

3. RMI

Folie 14 von 19

Page 15: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Der RMI Server1. Eine entfernte Schnittstelle deklariert Methoden.

2. Eine Klasse implementiert die Schnittstelle und füllt die Methode mit Leben => Remote-Objekt-Implementierung.

Netzwerkprogrammierung

3. RMI

Folie 15 von 19

Page 16: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

3. RMI

Netzwerkprogrammierung

3. Der Server meldet das entfernte Objekt unter einem öffentlichen Namen bei der Registry an und muss es vor der Bereitstellung für die Clients exportieren, um für eine eingehende Verbindung bereit zu sein.

Folie 16 von 19

Page 17: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Netzwerkprogrammierung

Der RMI Client1. Um entfernte Methoden zu nutzen, muss ein entferntes

Objekt gesucht und angesprochen werden. Dazu fragen wir den Namensdienst. Der Name für das Objekt setzt sich aus der URL und dem Namen des Dienstes zusammen.

3. RMI

Folie 17 von 19

Page 18: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Aufgabe 3:

Schreiben sie eine Server/Client-Chatapplikation auf Basis von RMI, welche folgendes ermöglicht:

1. Ein Server bietet einen Dienst an, welcher beliebig viele Nutzer zwischenspeichert und jedem Chatteilnehmer eine andere Schriftfarbe gibt.

2. Der Server verwaltet alle Nachrichten und schickt sie an alle teilnehmenden Clients. Eine kleine GUI beschreibt Ereignisse wie connect und disconnect von Benutzern.

3. Clients müssen beim Start der Applikation ihren Namen und eine IP-Adresse des Servers angeben und sind bei erfolgreichem Finden der Adresse mit dem Server verbunden.

4. Eine kleine GUI beim Client ermöglicht die Darstellung der Nachrichten, sowie die Namen der verbundenen Clients und ein Eingabefeld.

Netzwerkprogrammierung

3. RMI

Folie 18 von 19

Page 19: Java für Fortgeschrittene Kurseinheit 06 Netzwerkprogrammierung Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011WS 2011/2012

Beispiel-Gui für die Applikation:

3. RMI

Netzwerkprogrammierung Folie 19 von 19