Netzwerk & Sockets Netzwerk Computernetzwerke bestehen aus einzelnen Systemen, die verschiedenartig miteinander verbunden sind I Netzwerkkabel (Ethernet, Token Ring, . . . ) I Funkverbindung (WLAN, UMTS, Bluetooth, . . . ) Ziel des Netzwerksystems ist I Kommunikation zwischen Rechnern ungeachtet der Art der Verbindung I Rechner können miteinander kommunizieren ohne direkte Verbindung, wenn es eine Kette von Computern dazwischen gibt, die sie verbinden I möglichst effiziente Verwendung der Übertragungskapazitäten OSI-Modell Aufgabentrennung: Netzwerk in Schichten organisiert Num- Name Aufgabe mer (deutsch/englisch) 7 Anwendungen/ Anwendung: Die bereitgestellte Aufgabe Application (Browser, Chat, Netzwerkspiel, . . . ) 6 Darstellung/ Anwedung: Datenübersetzung, KodiePresentation rung, Verschlüsselung, Komprimierung 5 KommuniAnwedung: Management von Verbinkationssteuer- dungen, dauerhafte Informationsübertraung/Session gung 4 Transport/ TCP/UDP, bleibende Verbindungen Transport 3 Vermittlung/ Netzwerkpakete, Internetadressen (IPNetwork Adressen, IPv4/IPv6) 2 Sicherung/Data Fehlerkorrektur, Punkt-zu-Punkt Pakete Link 1 Bitübertragung/ Vereinheitlichung verschiedener ÜberPhysical tragungsmedien, stellt Bitstrom bereit Sockets Sockets sind eine einheitliche Kommunikationsmethode I Zwischen Programmen auf dem gleichen Rechner I Über das Netzwerk zwischen verschiedenen Rechnern Verwendung von Sockets mittels Datenströme (Streams) ⇒ Einheitliche Kommunikation zwischen Programmen, die ähnlich wie Lesen und Schreiben von Dateien handhabbar ist Verbindungsaufbau I Für eine Verbindung ist die Adresse des Servers, sowie sein Port relevant I I Adresse: Klasse InetAddress hilft bei der Verwaltung. Kann IP-Adresse (z.B. 2001:0db8:85a3:0000:0000: ” 8a2e:0370:7334“, 127.0.0.1“) oder auch ein hostname ” (z.B. example.com“) sein ” Port: Eine Zahl zwischen 0 und 65535, wobei der Bereich von 49152-65535 zur freien Verwendung gedacht ist. Port erlaubt verschiedene Server auf dem gleichen Rechner laufen zu lassen (eine Art interne Adresse) I Für den Verbindungsaufbau muss der Server erklären, dass er bereit ist, Verbindungen anzunehmen: new ServerSocket(portNumber); I Der Client muss dann die Verbindung zum Server aufnehmen: new Socket(addr, portNumber); I Der Server muss den Verbindungsaufbau dann annehmen: Socket accept() in der Klasse ServerSocket Verbindungsaufbau – Datenströme Aus der aufgebauten Verbindung können beide Seiten lesende und schreibende Datenströme erzeugen I Schreiben: OutputStream getOutputStream() in der Klasse Socket I Lesen: InputStream getInputStream() in der Klasse Socket I Für einen InputStream read kann man sich einen BufferedReader br erzeugen; dieser ist bequemer und meist effizienter BufferedReader br = new BufferedReader(new InputStreamReader(read, "UTF-8")); Nertzwerkbeispiel – Client import java.net.*; import java.lang.*; import java.io.*; public class Client { static final public int portNumber = 50127; public static void main(String[] args) throws IOException { InetAddress addr = InetAddress.getByName("127.0.0.1"); Socket serverSocket = new Socket(addr, portNumber); InputStream read = serverSocket.getInputStream(); BufferedReader br = new BufferedReader( new InputStreamReader(read, "UTF-8")); String content = br.readLine(); System.out.println("Server sagt: " + content); } } Nertzwerkbeispiel – Server import ...; public class Server { static final public int portNumber = 50127; static String[] orte = {"Welt", "Erde", "Sonne", "Venus", "Mars", "Mond"}; public static void main(String[] args) throws IOException { ServerSocket serverSock = new ServerSocket(portNumber); Socket clientSocket = serverSock.accept(); OutputStream write = clientSocket.getOutputStream(); Random rd = new Random(); String wer = orte[rd.nextInt(orte.length)]; write.write(("Hallo " + wer + ".\n").getBytes("UTF-8")); } } Daten Lesen Zum Socket gehörender Datenströme: InputStream getInputStream(): Lesen OutputStream getOutputStream(): Schreiben Liegen noch keine Daten vor, so wird beim Lesen gewartet, bis Daten vorhanden sind I I ⇒ Threads verwenden, sonst bleibt die Anwendung hängen Es gibt auch nicht-blockierende Netzwerkverbindungen: I I I Notwendige Klassen dazu im Paket java.nio Bei jedem Lesen muss getestet werden, ob Daten kamen Klasse Selector nützlich, um Operationen zu verwalten JSON im Netzwerk Durch Sockets hat man Datenströme, die denen von Dateien ähnlich sind ⇒ Die Argumente für JSON in Dateien gelten auch für Streams I einfaches textbasiertes Datenaustauschformat I menschenlesbar I einheitlich, gute Bibliotheksunterstützung Zudem: JSON im Praktikum bereits geübt Weitere Hinweise I Genaue JSON-Struktur für das Netzwerk muss selbst erarbeitet werden I Empfehlung: Versionsnummer mitkodieren Zusammenfassung I Netzwerkverbindungenen haben gute Bibliotheksunterstützung I Beim Verwenden von Streams sind die Unterschiede zu Dateien klein I Großer Teil der Netzwerkkomplexität (Schicht 1-4) ist vollständig durch Netzwerkbibliotheken abgedeckt I JSON deckt einiges vom Rest ab I Erfahrungen mit JSON können weiterverwendet werden