Universität Paderborn Prof. Dr. Stefan Böttcher Kapitel 6: Ausgewählte Kapitel der Java-Programmierung (Teil 2: Internetprogrammierung) Grundlagen der Programmierung 2, SS 2008 1 Universität Paderborn Prof. Dr. Stefan Böttcher Internet-Grundlagen: Adressierung Client Server IP-Nummer 131.234.30.62 Dienst : PORT Name pc-boettshk1.upb.de daytime 13 telnet 23 http 80 ... ... Grundlagen der Programmierung 2, SS 2008 2 Universität Paderborn Prof. Dr. Stefan Böttcher Internet-Grundlagen: HTTP Client Server Verbindung öffnen: Verbinde zu www.upb.de:80/cs/boettcher Anforderung senden: GET /willkommen.html HTTP/1.0 Antwort schicken: HTTP/1.0 200 OK Server: Apache Web Server Content-Type: text/html Content-Length: 34 Willkommen in unserem Internetshop Verbindung schließen Grundlagen der Programmierung 2, SS 2008 3 Universität Paderborn Prof. Dr. Stefan Böttcher Internet-Grundlagen: Server und Services Port 13: 23: 80: ... 8080: 8723: Zeit Telnet WWW WWW alternativ „eigener Service“ Mehrere Services auf einem Rechner => jeder auf einem eigenen Port Grundlagen der Programmierung 2, SS 2008 4 Universität Paderborn Prof. Dr. Stefan Böttcher 2. Internet-Programmierung in Java • Internetzugriff über Strings und Streams • Sockets • HTTP-Client • HTTP-Spiegelserver Grundlagen der Programmierung 2, SS 2008 5 Universität Paderborn Prof. Dr. Stefan Böttcher Internetzugriff über Streams und Strings InputStreams (=Datenströme mit Eingabedaten) : • Tastatur • lokale Dateien • Internetseiten Lesen geht für alle Eingabe-Ströme gleich: BufferedReader strom = new BufferedReader ( ein Eingabestrom ) ; String s = strom.readLine( ) ; // 1. Zeile lesen Grundlagen der Programmierung 2, SS 2008 6 Universität Paderborn Prof. Dr. Stefan Böttcher Strings lesen aus Strömen Lesen von der Tastatur BufferedReader ein = new BufferedReader( new InputStreamReader(System.in) ) ; String s = ein.readLine() ; while (s != null) { // hier Zeile verarbeiten s = ein.readLine(); // nächste Zeile holen } Lesen aus lokalen Dateien: BufferedReader dateiEin = new BufferedReader( new FileInputStream(“Kunde.java“) ) ; String s = dateiEin.readLine() ; // ... Grundlagen der Programmierung 2, SS 2008 7 Strings lesen aus Strömen (2) Universität Paderborn Prof. Dr. Stefan Böttcher Lesen aus dem Internet (über URL) URL url = new URL( "http://www.upb.de/cs/boettcher/willkommen.htm"); BufferedReader einURL = new BufferedReader( new InputStreamReader(url.openStream()) ); String s = einURL.readLine() ; // ... Ausnahmen abfangen (bei allen Leseoperationen) try { // ... Leseoperationen } catch(Exception e) { System.out.println(e); } // Ausnahmen abfangen Grundlagen der Programmierung 2, SS 2008 8 Sockets Universität Paderborn Prof. Dr. Stefan Böttcher Andere Rechner sind genauso zugreifbar wie lokale Dateien in Java über Eingabe- bzw. Ausgabe-Ströme String host = “paris.uni-paderborn.de"; Socket socket = new Socket(host, 13); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); String zeit = in.readLine(); System.out.println(“Die Zeit auf Rechner " + host + " ist " + zeit); Grundlagen der Programmierung 2, SS 2008 9 Ein HTTP-Client import java.io.*; Universität Paderborn Prof. Dr. Stefan Böttcher import java.net.*; public class HttpClient { public static void main( String[ ] args ) { try { Socket socket = new Socket("192.168.1.101", 8080 ); BufferedReader from_server = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ) ; PrintWriter to_server = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); // Sende HTTP GET Kommando zum Web server und welche Seite to_server.println("GET /start.html"); to_server.println(); to_server.flush(); // sende sofort String zeile = from_server.readLine() ; while ( zeile != null ) { System.out.println( zeile ) ; zeile = from_server.readLine() ; } socket.close(); // Wenn alles gelesen ist, schließe Socket } catch (Exception e) { System.out.println(e); } } } Grundlagen der Programmierung 2, SS 2008 10 Einfacher HTTP-Spiegelserver Universität Paderborn Prof. Dr. Stefan Böttcher import java.io.*; import java.net.*; public class HttpSpiegel { public static void main(String args[]) { try { ServerSocket ss = new ServerSocket(8080); // Service einrichten for(;;) { Socket client = ss.accept( ); // warte bis ein Client sich anmeldet BufferedReader in = new BufferedReader( new InputStreamReader( client.getInputStream( ) ) ); PrintWriter out = new PrintWriter( new OutputStreamWriter( client.getOutputStream( ) ) ); out.println("HTTP/1.0 200 "); out.println("Content-Type: text/plain"); out.println( ); out.flush( ); String zeile = in.readLine( ) ; while( zeile != null && zeile.length( ) != 0 ) { out.println( zeile ); zeile = in.readLine() ; } } out.close( ); in.close( ); client.close( ); } // for: Warte auf nächsten Client catch (Exception e) { System.out.println(e); } } Grundlagen der Programmierung 2, SS 2008 } 11