Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Verteilte Systeme - Java Networking (Sockets) Prof. Dr. Michael Cebulla 30. Oktober 2014 Fachhochschule Schmalkalden Wintersemester 2014/15 1 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Gliederung 2 / 36 1 Grundlagen TCP/IP 2 Sockets in Java Klassen in Java 3 Programmieren mit Streams Programmierung 4 Weitere Themen Datagram Sockets Asynchrone Server M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Outline 3 / 36 1 Grundlagen TCP/IP 2 Sockets in Java Klassen in Java 3 Programmieren mit Streams Programmierung 4 Weitere Themen Datagram Sockets Asynchrone Server M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Referenz-Architektur: OSI-Modell Jede Schicht behandelt einen Aspekt der Kommunikation Von der Hardware-/Treiber-Ebene bis zur Anwendungsschicht Jede Schicht bietet eine Menge von Protokollen 4 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen TCP/IP In der Praxis spielt das Modell von TCP/IP eine größere Rolle. Hier werden nur vier Schichten unterschieden. TCP: Transmission Control Protocol UDP: User Datagram Protocol 5 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Verbindungsorientierte Kommunikation Anforderung In einer Client-Server-Architektur muss die Kommunikation verlässlich sein. Daten dürfen nicht verloren gehen oder in der falschen Reihenfolge ankommen. TCP umfasst: Verlässliche Point-to-point Verbindung zwischen zwei Programmen im Netzwerk Sockets werden als Endpunkte an die Verbindung gebunden Um zu kommunizieren, schreiben und lesen die Clients und Server in bzw. von den Sockets. Beispielhafte Anwendungen: http, ftp, telnet (verbindungsorientiert, verlässlich) 6 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen User Datagram Protocol (UDP) Nicht verbindungsorientiert UDP sendet unabhängige Datenpakete (Datagramme). Die Ankunft ist nicht garantiert. Insbesondere wird nicht - wie bei TCP - eine Verbindung aufgebaut. Gut geeignet für Anwendungen, die in großem Stil Statusdaten übertragen. Der Aufbau einer Verbindung würde hier nur aufhalten. Beispiel: ein Server, der die Uhrzeit sendet. Wenn ein Paket nicht ankommt, reicht es aus, auf das nächste zu warten. weiteres Beispiel: ping. 7 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Ports Ein Rechner hat normalerweise eine physikalische Verbindung zum Internet und zu einem anderen Rechner. Daten die für verschiedene Applikationen bestimmt sind, werden anhand der Port-Nummern unterschieden. Ports werden durch 16-bit Zahlen beschrieben, die von TCP und UDP verwendet werden (Zahlenbereich: 0 - 65.535). TCP-Server binden ihren Socket an einem Port, so dass sie von da an alle Daten empfangen, die an diesen Port gesendet werden. 8 / 36 M. Cebulla Im Falle von UDP, werden die Pakete dynamisch anhand der Portnummern geroutet. Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Was ist ein Socket? Socket Endpunkt einer bidirektionalen Kommunikationsverbindung zwischen zwei Programming im Netz. Ein Socket ist an eine Port-Nummer gebunden, so dass die TCP-Schicht die Anwendung identifizieren kann, die die Daten erhalten soll. Der Server wartet und lauscht an einem Socket, der an eine Port-Nummer gebunden . Der Client kennt den Rechnernamen und die Portnummer, an der der Server auf eine Nachricht wartet Der Client startet eine Verbindungsanfrage, wobei er sich mit seiner Portnummer identifiziert. Der Server akzeptiert die Verbindung. Nach dem Akzeptieren durch den Server ist der Socket auf der Client-Seite erfolgreich erezugt und kann benutzt werden. Client und Server können jetzt über die Sockets kommunizieren 9 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Klassen in Java Outline 10 / 36 1 Grundlagen TCP/IP 2 Sockets in Java Klassen in Java 3 Programmieren mit Streams Programmierung 4 Weitere Themen Datagram Sockets Asynchrone Server M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Klassen in Java Networking in Java Die Programmierung findet auf dem Application Layer statt. Zum Zugriff auf die Transportschicht stehen die Klassen aus dem java.net-Package zur Verfügung. Die Internas der Transportschicht werden verborgen. Es müssen lediglich die geeigneten Klassen ausgewählt werden. 11 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Klassen in Java Das Package java.net TCP: Socket und ServerSocket, URL und URLConnection UDP: DatagramSocket, DatagramPacket, MulticastSocket 12 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Klassen in Java Die Klasse Socket - TCP Das java.net-Package der Java-Plattform enthält die Klasse Socket Die Klasse Socket implementiert eine Seite einer bidirektionalen Verbindung Die Klasse Socket verbirgt die plattformspezifischen Details der Kommunikation Die Klasse ServerSocket implementiert die Server-seitigen Funktionalitäten 13 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Klassen in Java Einrichtung einer Verbindung zwischen Sockets Auf dem Server ist ein Socket (mit Portnummer) eingerichtet, auf dem nach einer Verbindungsanfrage gelauscht wird. Der Client kennt den Hostnamen und die Portnummer und nimmt zum Server Kontakt auf. Ihm wird automatisch eine Portnummer zugewiesen. Wenn die Anfrage des Clients akzeptiert wird, wird eine Verbindung eingerichtet und die eigentliche Kommunikation kann beginnen. 14 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Klassen in Java Die Klassen Socket und ServerSocket 15 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Outline 16 / 36 1 Grundlagen TCP/IP 2 Sockets in Java Klassen in Java 3 Programmieren mit Streams Programmierung 4 Weitere Themen Datagram Sockets Asynchrone Server M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Das Package Java.io I/O Streams sind mächtige Abstraktionen über verschiedene Eingabe- oder Ausgabegeräte: z.B. Dateien, Geräte, andere Programme und Speicher-Arrays. Ein Stream repräsentiert auf Programmierungsebene ein Gerät. Streams unterstützen verschiedene Datentypen wie z.B. primitive Datentypen, Zeichenketten und Objekte. Manche Streams übertragen einfach Daten, andere transformieren sie in verschiedenen Weisen. 17 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Input- und Outputstreams 18 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Input Stream 19 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Output Stream 20 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Kapselung von Byte-Streams Byte-Streams sind low level. Die Klassen InputStreamReader und OutputStreamReader kapseln die Bytestreams und ermöglichen beispielsweise die Verwendung von Characters. PrintWriter und BufferedReader ermöglichen komplexeres Ein- und Ausgabeverhalten. 21 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Socket-Verhalten allgemein 22 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung TCP-Socket in Java 23 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Allgemeines Verfahren 1 Socket öffnen 2 Einen Eingabe- und Ausgabestrom öffnen für den Socket 3 Lesen und Schreiben in die Ströme 4 Ströme schließen 5 Socket schließen Nur der dritte Schritt differiert von Client zu Client und ist vom Server abhängig. 24 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Echo-Server Server-Socket bindet an Port mit angegebener Nummer Accept wartet darauf, dass der Client eine Anfrage startet. 25 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung I/O mit Streams and Sockets Nimmt den Ausgangsstream des Sockets und öffnet einen PrintWriter auf ihm. Nimmt den Eingangsstream des Sockets und öffnet einen BufferedReader. Reader und Writer-Klassen können Unicode verarbeiten. 26 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Programmierung Client-Logik Beispiel String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("Echo: " + in.readLine()); } Die readLine-Methode wartet, bis der Server die Antwort zurückgesendet hat. 27 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Outline 28 / 36 1 Grundlagen TCP/IP 2 Sockets in Java Klassen in Java 3 Programmieren mit Streams Programmierung 4 Weitere Themen Datagram Sockets Asynchrone Server M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Datagram Sockets: Kommunikation 29 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Datagram Sockets: Server 30 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Datagram Sockets: Client 31 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Asynchrone Server: Mehrere Clienten Der bisherige Server ist für weitere Clients nicht erreichbar, solange er Berechnungen durchführt. Alternative: asynchrone Server Bei asynchronen Servern wird die Herstellung der Verbindung von der eigentlichen Berechnung getrennt. 32 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Exkurs: Threads in Java Threads können auf zwei Arten in Java erzeugt werden: Implementierung des Interfaces Runnable, Ableitung von der Klasse Thread. Erzeugte Threads werden mit run gestartet. Die run-Methode enthält die eigentliche Funktionalität. 33 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Asynchroner Server Der clientSocket, der von accept zurückgegeben wird, wird an den Thread übergeben. Dann wird der Thread gestartet, der die Berechnungen ausführt. Nebenläufig zur Berechnung kann am ServerSocket auf eine neue Verbindung gewartet werden. 34 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Asynchroner Server Thread 35 / 36 M. Cebulla Verteilte Systeme Grundlagen TCP/IP Sockets in Java Programmieren mit Streams Weitere Themen Datagram Sockets Asynchrone Server Zusammenfassung und Ausblick Zusammenfassung: Sockets sind ein grundlegender Kommunikationsmechanismus, der von Java zur Verfügung gestellt wird. Protokolle: TCP und UDP. Synchrone und Asynchrone Server (mit Multithreading). Ausblick: Multi-Threading in Client Server Architekturen Weitere Konzepte in java.net.* Multithreading 36 / 36 M. Cebulla Verteilte Systeme