Java für FortgeschritteneKurseinheit 06
Netzwerkprogrammierung
Thomas KlutschFlorian KöttnerDienstag, 26. Juli 2011 WS
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
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
Zugriff auf eine URL (Uniform Resource Locator):
• Klasse URL aus java.net
Folie 4 von 19
Netzwerkprogrammierung
1. Einleitung
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
• 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
• 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
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
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
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
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
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
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
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
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
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
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
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
Beispiel-Gui für die Applikation:
3. RMI
Netzwerkprogrammierung Folie 19 von 19