Frühjahrsemester 2010 CS104 Programmieren II Teil I: Java-Projekt Kapitel 3: Client/Server-Architekturen & Netzwerkprogrammierung in Java H. Schuldt 3.1 Client/Server-Systeme Ein zweischichtiges Client/Server-System ist die einfachste Variante eines verteilten Systems (also eines Systems, in dem die Komponenten über Rechnergrenzen hinweg verteilt und über ein Netzwerk verbunden sind) Spezielle Aufgaben, die für mehrere Nutzer relevant sind, werden an einer zentralen Stelle beim Server bereitgestellt Der Client nutzt diese Funktionalität, in dem er sie beim Server aufruft Vertikale Verteilung der Software auf die verschiedenen Schichten, also auf Client und Server Client-seitige Software Server-seitige Software DB-Server 3-2 1
Netzwerk-Anwendungen Ziel: Nutzung gemeinsamer Ressourcen (Daten/Dienste) in einem Netzwerk, z.b.: Mehrere Anwender müssen auf eine Datei zugreifen Mehrere Arbeitsplätze sollen auf einen gemeinsamen Drucker zugreifen Mehrere Programme möchten eine gemeinsame Anwendungsfunktionalität (Anwendungsdienst) nutzen Printer #1 User A User C Printer #2 User B User D 3-3 Client/Server-Modell Die Kommunikation zwischen zwei Rechnern läuft oft auf der Basis einer Client-Server Beziehung ab Server Der Server stellt Dienst zur Verfügung, der von anderen Rechnern genutzt werden kann. Dieser Dienst läuft im Hintergrund und wartet darauf, dass ein anderer Rechner (Client) eine Verbindung aufbaut Der Server definiert das Protokoll, mit dessen Hilfe der Datenaustausch erfolgt Client Nutzt den Dienst eines oder mehrerer Server und baut bei Bedarf die Client/Server Verbindung entsprechend dem Server Protokoll auf 3-4 2
Beispiele für Client/Server-Anwendungen Client Printer #1 Client Server Drucker-Server Client Client Printer #2 Web Browser (Client) Seitenabruf Server Web Server Senden der Daten 3-5 Beispiele für Client/Server-Anwendungen Gemeinsames Dateisystem Benutzer, die an physisch verteilten Rechnern arbeiten, können auf gemeinsame Verzeichnisse in einem gemeinsamen Dateisystem zugreifen Rechnerraum Lokaler Speicher Lokaler Speicher Lokaler Speicher Laufwerk C: Laufwerk Z: Laufwerk C: Laufwerk Z: Laufwerk C: Laufwerk Z: Lokaler Speicher des File Servers Serverraum 3-6 3
Server/Client-Protokoll Um Daten zwischen zwei oder mehreren Partnern austauschen zu können, müssen sich die Teilnehmer auf ein Protokoll geeinigt haben Als Protokoll bezeichnet man die Menge aller Regeln, die notwendig sind, um einen eindeutigen Verbindungsaufbau, Datenaustausch und Verbindungsabbau zu gewährleisten Das Protokoll ist die entscheidende Komponente einer Client-Server Verbindung Fundamentale Anforderungen: eindeutige Definition (es kann nicht unterschiedlich interpretiert werden) vollständig (alle Situationen sind klar definiert) erweiterbar (zukünftige Änderungen sind möglich) gut dokumentiert 3-7 Protokoll-Arten Synchron: ein Client sendet eine Abfrage, der Server antwortet sofort, in der Zwischenzeit wartet der Client auf die Antwort des Servers (übernimmt keine andere Aktivität) Beispiel: HTTP, POP (Mail empfangen), SMTP (Mail verschicken) Asynchron: Client und Server kommunizieren gleichzeitig. Der Client richtet eine Anfrage an der Server. Während der Server diese bearbeitet kann der Client mit seiner Arbeit fortfahren, er muss nicht auf das Ergebnis des Servers warten Beispiel: TELNET, RLOGIN (Arbeiten auf anderen z.b. physikalisch entfernten Rechnern) 3-8 4
Ports und Applikationen Auf einem Host laufen meist unterschiedliche Serveranwendungen, die von mehreren Clients gleichzeitig benutzt werden Um die Server voneinander zu unterscheiden, gibt es ein weiteres Adressmerkmal, die Port-Nummer Diese gibt die Serveranwendung an, mit der ein Client kommunizieren will Port-Nummern sind positive ganze Zahlen im Bereich von 0 bis 65535 (0 bis 1023 sind reserviert) Jeder Servertyp hat seine eigene Port-Nummer, viele sind bereits für sehr weit verbreitete Client/Server-Anwendungen reserviert: Name Port-Nummer Beschreibung echo 7 gibt den Text zurück, den der Client sendet pop3 110 Übertragen von Mails www 80 Web Server......... 3-9 Beispiel: POP3 POP3 (Post Office Protocol) wird benutzt, um Mails vom Server auf den Client zu übertragen. Es ist ein textbasiertes, synchrones Protokoll. Protokoll Definition: RFC1939 (Request for Comments) Beispiel Session (synchron). limmat.cs.unibas.ch:/home> telnet pop.gmx.net 110 Trying 213.165.64.20... Connected to pop.gmx.de. Escape character is '^]'. +OK GMX POP3 StreamProxy ready <17613.1110544480@mp013> 3-10 5
Beispiel: POP3 Einloggen mit Username und Passwort: USER testname@gmx.net +OK May I have your password, please? PASS ****** Status der Mailbox überprüfen: STAT +OK 2 16914 Eine Nachricht lesen: RETR 1 +OK message follows <message headers and body> 3-11 Beispiel: POP3 Eine Email löschen und die Verbindung beenden: DELE 1 +OK message deleted QUIT +OK bye Connection closed by foreign host. limmat.cs.unibas.ch:/home> Diskussion Anfragen erfolgen text-basiert (z.b. RETR 1) Antwort besteht aus einer Status-Meldung (z.b. +OK) und der Mail. 3-12 6
Wo ist dies in unserem Projekt relevant? Aus den Projektanforderungen: 3. Der Server und die verschiedenen Clients kommunizieren mit Hilfe eines textbasierten Netzwerk-Protokolls. Das Protokoll muss lesbar sein, um eine Fehlersuche zu vereinfachen. 3-13 3.2 Charakterisierung von Netzwerken Übertragungstechnik Punkt-zu-Punkt-Netze Bestehen aus vielen Verbindungen von Paaren von Rechnern Um von der Quelle zum Ziel zu gelangen, muss ein Paket eventuell mehrere Zwischenrechner durchlaufen In der Regel sind von der Quelle zum Ziel mehrere Routen unterschiedlicher Länge möglich 3-14 7
Übertragungstechnik Broadcast-Netze Es gibt einen Übertragungskanal, der von allen am Netz angeschlossenen Maschinen gemeinsam benutzt wird. Alle Rechner, die am Netz angeschlossen sind, erhalten eine gesendete Nachricht (Paket) Sämtliche Pakete besitzen ein Adressfeld, in dem der eigentliche Empfänger angegeben ist Jeder Empfänger eines Pakets testet, ob das Paket für ihn bestimmt ist Falls ja wird es verarbeitet Falls nein wird es ignoriert (bzw. neu ins Netz gegeben) Beispiel: Durchsage im Kaufhaus / am Flughafen Multicasting Variante des Broadcasting Nachricht (Paket) wird an eine Teilmenge der angeschlossenen Rechner geschickt Multicasting benötigt die Möglichkeit, eine Gruppe von Rechnern gemeinsam zu adressieren, z.b. über eine Gruppennummer bzw. Gruppenkennung Beispiel: Verschicken von emails an Mailing-Listen 3-15 Netz-Topologien Die topologische Struktur eines Daten- oder Rechnernetzes gibt an, wie die Teilnehmer, Vermittlungseinrichtungen und Leitungen wechselseitig zugeordnet sind. Topologien 1 1. Busnetze 2. Ringnetze 3. Sternnetze 4. Vermaschte Netze: beliebige Verbindungen möglich 3 a) Voll-Vermaschung: jeder Teilnehmer ist mit jedem anderen verbunden b) Teil-Vermaschung 2 4a 4b 3-16 8
Reichweite von Rechnernetzen. Entfernung Platzierung Beispiel 0,1 m Platine SIMD-Rechner 1m System MIMD-Rechner 10 m Raum 100 m Gebäude Lokales Netz LAN (Local Area Network) 1 km Campus/Firmengelände 10 km Stadt Stadtnetz MAN (Metropolitan Area Network) 100 km Land Fernnetz WAN 1 000 km (Wide Area Network) 10 000 km Netzverbund (z.b. Internet) 3-17 Klassifikation: räumliche Ausdehnung. Local Area Networks (LAN) Hochleistungsdatentransfer (mehrere 100 Mbit/s bis hin zu Gbit/s) auf räumlich begrenztem Gebiet in der Regel private Netze (corporate networks) vorwiegend Bus-, Stern- oder Ringtopologie zumeist mit Broadcast-Übertragungstechniken Wide Area Networks (WAN) Datenfernübertragung (Kabel, Satellit, Richtfunkstrecken) vorwiegend vermaschte Topologien Zumeist Punkt-zu-Punkt-Übertragungstechniken Zusammenschluss mehrerer eigenständiger Netze (Netzwerkverbund); benötigt spezielle Vermittlungselemente (Router) Metropolitan Area Networks (MAN) decken Kommunikationsbedarf in Ballungszentren ab Übertragungsgeschwindigkeiten: einige hundert Mbit/s Verwenden WAN-ähnliche Technologien, jedoch mit höheren Geschwindigkeiten 3-18 9
Art der Verbindung Verbindungslose Kommunikation / Kommunikationsdienste Zu übertragende Daten werden in kleine Einheiten (Rahmen) aufgeteilt Jeder dieser Rahmen wird einzeln und unabhängig von den anderen Rahmen der Nachricht verschickt Es existiert keine ständige logische Verbindung Reihenfolgetreue ist nicht garantiert Beispiel: Absenden eines Briefes Verbindungsorientierte Kommunikation / Kommunikationsdienste Vor dem Verschicken von Rahmen bauen Quelle und Senke eine Kommunikationsverbindung auf Dies beinhaltet die Initialisierung von Variablen, die für die Sicherung der Kommunikation (des Austauschs von Rahmen) erforderlich sind 1. Aufbau der Verbindung 2. Kommunikation: Übertragung von Rahmen 3. Trennen der Verbindung Reihenfolge der Übertragung von Rahmen wird eingehalten Beispiel: Telefonanruf 3-19 Art der Bestätigung Unbestätigte Kommunikation / Kommunikationsdienste Der Empfänger gibt keine Rückmeldung, ob ein Rahmen empfangen wurde oder nicht Der Empfang von Daten kann also nicht garantiert werden, der Verlust eines Rahmens fällt nicht auf Beispiel: Versenden eines Briefes Bestätigte Kommunikation / Kommunikationsdienste Der Empfang jedes Rahmens wird einzeln bestätigt Bei Ausbleiben der Bestätigung (Überschreiten eines time-outs) kann der Sender den Rahmen nochmals verschicken Beispiel: Versenden eines Einschreibe-Briefes mit Rückschein 3-20 10
Protokolle und Protokollhierarchien. Rechnerkommunikation basiert auf Kommunikationsprotokollen, die das Format, den Zeitpunkt, die Art, etc. der Datenübertragung festlegen Zur Reduktion der Komplexität werden unterschiedliche Abstraktionsstufen betrachtet. Jede Abstraktionsebene bildet eine eigene Schicht mit eigenem Protokoll...... und stützt sich dabei auf die nächsttiefere Schicht ab (verwendet die Dienste der nächsttieferen Schicht über deren Schnittstelle) Konzeptionell kommuniziert Schicht i des Quellsystems mit Schicht i des Empfängers. Jedoch erfolgt diese Kommunikation sukzessive über die tieferen Schichten auf beiden Seiten. Sowohl beim Sender als auch beim Empfänger existieren also mehrere, Schnittstelle n aufeinander aufbauende Protokollschichten: Protokoll n Schicht n eine Protokollhierarchie Schnittstelle n-1 3-21 Protokollhierarchien: Beispiel Beispiel: kommunizierende Philosophen Quelle: [Tanenbaum 00] 3-22 11
Protokollhierarchien: Dienststruktur. System A Benutzer des Dienstes n System B Benutzer des Dienstes n Funktionen der Schicht n+1 Erbringer von Dienst n Benutzer des Dienstes n-1 Erbringer von Dienst n-1 Benutzer des Dienstes n-2 Erbringer von Dienst n-2 Benutzer des Dienstes n-1 Benutzer des Dienstes n-2 Funktionen der Schicht n Funktionen der Schicht n-1 Funktionen der Schicht n-2 3-23 Aufbau einer Kommunikationsschicht. Benutzer von Dienst n SAP kommunizierende Einrichtungen n-direktzugriffspunkt (service access point, SAP) Erbringer von Dienst n SAP Dienstprimitive Dienstprimitive Dienst n Dienst n SAP Erbringer von Dienst n-1 SAP 3-24 12
OSI-Referenzmodell Das OSI-Referenzmodell ist ein abstraktes, logisch-funktionelles Architekturmodell der ISO (International Standards Organization) für die Datenkommunikation in offenen Systemen OSI: Open Systems Interconnection Standard: OSI 7498, ab 1977 entworfen Besteht aus sieben Schichten Eine Schicht erbringt für die jeweils darüber liegende Schicht bestimmte Dienste 3-25 Schichten im OSI-Modell System A System B Anwendung Anwendungsprotokoll Anwendung Darstellung Sitzung Transport Vermittlung Sicherung Bit- Übertragung Darstellungsprotokoll Sitzungsprotokoll Transportprotokoll Vermittlungsprotokoll Sicherungsprotokoll Bit-Übertragungsprotokoll Übertragungsmedium Darstellung Sitzung Transport Vermittlung Sicherung Bit- Übertragung 3-26 13
Schichten im OSI-Modell Verarbeitung (application layer) Anwendungsspezifische Protokolle, z.b. für Dateitransfer Darstellung (presentation layer) Codierung von Daten, Abbildung zwischen Datencodes, evtl. Standardcodierung für Übertragung Kommunikationssteuerung (Sitzung) (session layer) Dialogsteuerung (wer darf jeweils senden) Transport (transport layer) Zerlegung von Daten in kleine Einheiten (Pakete) Evtl. Aufbau mehrerer Verbindungen (Kanäle), Festlegen der Art der Verbindung (Punkt-zu-Punkt, Broadcast), Angabe des SAP des Empfänger- Hosts Vermittlung (network layer) Auswahl von Paketrouten (evtl. Abrechnung) Sicherung (data link layer) Übertragung frei von Übertragungsfehlern machen Aufteilung von Daten in Datenrahmen (Frames). Kennzeichnen des Beginns (Endes) von Frames Bitübertragung (physical layer) Physikalische, mechanische, elektrische Aspekte der Übertragung 3-27 TCP/IP-Referenzmodell Besteht aus 4 Schichten Oberste Schicht: Anwendungen, z.b.email, ftp, telnet Transport: Ende-zu-Ende-Protokolle TCP (transmission control protocol): verbindungs-orientiert (und zuverlässig) UDP (user datagram protocol): verbindungslos (und unzuverlässig) Verbindung/Vermittlung: Internet IP-Protokoll für Routing von Paketen Host-an-Host (nicht näher spezifiziert, Verwendung bestehender Netze) Paketvermittelndes Netz. Referenzmodell macht keine Aussagen zu verwendeter Netzwerktechnologie (T IP auf der Basis verschiedener Netze möglich, z.b. WAN, Ethernet-LAN, etc.) 3-28 14
TCP/IP Die in der Vorlesung notwendigen Netzwerkfähigkeiten in Java basieren auf dem Internet-Protokoll TCP/IP TCP ist ein verbindungsorientiertes Protokoll, das auf der Basis von IP (eindeutige Nummer im Internet) eine sichere und fehlerfreie Punkt-zu-Punkt-Verbindung realisiert Es gibt in Java auch eine TCP/UDP Verbindung (User Datagram Protocol) verbindungsloses Protokoll 3-29 OSI und TCP/IP OSI TCP TCP-Protokolle und Netze Anwendung Darstellung Anwendung telnet, ftp, SMTP, DNS, Sitzung Transport Transport TCP, UDP Vermittlung Vermittlung IP Sicherung Bit- Übertragung Host- an- Host LAN, ARPANET, SATNET 3-30 15
Entstehung des Internet Ursprung: ARPANET in den USA (Advanced Research PRojects) Mitte der 60er Jahre Zunächst für militärische Nutzung Verbindung von Mini-Rechnern (Interface Messaging Processors, IMPs). Ausfallsicherheit: jeder IMP an mindestens zwei weitere IMPs angeschlossen Nachrichtengrösse 8063 Bit (!), aufgeteilt in Pakete von maximal 1008 Bit (!) Zunächst: vier Netzwerkknoten Später kamen immer weitere lokale Netze hinzu Die ursprüngliche ARPANET-Protokolle konnten diese jedoch nicht integrieren Entwicklung der TCP/IP-Protokolle 3-31 Adressierung: IP-Adressen... Die Adressierung sollte unabhängig von den Hardware-Adressen der im Netzwerk beteiligten Rechnern geschehen Ziel: Kommunikation von Anwendungsprogrammen, ohne die Hardware- Adressen der Kommunikationspartner zu kennen IP-Adresse besteht aus Binärzahl der Länge 32 Bit (4 Bytes), aufgeteilt in Präfix (Netzwerknummer); gibt das Netzwerk an, in dem sich der Empfänger befindet. Diese Nummer wird global vergeben Suffix, gibt die lokale Adresse des Empfängers in seinem Netzwerk an. Diese Nummer kann lokal vom Administrator vergeben werden Problem: Wie soll die Aufteilung zwischen Präfix und Suffix erfolgen? Langer Präfix: viele Netze (aber mit jeweils wenigen Rechnern, da dann kurzer Suffix), oder Langer Suffix (dann viele Rechner pro Netzwerk, aber wenige Netzwerke, da kurzer Präfix) 3-32 16
... Adressierung: IP-Adressen... Unterteilung des Adressraums in drei Klassen. Trennung zwischen Präfix und Suffix jeweils an Bytegrenzen Klasse A: Erstes Bit ist 0 Präfix: folgende 7 Bit Suffix: letzte 24 Bit Klasse B: Erste beiden Bit: 10 2 Präfix: folgende 14 Bis Suffix: letzte 16 Bit Klasse C: Erste drei Bit: 110 2 Präfix: folgende 21 Bit Suffix: letzte 8 Bit Klasse D: Erste vier Bit: 1110 2. Spezielle Klasse für Multicast Bereich danach frei wählbar (muss für alle Rechner einer Gruppe gleich sein; diese sind dann alle Empfänger von Paketen, die via IP-Multicast verschickt wurden) Klasse E: Erste vier Bit 1111 2. Freigelassen für zukünftige Nutzung 3-33... Adressierung: IP-Adressen Notation: Dotted Decimal Notation Jeder 8 Bit-Block wird in eine Dezimalzahl umgewandelt. Diese Dezimalzahlen werden dann, durch Punkte getrennt, aneinandergefügt Adressbereich von 0.0.0.0 bis 255.255.255.255 Vergabe der Netzwerkkennungen in CH durch Switch (www.switch.ch) Problem: Was macht man bei vielen kleinen Netzen mit nur wenigen Hosts (z.b. 9 Stück). Soll hierfür ein komplettes Netz der Klasse C verwendet werden (obwohl insgesamt 16 solcher Mini-Netze im Adressraum eines C-Netzes Platz hätten). Gehen nicht irgendwann die Netzwerkadressen aus? Mit zusätzlicher Information kann nur ein Teil einer Klasse einem Netzwerk zuordnen. Adressmaske (Subnetzmaske). Gesetzte Bits zeigen an, welcher Teil der Adresse zum Präfix gehört, welcher zur Hostadresse. Die Trennung muss jetzt nicht mehr an der Byte-Grenze geschehen. 3-34 17
Sprechende IP-Adressen IP-Adressen sind nicht sprechend, haben wenig Aussagekraft (für den Menschen) Daher werden den IP-Adressen symbolische Rechnernamen zugewiesen Diese Namen werden in einer verteilten Namensdatenbank verwaltet. Dieses System bezeichnet man als Domain Name System (DNS) Das DNS stellt Dienste bereit, mit denen symbolische Namen aufgelöst und in die eigentlichen IP-Adressen umgewandelt werden können. Ein Client stellt eine Anfrage an einen DNS-Server. Falls dieser den symbolischen Namen auflösen und die IP-Adresse bestimmen kann, so gibt er das Resultat zurück. Ansonsten wird er selbst Client eines anderen DNS-Servers 3-35 Ports und Applikationen Die Kommunikation zwischen zwei Rechnern läuft in der Regel auf der Basis von Client/Server-Interaktionen ab, d.h., die beteiligten Rechner übernehmen bestimmte Rollen Auf einem Host laufen meist unterschiedliche Serveranwendungen, die von mehreren Clients benutzt werden können. Um die Server voneinander unterscheiden zu können, werden Server-Prozesse (Threads) mit Portnummern assoziiert Portnummern werden oberhalb von IP auf der Transportschicht definiert Bereich zwischen 0 und 65 535 (= 2 16-1) TCP-Socket = 4-Tupel, bestehend aus src-ip, src-port, dest-ip, dest-portò 3-36 18
3.3 Netzwerkprogrammierung in Java Wie kann man eine java-verbindung auf einen entfernten (remote) Rechner herstellen? Zur Adressierung wird die Klasse InetAdress des Pakets java.net verwendet localhost ist eine Pseudo-Adresse für den eigenen Host: 127.0.0.1 import java.net.*; public class IpAddress { // Usage: java IpAddress <host> public static void main(string[] args) { try { // Get requested address InetAddress addr = InetAddress.getByName(args[0]); System.out.println(addr.getHostName()); System.out.println(addr.getHostAddress()); catch (UnknownHostException e) { System.err.println(e.toString()); System.exit(1); getbyname() erwartet IP-Adresse oder Hostname gethostname() liefert symbolischen Namen gethostaddress() liefert IP-Adresse getlocalhost()liefert InetAddress für den eigenen Rechner 3-37 Aufbau einer Socket-Verbindung Wie können Server und Client miteinander kommunizieren? Als Socket bezeichnet man eine streambasierte Schnittstelle zur TCP/IP-Kommunikation zweier Rechner Übertragen von Daten ähnelt dem Zugriff auf eine Datei: Verbindungsaufbau, Daten lesen/schreiben, Verbindung schliessen Die Klassen Socket (Client) und ServerSocket (Server) repräsentieren Sockets aus der Sicht einer Client-Server Anwendung Socket besitzt zwei Konstruktoren public Socket(String host, int port); public Socket(InetAddress address, int port;) Nachdem die Socket-Verbindung erfolgreich aufgebaut wurde, kann mit den beiden Methoden getinputstream(), getoutputstream() je ein Stream zum Empfangen und Versenden verfügbar gemacht werden 3-38 19
Client Socket: Lesen einer Socket-Verbindung Beispiel: Abfrage des DayTime-Services (Port 13) zur Darstellung von Client-Sockets import java.net.*; import java.io.*; // Usage java SocketTest <host> public class SocketTest { public static void main(string[] args) { try { Socket sock = new Socket(args[0], 13); InputStream in = sock.getinputstream(); int len; byte[] b = new byte[100]; while ((len = in.read(b))!= -1) { System.out.write(b, 0, len); in.close(); sock.close(); catch (IOException e) { System.err.println(e.toString()); System.exit(1); Start: java SocketTest limmat.cs.unibas.ch Ausgabe: Mon Mar 15 10:58:21 2010 Das Programm gibt die vom Server gesendeten Daten aus, bis durch einen Rückgabewert -1 angezeigt wird, dass keine weiteren Daten gesendet werden. Verwendung von getinputstream() um Serverdaten zu lesen 3-39 Client: Lesen & Schreiben von Socket-Verbindungen import java.net.*; import java.io.*; public class EchoClient { Das Programm stellt eine Verbindung zum ECHO-Service (Port 7) her public static void main(string[] args) { Client schickt Daten an Server dieser try { Socket sock = new Socket(args[0], 7); liest die Daten und sendet sie InputStream in =sock.getinputstream(); unverändert zurück OutputStream out=sock.getoutputstream(); // create server reading thread InThread th = new InThread(in); th.start(); // stream input BufferedReader conin = new BufferedReader( new InputStreamReader(System.in)); String line = " "; while (true) { // reading input stream line = conin.readline(); if (line.equalsignorecase("quit")) { break; // writing to ECHO server out.write(line.getbytes()); out.write('\r\n'); // terminate program System.out.println("terminating.."); in.close(); out.close(); sock.close(); catch (IOException e) {... import java.io.*; class InThread extends Thread { InputStream in; public InThread(InputStream in) { super(); this.in = in; public void run() { int len; byte[] b = new byte[100]; try { while (true) { if ((len=in.read(b))==-1) { break; System.out.write(b, 0, len); catch (IOException e) {... Programmieren II (cs104) Client/Server-Architekturen & Netzwerkprogrammierung 3-40 20
Server-seitige Sockets Details zu Server-Sockets public ServerSocket(int port) // Konstruktor public Socket accept() // Methode accept() blockiert solange, bis sich ein Client anmeldet. Beispiel: Einfacher ECHO-Server, der auf einen Client auf Port 8090 wartet und alle Daten unverändert zurücksendet. Zur Kontrolle sollen die Server Daten auf die Konsole geschrieben werden 3-41 ECHO-Server import java.net.*; Ports unter 1024 dürfen nur import java.io.*; mit Root Berechtigung public class SimpleEchoServer { gestartet werden. Hier: public static void main(string[] args) { ECHO Server auf 8090 try { System.out.println("Warte auf Port 8090..."); ServerSocket echod = new ServerSocket(8090); Socket socket = echod.accept(); System.out.println("Verbindung hergestellt"); InputStream in = socket.getinputstream(); OutputStream out = socket.getoutputstream(); int c; while ((c = in.read())!= -1) { out.write((char)c); System.out.print((char)c); System.out.println("Verbindung t tl beenden"); socket.close(); echod.close(); catch (IOException e) { System.err.println(e.toString()); System.exit(1); Wird der Server gestartet java SimpleEchoServer kann mit dem EchoClient und Port 8090 auf den Server zugegriffen werden 3-42 21
Server-Verbindungen zu mehreren Clients Der ECHO-Server soll wie folgt erweitert werden Der Server soll mehr als einen Client gleichzeitig bedienen Die Clients sollen durchnummeriert werden Beim Verbindungsaufbau soll der Client eine Begrüssungsmeldung erhalten Für jeden Client soll ein eigener Thread angelegt g werden 3-43 Server-Verbindungen zu mehreren Clients public class EchoServer { public static void main(string[] args) { int cnt = 0; try { System.out.println( "Warte auf Verbindungen auf Port 8090..."); ServerSocket echod = new ServerSocket(8090); while (true) { Socket socket = echod.accept(); (new EchoClientThread(++cnt, socket)).start(); catch (IOException e) { System.err.println(e.toString()); err tostring()); System.exit(1); 3-44 22
Server-Verbindungen zu mehreren Clients class EchoClientThread extends Thread { private int name; private Socket socket; // constructor public EchoClientThread(int name, Socket socket){ this.name = name; this.socket = socket; public void run() { String msg = "EchoServer: Verbindung " + name; System.out.println(msg + " hergestellt"); try { InputStream in = socket.getinputstream(); OutputStream out = socket.getoutputstream(); out.write(("cs104:"+msg+"\r\n").getbytes()); int c; while ((c = in.read())!= -1) { out.write((char) c); System.out.print((char)c); System.out.println( Terminate "+name); socket.close(); catch (IOException e) { System.err.println(e.toString()); 3-45 3.4 Java-Projekt und Netzwerkprogrammierung Der Spiel-Server und die verschiedenen Clients kommunizieren mit Hilfe eines textbasierten Netzwerk-Protokolls Das Protokoll muss lesbar sein, um eine Fehlersuche zu vereinfachen Idealerweise besitzen alle Anweisungen des Protokolls eine feste Länge (Nachrichten einfach zu parsen) Einfache Reaktion auf eingehende Nachrichten. Beispiel: enum Protocol {AAAA, BBBB, CCCC, ZZZZ;... Protocol msg;... switch (msg){ case AAAA:... ; break; case BBBB:... ; break;... 3-46 23
Java-Projekt und Netzwerkprogrammierung Wichtig für die Implementierung des Protokolls insbesondere in der Gruppe ist es, die Semantik der einzelnen Befehle und speziell ihr Zusammenspiel festzulegen Beispiel: Sequenzdiagramme Empfohlene Vorgehensweise Zuerst Kommunikationsskelett für den Server implementieren Wartet auf Verbindung, dann: akzeptiert Verbindung (baut diese auf) Wartet auf Eingabe, dann: gibt Echo zurück Erst danach, wenn Basisfunktionalität steht, sukzessive erweitern Erst am Ende mit dem GUI verbinden 3-47 Java-Projekt und Netzwerkprogrammierung Ports sorgfältig wählen Nicht aus dem reservierten Bereich (unter 1024) Vermeiden bereits bekannter Ports > 1024 (z.b. Port 8080, Alternative für HTTP) 3-48 24