Programmierkurs – Kapitel 3
Transcrição
Programmierkurs – Kapitel 3
Programmierkurs – Kapitel 3 Dipl.-Wirt.-Inf. Stefan Fleischer Dipl.-Wirt.-Inf. Ulrich Wolffgang Programmierkurs Komponente: Downloader Interface für Downloader entwickeln import java.io.IOException; import java.net.URL; public interface IDownloader { public String download(URL url) throws IOException; } Programmierkurs 1 Entwicklungsfolie für die Tafel Problempunkte Aufgabe: Die download-Methode soll eine Webseite von einem Webserver laden ermitteln, wie die Seite codiert ist (z. B. ASCII oder UTF8) Text der Seite zurückgeben. Das Herunterladen der Webseite geschieht mit einem Standardisierten Verfahren (Protokoll): Hypertext Transfer Protocol (HTTP) Um HTTP in Java zu nutzen und Fehlermeldungen interpretieren zu können, wird etwas grundlegendes Verständnis über Netzwerktechnik benötigt. Programmierkurs 2 ISO/OSI Schichtenmodell für Kommunikationsprotokolle Schichten bauen aufeinander auf, L4 setzt L3 voraus. Programmierkurs 3 ISO/OSI Im Folgenden ein paar Grundlagen zu den Schichten L2 – L5 Schicht 2 (L2): Data Link Layer Netzwerkkarte (NIC) besitzt eine MAC Adresse 08:00:20:ae:fd:7e Diese dient der Adressierung einer NIC im lokalen Netzwerk (LAN) Hub mit 4 Ports für 4 Netzwerkkabel Ein Hub (L1) leitet eingehende Pakete an sämtliche Ports weiter. Ein Switch (L2) versteht Adressierung der Pakete. Merkt sich, welche MAC-Adressen an welchem Port hängen und leitet eingehendes Paket nur an den entsprechenden Port weiter. Programmierkurs 4 ISO/OSI Schicht 3 (L3): Network Layer Jeder NIC kann eine oder mehrere IP-Adressen zugewiesen werden IP-Adresse: 32-stellige Binärzahl, z. B.: 128.176.0.12 oder 127.0.0.1 IP-Konfiguration unter Windows anzeigen: ipconfig /all Erreichbarkeit eines Host prüfen: ping 128.176.0.12 Die meisten Internetpakete müssen von Router zu Router über mehrere Schritte (Hops) bis zum Ziel weitergeleitet werden. Router verbinden Netzwerke und müssen zur Wegfindung die beste Route zum Ziel kennen. Routen werden durch Metrik gewichtet. Routingtabelle anzeigen lassen: route PRINT Weg eines Pakets zum Ziel anzeigen lassen: tracert 128.176.0.12 Bei Consumer-Routern werden sämtliche Pakete über eine Hauptroute (Standard-Gateway) geleitet -> Zieladresse 0.0.0.0 Programmierkurs 5 ISO/OSI Programmierkurs 6 ISO/OSI Address Resolution Protocol (ARP) bildet IP-Adressen (L3) auf MACAdressen (L2) ab. Aktive Abbildungen anzeigen lassen: arp –a Schicht 4 (L4): Transport Layer Wichtige Standards (Protokolle): TCP und UDP TCP: Verbindungsorientiert, zuverlässig, langsam UDP: verbindungslos, unzuverlässig, schnell Schicht 5-7 (L5 – L7): Domain Name System bildet Hostnamen (www.google.de) auf eine oder mehrere IP-Adressen ab. Abfrage auf Namensserver: nslookup www.uni-muenster.de Programmierkurs 7 Sniffer Sniffer: Software zum Aufzeichnen, Darstellen und Auswerten von Netzwerkverkehr Verbreiteter Sniffer: Wireshark Ermöglicht das Filtern nach Kriterien: Capture-Filter vs. Display-Filter Webseite http://www.heise.de abrufen ARP fragt im LAN per Broadcast nach MAC-Adresse des Routers DNS-Client fragt DNS-Server nach IP-Adresse zu der Adresse www.heise.de Windows baut mit Host unter ermittelter IP-Adresse Verbindung auf: SYN -> SYN-ACK -> ACK HTTP-Client (Browser) ruft von der IP-Adresse per HTTP GETBefehl die Ressource (Webseite) ab. Programmierkurs 8 Uniform Resource Locator (URL) Identifiziert und lokalisiert eine Ressource in CoputerNetzwerken (nicht nur im WWW) Bekannt aus jedem Browser Aufbau http://user:[email protected]:80/demo/example.php?par am1=wert1¶m2=wert2 Protokoll: http, https, ftp, … User, Password: Authentifizierungsdaten Host: gibt Ort der Ressource an, www.example.org Port: erlaubt Ansteuerung eines TCP-Ports, Standard bei http ist 80 URL-Pfad: beschreibt Pfad auf Host zur Ressource Suchpfad: enthält optionale Parameter (z. B. für Webskripte) Programmierkurs 9 HTTP Protokoll zur Übertragung von Daten über Netzwerk Wird von Browser und Webserver implementiert Nutzung primär für Transport von Webseiten und anderen Dateien Setzt TCP/IP voraus Bildet CRUD durch folgende 4 Request-Methoden ab: POST: Daten an Webserver schicken / Ressource neu anlegen (C) GET: Ressource von Webserver anfordern, Caching möglich (R) PUT: Ressource auf Webserver hochladen / erneuern (U) DELETE: Ressource auf Webserver löschen (D) Programmierkurs 10 Beispiel: HTTP GET Anfrage von Webbrowser an Webserver per HTTP GET: GET / HTTP/1.1 Host: www.google.de Antwort des Webservers an den Webbrowser HTTP/1.1 200 OK Date: Thu, 11 Feb 2010 13:47:09 GMT Content-Type: text/html; charset=ISO-8859-1 <html><head><title>Google</title> … Programmierkurs 11 HTTP Statuscodes Webserver gibt bei Antwort Statuscode zurück Statuscodes 1xx: Information, Bearbeitung der Anfrage dauert an 2xx: erfolgreiche Operation 200: OK, Anfrage erfolgreich bearbeitet 3xx: Umleitung: Leitet Browser an andere Location weiter 4xx: Client-Fehler: Fehler in der Anfrage 401: Unauthorized: erneute Authentifizierung nötig 404: Not Found: Ressource nicht vorhanden 5xx: Server-Fehler: Fehler in der Verarbeitung auf Serverseite 500: Internal Server Error: Unerwarteter Server-Fehler, z.B. bei Generierung der Webseite durch PHP Und viele weitere in diesen fünf Kategorien … Programmierkurs 12 HTTP User Agent Bei HTTP Anfrage im Header Information zu anfragendem Systemtyp angegeben werden Enthält z. B. Informationen über Betriebssystem, Browser, Versionen, … Genannt User-Agent, z. B.: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Der Crawler sollte eigenen User Agent bekannt geben Programmierkurs 13 Multipurpose Internet Mail Extensions (MIME) Problem: Wir wollen wissen, welche Art von Datei (Text, Bild, Film, …) der Webserver uns per HTTP übermittelt. Dateiendungen reichen dafür nicht aus, sind eine Spezialität von Windows. Lösung: Webserver teilt Art der Datei (Content-Type) durch MIME-Code per HTTP mit. Z. B.: Für (X)HTML: text/html, text/xml, application/html oder application/xhtml+xml Für Jpeg-Bild: image/jpeg Für Stylesheet-Datei: text/css Über 130 weitere … Programmierkurs 14 Codierung Problem: Wir wollen wissen, in welcher Codierung der Webserver uns die Datei per HTTP übermittelt. Problem: Dateien im WWW sind uneinheitlich codiert Textdateien werden als Ansammlungen von Bits vom Webserver übertragen, die zu Zeichen interpretiert werden müssen. ASCII- Zeichencode Jedes Zeichen 7 Bit -> 2^7 = 128 Zeichen Zeilenumbruch = 10, Wagenrücklauf = 13, A = 41, B = 42, … Darstellung von Umlauten in Codepages auf den Werten 128-255 Verschiedene Codepages für verschiedene Sprachen Programmierkurs 15 Codierung UTF8-Zeichencode Die ersten 127 Zeichen gleichen denen von ASCII -> Kompatibilität Jedes Zeichen bis zu 4 Byte = 32 Bit -> ein Zeichencode für Zeichen sämtlicher Sprachen Lösung: Webserver teilt Codierung der Datei (ContentEncoding) durch MIME-Code per HTTP mit. Z. B.: Für ASCII: US-ASCII Für UTF8: utf-8 Für Latin1: ISO-8859-1 Viele weitere … Programmierkurs 16 Codierung Bildquelle: google.com Programmierkurs 17 Startpunkt für Entwicklung Entwicklung startet wieder mit einer Singleton-Klasse: public class Downloader implements IDownloader{ private static Downloader instance; private Downloader(){}; //Konstruktor public static Downloader getInstance(){ if(instance == null) instance = new Downloader(); return instance; } public String download(URL url) throws IOException { //… } } Programmierkurs 18 Umsetzung in Java: Pseudocode public String download(URL url) throws IOException { //open HTTP connection //set timeout //set HTTP method //set user agent //get the HTTP response code //check, if the HTTP response is a success message //get the content type of the content delivered //check, if the content type is HTML, XHTML or XML //get the content encoding from the HTTP connection //if no content encoding could be found, //set content encoding to ISO-8859-1 //get reader from the HTTP connection, using the content encoding //fetch the content from the reader to a string //disconnect from the webserver //return the string } Programmierkurs 19 Umsetzung/Hilfe in Java Java bietet für all diese Problembereiche Klassen an HTTP-Verbindung: HttpURLConnection bietet Methoden zur Interaktion mit Webserver URL.openConnection() liefert URLConnection HttpURLConnection.setRequestMethod () und HttpURLConnection.addRequestProperty() beachten. Google für Beispiele (Z. B. Stichwort „HttpURLConnection example“), Suchen, Ändern und Nutzen kleiner Beispielquelltexte aus dem WWW ist bei privatem Programmieren in Ordnung und sinnvoll, solange man versteht, was im Quelltext steht! ResponseCode, ContentType, ContentEncoding: Code Completion bei HttpURLConnection nutzen -> Methoden suchen. Reader: HttpURLConnection.getInputStream() liefert Inhalt der Webseite als Zeichenstrom. Programmierkurs 20 Streams, Reader Dieser Zeichenstrom muss verarbeitet werden. Zur Effizienzerhöhung Puffer verwenden: java.io.reader.BufferedReader Reader kann zeilenweise ausgelesen werden Reader können geschachtelt werden: BufferedReader reader = new BufferedReader( new InputStreamReader( HttpURLConnection.getInputStream(), contentencoding)); while((line=reader.readLine()) != null) //zeilenweise lesen //Zeile (line) verarbeiten Programmierkurs 21