Learning By Doing Netzwerke mit TCP/IP • Das Internet verwendet weitgehend das rund 30-jährige TCP/IP-Protokoll (TCP: Transmission Control Protocol, IP: Internet Protocol) • Jedes teilnehmende Gerät (Computer, Drucker, usw.), Knoten genannt, besitzt eine eindeutige IP-Adresse aus 4 bytes = 32 bit, in der gepunkteten Form nnn.nnn.nnn.nnn, wo nnn eine Dezimalzahl zwischen 0 und 255 ist, beispielsweise 130.92.13.49. Ein hierarchischer Domain Name Service (DNS) erlaubt die Verwendung von IP-Aliasis, z.B. www.unibe.ch • Unter TCP/IP werden die Informationen paketweise übertragen. Es ist fehlertolerant, da an Hand einer Prüfsumme Fehler erkannt und ein fehlerhaftes Paket neu angefordert werden • TCP/IP beruht auf einer Client-Server-Hierarchie und nicht auf einem Netzwerk gleichwertiger Knoten (kein peer-to-peer) • Ein Client führt einen Request an eine bestimmte IP-Adresse mit Angabe eines bestimmten Ports (0...65535) aus. Ein Demon des Servers überwacht diesen Port, nimmt den Request entgegen, verarbeitet ihn und liefert einen Response an den Client zurück Client 1 Request Server 130.92.13.49 212.243.19.1 Demon Client 2 212.243.19.2 Response Port 80 Demon Port 3306 Client 3 212.243.19.3 s. Buch S. 503ff Learning By Doing Sockets • Sockets legen so viele Schichten über die Komplexität der Netzwerkverbindungen, dass diese wie ein Datenstrom (Stream), analog einer Dateioperation, aufgefasst werden können • Einen Socket kann man auch als Zugangspforte eines IP-Verbindungskanals zwischen einem Server (Host) und einem Client auffassen • Für einen Client sind die wichtigsten Socket-Operationen: - Verbindung erstellen (open) - Daten senden (send) - Daten empfangen (read) - Verbindung beenden (close) • Für einen Server kommen noch folgende Operationen hinzu: - Binden eines IP-Ports (bind) - Verbindungsaufforderung annehmen (accept) • In Java werden Sockets ausserordentlich gut unterstützt, Socket-Programmierung ist daher verglichen mit anderen Programmiersprachen mit wenig Aufwand verbunden • Socket-Programmierung ist im Internet-Zeitalter sehr motivierend und eignet sich gut für den thematischen Unterricht und Maturaarbeiten Learning By Doing // WbzEx20.java Daytime-Client import java.net.*; import java.io.*; import ch.aplu.util.*; Nach der Annahme der Verbindung auf Port 13 sendet der Server einen String mit der aktuellen Datums-Zeit public class WbzEx20 extends Console { private static final String HOSTNAME = "ntp1.ptb.de"; private static final int PORT = 13; public WbzEx20() { BufferedReader reader = null; Socket socket = null; String line; println("Trying to connect to " + HOSTNAME + "..."); try Verbindung erstellen { socket = new Socket(HOSTNAME, PORT); println("Connection established"); Timeout für socket.setSoTimeout(15000); // 15 sec readline() Stream erzeugen reader = new BufferedReader( new InputStreamReader( socket.getInputStream())); println("Response:"); while ((line = reader.readLine()) != null) { Daten vom println(line); Host lesen Daten aus} } blockierend } schreiben Phys.-Techn. Bundesanstalt catch (IOException ex) { println("Error " + ex); } finally { Stream und Socket try schliessen { if (reader != null) reader.close(); if (socket != null) socket.close(); } catch (IOException ex) {} } } public static void main(String args[]) { new WbzEx20(); } Learning By Doing // WbzEx20a.java ... (wie WbzEx20.java) public class WbzEx20a extends Console { private static final String HOSTNAME = "www.unibe.ch"; private static final int PORT = 80; Web-Reader Nach der Annahme der Verbindung auf Port 80 sendet der Client den HTTP-String GET / HTTP/1.0 gefolgt von zwei Leerzeilen public WbzEx20a() { BufferedReader reader = null; Socket socket = null; String line; println("Trying to connect to " + HOSTNAME + "..."); try { socket = new Socket(HOSTNAME, PORT); socket.setSoTimeout(15000); // 15 sec println("Connection established"); PrintWriter out = new PrintWriter(socket.getOutputStream()); out.print("GET / HTTP/1.0\r\n\r\n"); out.flush(); reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); println("Response:"); while ((line = reader.readLine()) != null) { println(line); } } ... (wie WbzEx20.java) Output-Stream erzeugen HTTP GET-Request Stream leeren, damit mit Sicherheit ausgeschrieben Response lesen und ausschreiben