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&param2=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

Documentos relacionados