345 107 10MB
English Pages 1263
Die Reihe Go To Die zuverlässigen Führer auf dem Weg zum Profi Folgende Titel sind bereits erschienen: Stefan Wille Go To Java Server Pages 600 Seiten, ISBN 3-8273-1892-0 Mechtild Käufer Go To JavaScript 624 Seiten, ISBN 3-8273-1916-1 Armin Hanisch Go To C# 534 Seiten, ISBN 3-8273-1932-3 Drews, Kaddik, Schwab Go To Visual Basic 6.0 768 Seiten, ISBN 3-8273-1376-7 Andreas Bohne, Guido Lang Go To Delphi 6 960 Seiten, ISBN 3-8273-1774-6 André Willms Go To C++-Programmierung 768 Seiten, ISBN 3-8273-1495-X Herold, Klar, Klar Go To Objektorientierung 744 Seiten, ISBN 3-8273-1651-0 Daryl Harms, Kenneth McDonald Go To Python 640 Seiten, ISBN 3-8273-1800-9 Peter Loos Go to COM 672 Seiten, ISBN 3-8273-1678-2 Guido Krüger Go To Java 2, 2. Auflage 1.224 Seiten, ISBN 3-8273-1710-X Dirk Abels Go To C++ Builder 5.0 432 Seiten, ISBN 3-8273-1713-4 Michael Hernandez, John Viescas Go To SQL 512 Seiten, ISBN 3-8273-1772-X
Jürgen Bayer
Internetprogrammierung eBook Die nicht autorisierte Weitergabe dieses eBooks an Dritte ist eine Verletzung des Urheberrechts!
An imprint of Pearson Education München • Boston • San Francisco • Harlow, England Don Mills, Ontario • Sydney • Mexico City Madrid • Amsterdam
Die Deutsche Bibliothek – CIP-Einheitsaufnahme Ein Titeldatensatz für diese Publikation ist bei Der Deutschen Bibliothek erhältlich.
Die Informationen in diesem Buch werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar. Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig. Fast alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden. Umwelthinweis: Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt. Die Einschrumpffolie – zum Schutz vor Verschmutzung – ist aus umweltverträglichem und recyclingfähigem PE-Material.
10 9 8 7 6 5 4 3 2 1 05 04 03 02 ISBN 3-8273-1825-4 © 2002 by Addison Wesley Verlag, ein Imprint der Pearson Education Deutschland GmbH Martin-Kollar-Straße 10–12, D-81829 München/Germany Alle Rechte vorbehalten Einbandgestaltung: Barbara Thoben, Köln Lektorat: Frank Eller, [email protected] Korrektorat: Simone Meißner, Großberghofen Herstellung: Monika Weiher, [email protected] CD-Mastering: Gregor Kopietz, [email protected] Satz: reemers publishing services gmbh, Krefeld, www.reemers.de Druck und Verarbeitung: Kösel, Kempten, www.KoeselBuch.de Printed in Germany
Inhaltsverzeichnis Vorwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1
Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.1
1.2
1.3 1.4 1.5 2
Zum Buch 1.1.1 Die in diesem Buch behandelte Internetprogrammierung 1.1.2 Die Zielgruppe dieses Buchs / Voraussetzungen 1.1.3 Die Referenz 1.1.4 Die Buch-CD 1.1.5 Ein Wort an die weiblichen Leser 1.1.6 Typografische Konventionen 1.1.7 Die Icons in diesem Buch Internetprogrammierung in der Übersicht 1.2.1 Was unterscheidet Internetprogramme von klassischen Anwendungen? 1.2.2 Clientseitige versus serverseitige Internetprogrammierung HTML, DHTML, CSS, XHTML und XML Was ist ASP, was ist ASP.NET? Was sind Webdienste?
21 21 23 25 25 27 27 29 29 29 33 36 43 48
Basiswissen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.1 2.2
2.3
2.4 2.5 2.6 2.7
2.8
RFCs Die IP-Adresse 2.2.1 Die Klasseneinteilung der IP-Adressen 2.2.2 Subnetze und Subnetzmasken 2.2.3 Vergabe von IP-Adressen IP-Namensauflösung 2.3.1 Der Name-Service in lokalen Netzen 2.3.2 Der Domain Name Service (DNS) IP-Ports URIs, URLs und URNs Internet-Medientypen und MIME Einfache Internetprotokolle 2.7.1 Das IP-Protokoll 2.7.2 Das UDP-Protokoll 2.7.3 Das TCP-Protokoll Socket-Dienste
49 50 50 52 53 53 54 55 57 58 59 62 62 64 65 67
5
2.9
3
3.4
»IIS« oder »Internet-Informationsdienste«? Die Komponenten des IIS IIS-Administration für Programmierer 3.3.1 Das Basisverzeichnis 3.3.2 Eigenschaften einer Website 3.3.3 Eigenschaften der Webordner 3.3.4 Webanwendungen IIS-Sicherheit 3.4.1 Verzeichnissicherheit 3.4.2 Schutz vor externen Angreifern
83 83 87 91 92 96 97 101 101 110
JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 4.1
4.2
4.3
6
67 68 70 78 79
Der Internet Information Server . . . . . . . . . . . . . . . . . . . . . 83 3.1 3.2 3.3
4
Die wichtigsten höheren Protokolle 2.9.1 Tools zum Testen der Kommunikation 2.9.2 Das HTTP-Protokoll 2.9.3 Das FTP-Protokoll 2.9.4 Das SMTP-Protokoll
Einführung 4.1.1 Ein kleiner Exkurs in die OOP 4.1.2 Die JavaScript-Versionen 4.1.3 Inoffizielle Referenzen zu JavaScript und ein Tipp 4.1.4 JavaScript-Programme in HTMLDokumenten 4.1.5 JavaScript-Version abfragen 4.1.6 Das Prinzip der Ereignisse Debugging 4.2.1 Debugging im Browser 4.2.2 Debuggen mit den speziellen Debuggern Grundlagen der Sprache 4.3.1 Groß- und Kleinschreibung 4.3.2 Anweisungen 4.3.3 Variablen und Datentypen 4.3.4 Alles ist ein Objekt 4.3.5 Der Wert null 4.3.6 Der this-Zeiger 4.3.7 Die with-Anweisung 4.3.8 Zuweisen von Objekten 4.3.9 Der Basistyp object 4.3.10 Die Eigenschaften und Methoden der Klasse Number
113 113 119 122 123 128 130 133 133 135 148 148 149 154 158 160 161 162 164 166 167
4.4 4.5 4.6
4.7
4.8 4.9
4.10 5
4.3.11 Die Eigenschaften und Methoden der Klasse String 167 4.3.12 Arbeiten mit Strings 170 4.3.13 Datumswerte 174 4.3.14 Arrays 179 4.3.15 Ausdrücke und Operatoren 185 4.3.16 Verzweigungen und Schleifen 193 4.3.17 Funktionen schreiben 200 Die allgemeinen JavaScript-Funktionen 202 Die Math-Klasse 204 Reguläre Ausdrücke 206 4.6.1 Das Prinzip 206 4.6.2 Die Musterzeichen 207 4.6.3 Reguläre Ausdrücke erzeugen und Strings testen 212 4.6.4 Fundstellen extrahieren 214 4.6.5 In mehrzeiligen Strings suchen 216 4.6.6 Gruppierungen auswerten 217 4.6.7 Rückreferenzen 218 4.6.8 Ersetzen von Teilstrings 220 4.6.9 Strings auftrennen 220 4.6.10 Einige Beispiele 221 Ereignisse 222 4.7.1 Die HTML-Ereignisse 222 4.7.2 Ereignisse mit Scriptcode verknüpfen 225 4.7.3 Ereignisargumente auswerten 226 4.7.4 Ereignisse abbrechen 232 4.7.5 Ereignisse registrieren 234 Die Behandlung von Ausnahmen 236 OOP mit JavaScript 241 4.9.1 Zugriff auf die Eigenschaften eines Objekts über einen String-Index und Iteration über alle Eigenschaften eines Objekts 243 4.9.2 Dynamisches Ändern von Objekten und Klassen 245 Übungen 246
DHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 5.1 5.2
Einführung Arbeiten mit dem DOM 5.2.1 Grundlegendes 5.2.2 Sechs wichtige Hinweise 5.2.3 DHTML im Internet Explorer 4 bis 5
247 252 252 268 272
7
5.2.4 5.2.5
5.3
5.4 6
6.2 6.3 6.4 6.5
6.6
6.7
6.8
282 285 290 290 291 301 303 305 316 324
Wichtige Hinweise zuvor 6.1.1 Wo Sie weitere Informationen finden 6.1.2 Die Einrichtung des Webordners 6.1.3 Caching-Probleme vermeiden Die alte Welt: COM Die neue Welt: .NET Das .NET Framework Der prinzipielle Aufbau einer ASP.NET-Seite 6.5.1 Einfache ASP.NET-Programme mit C# 6.5.2 Einfache ASP.NET-Programme mit Visual Basic .NET 6.5.3 Die Ausgabe eines ASP.NET-Programms 6.5.4 Einbinden von einfachen ASP.NETProgrammen Die Ausführung von ASP.NET-Seiten im IIS 6.6.1 Die automatische Kompilation 6.6.2 Der ASP.NET-Worker-Prozess und HttpHandler Debugging und Tracing 6.7.1 Debuggen von ASP.NET-Seiten 6.7.2 Tracing unter ASP.NET Übungen
325 325 328 329 330 334 336 346 346 348 348 349 352 352 354 356 357 363 367
Visual Studio .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 7.1 7.2 7.3
8
274
ASP.NET-Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 6.1
7
Netscape 4 Internet Explorer ab Version 5.5 und Netscape 6 5.2.6 Cross-Browser-Coding DHTML-Programmiertechniken 5.3.1 Bilder dynamisch laden 5.3.2 Hover-Effekte und einfache Menüs 5.3.3 Hover-Effekte mit Bildern 5.3.4 Bilder vorladen 5.3.5 HTML-Elemente dynamisch erzeugen 5.3.6 Eingabevalidierung Übungen
Grundlegendes Der Start von Visual Studio Umgang mit den Fenstern der Entwicklungsumgebung 7.3.1 Der Projektmappen-Explorer 7.3.2 Die Klassenansicht
369 372 376 377 379
7.4
7.5
7.6 7.7 8
7.3.3 Der Quellcode-/Designer-Bereich 7.3.4 IntelliSense 7.3.5 Die Toolbox 7.3.6 Das Eigenschaftenfenster Die wichtigen Eigenschaften der Entwicklungsumgebung und des Projekts 7.4.1 Optionen der Entwicklungsumgebung 7.4.2 Projekteigenschaften ASP.NET-Anwendungen mit Visual Studio .NET entwickeln 7.5.1 Umbenennen des Startformulars 7.5.2 Die Gestaltung der Oberfläche 7.5.3 Ereignisse auswerten Weitere Features von Visual Studio Übungen
379 381 382 383 387 387 388 390 390 390 392 394 396
ASP.NET-Entwicklung mit C# . . . . . . . . . . . . . . . . . . . . . . . 397 8.1 8.2 8.3
8.4
8.5
8.6
Warum C#? Umgang mit Assemblierungen und Namensräumen Anweisungen 8.3.1 Kommentare und XML-Dokumentation 8.3.2 Der Aufruf von Methoden (Funktionen) Datentypen 8.4.1 Typsicherheit, der Datentyp object, Wert- und Referenztypen 8.4.2 Übersicht über die Standarddatentypen 8.4.3 Integerdatentypen 8.4.4 Fließkommatypen 8.4.5 Über- und Unterläufe und spezielle Werte 8.4.6 Datumswerte 8.4.7 Zeichen und Zeichenketten 8.4.8 Der Typ object 8.4.9 Konvertierungen 8.4.10 Aufzählungen (Enums) Variablen, Konstanten und Arrays 8.5.1 Variablen 8.5.2 Konstanten 8.5.3 Seitenglobale Variablen 8.5.4 Programmglobale Variablen 8.5.5 Arrays 8.5.6 Namensrichtlinien Ausdrücke und Operatoren 8.6.1 Arithmetische Ausdrücke und Operatoren
397 398 404 406 408 410 410 418 420 422 425 428 429 432 433 437 439 439 441 442 443 445 451 453 453
9
8.7
8.8
8.9
8.10
8.11
8.12
10
8.6.2 Bitoperationen 8.6.3 Zuweisungen 8.6.4 Vergleiche 8.6.5 Logische Operatoren 8.6.6 ?:, typeof und is Verzweigungen und Schleifen 8.7.1 Die if-Verzweigung 8.7.2 Die switch-Verzweigung 8.7.3 Die while-Schleife 8.7.4 Die do-Schleife 8.7.5 Die for-Schleife Methoden 8.8.1 Deklaration 8.8.2 Überladene Methoden 8.8.3 ref- und out-Argumente 8.8.4 Übergeben von Referenztypen 8.8.5 Variable Argumente mit params Klassen 8.9.1 Klasse oder Struktur 8.9.2 Die Deklaration und das Einbinden einer Klasse 8.9.3 Das Schlüsselwort this 8.9.4 Konstruktoren 8.9.5 Destruktoren 8.9.6 Statische Klassenelemente 8.9.7 Vererbung Programmiertechniken 8.10.1 Strings bearbeiten 8.10.2 Die StringBuilder-Klasse 8.10.3 Berücksichtigung der Kultur 8.10.4 Formatierungen 8.10.5 Datumswerte bearbeiten 8.10.6 Mathematische Berechnungen 8.10.7 Massendaten in Auflistungen speichern Reguläre Ausdrücke 8.11.1 Auswerten von regulären Ausdrücken mit C# 8.11.2 Mehrere Teilstrings extrahieren 8.11.3 Die Optionen: Groß-/Kleinschreibung ignorieren 8.11.4 Suchen in mehreren Zeilen Ausnahmebehandlung 8.12.1 Die globale ASP.NETAusnahmebehandlung
454 456 457 459 460 463 464 465 467 468 468 469 470 470 472 473 473 474 475 475 478 479 481 481 483 485 485 495 500 502 505 508 509 515 516 517 517 518 521 522
8.13
8.14 9
523 528 528 530 531
Klassisches ASP in ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . 533 9.1 9.2 9.3 9.4 9.5
9.6
9.7 9.8 10
8.12.2 Ausnahmebehandlung im Programm Klassenbibliotheken (Assemblierungen) 8.13.1 Klassenbibliotheken erzeugen und kompilieren 8.13.2 Klassenbibliothek mit Visual Studio erzeugen Übungen
Basiswissen Dynamische ASP.NET-Seiten URL-Argumente URL-Argumente auswerten Formulareingaben auswerten 9.5.1 Einlesen und Überprüfen der Eingaben 9.5.2 Auswerten der verschiedenen Steuerelemente 9.5.3 Seitenstatus in hiddenElementen speichern Serverseitiges Überprüfen von Eingaben 9.6.1 Fehlermeldung auf der Auswertungsseite anzeigen 9.6.2 Fehlermeldung auf einer separaten Seite anzeigen 9.6.3 Fehlermeldung auf der Eingabeseite anzeigen Ein Formular an verschiedene ASP-Seiten senden Übungen
533 537 542 543 546 546 549 557 561 562 564 566 568 569
Arbeiten mit ASP.NET-Seiten . . . . . . . . . . . . . . . . . . . . . . . 571 10.1
10.2
10.3 10.4
Grundlagen 10.1.1 Client- und serverseitige Steuerelemente 10.1.2 Das Rendern 10.1.3 Die Ereignisbehandlung und der Viewstate Umgang mit Steuerelementen 10.2.1 HTML- und ASP-Steuerelemente 10.2.2 Einstellung der Eigenschaften der Steuerelemente 588 Cross-Browser-Seiten und das Ziel-Schema Ereignisse auswerten 10.4.1 Die Struktur einer Ereignisbehandlungsmethode
571 571 574 576 582 582
591 592 592
11
10.5
10.6
10.7
10.8 10.9 10.10 10.11 10.12 10.13 10.14 11
594 601 604 606 608 611 611 614 621 621 622 623 623 626 629 633 641 645 648 656 662 668 671 672 673 677 682
Steuerelemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 11.1
11.2
12
10.4.2 Ereignisbehandlungsmethoden in einfachen aspx-Seiten 10.4.3 Codebehind-Klassen 10.4.4 Die Ereignisse der Steuerelemente und der Seite 10.4.5 Die IsPostBack-Eigenschaft 10.4.6 Direkte Auswertung von Ereignissen über AutoPostBack Die Page-Klasse 10.5.1 Eigenschaften und Methoden 10.5.2 Wichtige Seiten-Direktiven Anwendungen und Sitzungen 10.6.1 Anwendungen 10.6.2 Sitzungen Die ASP-Objekte 10.7.1 Grundlagen zu den Auflistungen 10.7.2 Das Application-Objekt 10.7.3 Das Session-Objekt 10.7.4 Arbeiten mit Sitzungen 10.7.5 Application- und Session-Ereignisse auswerten: Die Datei Global.asax 10.7.6 Das Server-Objekt 10.7.7 Das Request-Objekt 10.7.8 Das Response-Objekt Konfiguration einer ASP.NET-Anwendung Andere ASP.NET-Seiten öffnen Smarte Navigation ASP-Seiten umleiten (Redirect) Cookies Caching Übungen
Die HTML-Steuerelemente 11.1.1 Die Basisklassen HtmlControl und HtmlContainerControl 684 11.1.2 Übersicht über die Steuerelemente Die ASP-Steuerelemente 11.2.1 Eigenschaftswerte in HTML und im Programm 689 11.2.2 Das alte Browserproblem im neuen .NET 11.2.3 CSS verwenden 11.2.4 Die Basisklasse WebControl 11.2.5 Das Label-Steuerelement 11.2.6 Die TextBox 11.2.7 Der Button
683
686 688
694 696 699 701 702 703
11.3 11.4
11.5 12
11.2.8 Der LinkButton 11.2.9 Der ImageButton 11.2.10 Das HyperLink-Steuerelement 11.2.11 CheckBox und RadioButton 11.2.12 Das Image-Steuerelement 11.2.13 Panel 11.2.14 Das Calendar-Steuerelement 11.2.15 Das AdRotator-Steuerelement 11.2.16 Das Table-Steuerelement 11.2.17 Listen-Steuerelemente 11.2.18 Spezielle Steuerelemente 11.2.19 Die Validierungs-Steuerelemente Dynamisches Erzeugen von Steuerelementen Benutzerdefinierte Steuerelemente 11.4.1 Die wichtigen Basismethoden 11.4.2 Ein einfaches Steuerelement in einer cs-Datei 11.4.3 Entwicklung mit Visual Studio 11.4.4 Ein einfaches Steuerelement in einer ascx-Datei 11.4.5 Pagelets: Zusammengesetzte Steuerelemente in ascx-Dateien 11.4.6 Zusammengesetzte Steuerelemente in Assemblierungen 11.4.7 Standardeigenschaften implementieren 11.4.8 Erweiterte Techniken Übungen
706 709 710 711 714 714 716 723 725 731 737 738 749 752 755 756 759 764 769 773 777 784 799
ASP.NET-Datenzugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801 12.1
12.2 12.3
Einige Infos zuvor 12.1.1 ADO, ADO.NET, OLE DB, ODBC, MDAC und SQL 12.1.2 Die Datenquellen 12.1.3 Der Provider 12.1.4 Der Wert DBNull Übersicht über die Klassen Verbindung zur Datenquelle aufnehmen 12.3.1 Wo verbinden? 12.3.2 Verbindung mit Hilfe von Dialogen konfigurieren 12.3.3 Verbindung zum SQL Server und zur MSDE 12.3.4 Verbindung zu Datenquellen, für die nur ein ADO-Provider verfügbar ist
801 803 805 806 806 807 809 810 811 814 817
13
12.3.5 Verbindung zu Access-Datenbanken 12.3.6 Verbindung zu Oracle-Datenbanken 12.4 Die Befehlsklassen 12.5 Daten über DataReader-Objekte lesen 12.5.1 Das Prinzip 12.5.2 Die wichtigsten Eigenschaften und Methoden 12.5.3 Daten lesen 12.6 Daten über ein Command-Objekt editieren, anfügen und löschen 12.6.1 Daten editieren, anfügen und löschen 12.7 Ausführen von gespeicherten Prozeduren mit einem Command-Objekt 12.8 Das Prinzip des DataSet 12.8.1 XML-Daten im Arbeitsspeicher 12.8.2 Eigenschaften, Methoden und Ereignisse der DataSet-Klasse 12.8.3 Die DataTable-Klasse 12.8.4 DataRow-Objekte 12.8.5 DataColumn-Objekte 12.8.6 Das Grundprinzip am Beispiel eines dynamisch erzeugen DataSet 12.8.7 Daten in XML-Dateien verwalten 12.8.8 Das Beispiel im SQL Server 12.9 DataAdapter 12.9.1 Das Prinzip 12.9.2 Eigenschaften und Methoden der DataAdapter-Klassen 12.9.3 DataAdapter und dessen Befehle erzeugen 12.9.4 Füllen des DataSet 12.10 Mehrere Tabellen im DataSet 12.11 Daten im Programm mit dem DataSet durchgehen 12.12 Daten im Programm mit dem DataSet editieren 12.12.1 Das Prinzip 12.12.2 Datensätze hinzufügen 12.12.3 Der Trick zum Lesen von automatisch erzeugten Id-Werten 12.12.4 Datensätze ändern 12.12.5 Datensätze löschen 12.12.6 Aktualisieren der Datenquelle und Fehlerauswertung
14
819 820 821 824 824 825 826 829 829 830 834 834 835 839 844 847 849 853 857 861 861 862 866 870 871 873 874 874 877 878 881 881 881
12.13 Transaktionen 12.14 Ansätze zum Editieren mit dem DataSet in der Praxis 12.15 Sortieren und filtern mit einem DataReader-Objekt 12.16 Das DataView-Objekt 12.17 Übungen 13
894 895 896 902
ASP.NET-Datenbindung . . . . . . . . . . . . . . . . . . . . . . . . . . . 903 13.1
13.2
13.3
13.4 13.5 14
887
Einfachwert- und Listen-Datenbindung 903 13.1.1 Einfachwert-Datenbindung 904 13.1.2 Listen-Datenbindung 907 13.1.3 Stileigenschaften 918 Das DataGrid-Steuerelement 923 13.2.1 Die Eigenschaften und Ereignisse des DataGrid-Steuerelements 925 13.2.2 Seitenweise Anzeige der Daten 929 13.2.3 Sortieren des Inhalts 939 13.2.4 Benutzerdefinierte Spalten: Angepasste Darstellung und Editieren der Daten 942 13.2.5 Benutzerdefinierte normale gebundene Spalten 944 13.2.6 Benutzerdefinierte Spalten mit Schalter 946 13.2.7 Benutzerdefinierte Spalten mit Editier-Befehlen 951 13.2.8 Benutzerdefinierte Spalten mit Hyperlinks 958 13.2.9 Templates: Spalten mit beliebigen Steuerelementen 960 13.2.10 Auswahl von Zeilen zulassen 967 13.2.11 Anpassung des DataGrid in den Datenbindungs-Ereignissen 970 13.2.12 Daten mit dem DataGridSteuerelement manipulieren 978 Das DataList-Steuerelement 994 13.3.1 Eigenschaften und Ereignisse des DataList-Steuerelements 995 13.3.2 Ein Beispiel ohne Editieren 999 13.3.3 Ein Ansatz zum Editieren 1004 Das Repeater-Steuerelement 1004 Übungen 1006
ASP.NET-Programmiertechniken . . . . . . . . . . . . . . . . . . . 1007 14.1
Suchen mit dem Indexdienst
1007
15
14.2
14.3
14.4
14.5 14.6 15
1008 1013 1017 1024 1030 1030 1034 1035 1036 1038 1039 1041 1041 1043 1043 1048 1051 1051 1055 1059 1065 1068
Webdienste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069 15.1 15.2 15.3 15.4
15.5
15.6
16
14.1.1 Katalog erstellen 14.1.2 Die allgemeine Syntax der Suchabfrage 14.1.3 Suchen mit dem ADO-Provider für den Indexdienst 14.1.4 Eine Suchseite Dateien zum Server hochladen 14.2.1 Dateien hochladen und speichern 14.2.2 Maximale Größe festlegen E-Mails versenden 14.3.1 Einfache Mails versenden 14.3.2 Dateien anhängen 14.3.3 Eigenschaften und Methoden der SmtpMail- und der MailMessage-Klasse Benutzer-Authentifizierung und Autorisation 14.4.1 Die Authentifizierungsmodi 14.4.2 Einstellen des Authentifizierungsmodus 14.4.3 Formular-Authentifizierung 14.4.4 Einrichten der Loginseite 14.4.5 Ansätze zur Verwaltung der Benutzer in einer externen Datenquelle 14.4.6 Windows-Authentifizierung 14.4.7 Personalisieren von Webseiten 14.4.8 Rollenbasierte Verwaltung der Rechte und eigene Benutzerdaten Berücksichtigung der Kultur des Anwenders Übungen
Was sind Webdienste? Ein einfacher Webdienst als Demo Implementierung des Webdienstes Direkter Aufruf eines Webdienstes 15.4.1 Aufruf über HTTP-GET 15.4.2 Aufruf über HTTP-POST 15.4.3 Aufruf über SOAP 15.4.4 Testen im Browser SOAP, WSDL, UDDI und DISCO 15.5.1 SOAP 15.5.2 WSDL 15.5.3 UDDI 15.5.4 DISCO 15.5.5 Dynamic Discovery Webdienste verwenden 15.6.1 Einfacher Aufruf eines Webdienstes
1069 1070 1070 1072 1072 1073 1074 1075 1076 1076 1081 1082 1085 1086 1088 1088
15.6.2 Eine Proxy-Klasse erzeugen 15.6.3 Webdienste unter Visual Studio .NET verwenden 15.6.4 Externe Webdienste über einen UDDIServer integrieren 15.6.5 Clientanwendungen initialisieren 15.7 Webdienste mit Assemblierung 15.7.1 Grundlagen 15.7.2 Implementierung mit Assemblierung 15.8 Webdienste mit Visual Studio .NET entwickeln 15.9 Abgesicherte Webdienste 15.9.1 Eine eigene Authentifizierung 15.10 Übungen 16
1088 1093 1094 1095 1096 1096 1097 1100 1104 1106 1109
Peer-To-Peer- und Mehrschichten-Programme . . . . . . . 1111 16.1
16.2
16.3
16.4
Was sind P2P- und MehrschichtenAnwendungen? 16.1.1 Peer-To-Peer 16.1.2 Mehrschichten-Anwendungen 16.1.3 Und wie passt das Ganze zum Buch? Kommunikation über das IP-Protokoll 16.2.1 Das Prinzip 16.2.2 Übersicht über die Klassen 16.2.3 Programmierung eines TCP-Client 16.2.4 Programmierung eines TCP-Servers Remoting 16.3.1 Was ist Remoting? 16.3.2 Wozu Remoting? 16.3.3 Das Prinzip 16.3.4 Die Möglichkeiten 16.3.5 Leasing 16.3.6 Kanäle 16.3.7 Grundlagen der Remoting Programmierung am Beispiel mit serverseitiger Aktivierung 16.3.8 Clientseitige Aktivierung 16.3.9 Remote-Konfiguration über eine Konfigurationsdatei 16.3.10 Einstellen der Lease-Zeit 16.3.11 Remoting mit Ereignissen 16.3.12 Asynchroner Aufruf von Methoden Übungen
1111 1111 1112 1113 1114 1114 1115 1128 1135 1146 1146 1146 1147 1148 1151 1152
1153 1162 1168 1174 1179 1189 1200
17
17
Lösungen zu den Übungen . . . . . . . . . . . . . . . . . . . . . . . 1201 17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8 17.9 17.10 17.11 17.12 17.13
Kapitel 4 Kapitel 5 Kapitel 6 Kapitel 7 Kapitel 8 Kapitel 9 Kapitel 10 Kapitel 11 Kapitel 12 Kapitel 13 Kapitel 14 Kapitel 15 Kapitel 16
1201 1203 1206 1207 1208 1210 1214 1218 1221 1224 1227 1233 1234
Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1241
18
Vorwort
Vorwort Internetprogrammierung macht Spaß. Wenn man es kann. Wer in die Internetprogrammierung einsteigt, muss nur ein paar »kleine« Hürden überwinden: JavaScript, DHTML, ASP, Datenbankzugriffe und noch einiges anderes mehr. Aber auch der Profi kann nicht immer alle Features der gerade verwendeten Technologie im Kopf haben. Dieses Buch stellt eine Hilfe für jeden Programmierer dar: für den, der bereits Programmier-Grundkenntnisse besitzt und nun Internetprogramme entwickeln will. Und auch für den, der schon unter anderen Umgebungen Internetprogramme entwickelt und jetzt zur Microsoft-Welt umsteigen will. Schließlich wird das Buch auch dem Profi helfen, der immer mal wieder nach einem Feature suchen oder die Anwendung dieses Feature nachlesen muss. Und zu guter Letzt wird das Buch auch mir selbst immer wieder bei der Programmierung Hilfestellung leisten (womit sich das Schreiben schon gelohnt hat). Mein Hauptziel beim Schreiben dieses Buchs war, dass es bei Ihnen immer in Reichweite auf dem Schreibtisch liegt, während Sie Internetprogramme entwickeln. Ich habe allerdings selbst dafür gesorgt, dass dies vielleicht gar nicht so häufig vorkommen wird. Auf der Buch-CD finden Sie nämlich eine Referenz in PDF- und indizierter HTMLForm, die alle Referenz-Tabellen des Buchs enthält und die bei der alltäglichen Recherche wahrscheinlich ein guter Helfer sein wird .
Bei der Themenauswahl dieses Buchs hatte ich ursprünglich geplant, die Installation der benötigten Komponenten, wichtige Internetgrundlagen, HTML und CSS im ersten Teil zu beschreiben. Bei der Umsetzung merkte ich dann aber viel weiter hinten, bei der Beschreibung der wirklich wichtigen und vor allen Dingen auch interessanten und Spaß machenden Themen, dass mir die Seiten ausgehen. Also habe ich das Konzept so geändert, dass die genannten Themen nicht im Buch behandelt werden (schließlich handelt es sich ja um ein ProgrammierBuch). Sie finden die herausgenommenen Kapitel und Abschnitte stattdessen auf der Buch-CD. Ich habe das Buch bewusst so geschrieben, wie ich mir ein Buch vorstelle, das die wichtigen Aspekte der Internetprogrammierung behandelt. Einige Kapitel, wie beispielsweise das über JavaScript, werden Ihnen mög19
Vorwort
licherweise etwas zu umfangreich erscheinen. Ich habe in den einzelnen Kapiteln aber immer versucht, möglichst genau die Informationen unterzubringen, die beim Programmieren im Internet immer wieder benötigt werden. Auch wenn Sie im Moment z.B. noch nicht wissen wollen, wie Sie beispielsweise reguläre Ausdrücke in JavaScript einsetzen um Eingaben zu überprüfen: Irgendwann einmal müssen Sie damit vielleicht umgehen können. Schön, wenn Sie dann in diesem Buch nachlesen können. Ich danke allen, die bei der Entstehung dieses Buchs mitgewirkt haben. Dazu zählen im Besonderen meine Lektoren Christiane Auf und Frank Eller, die mit ihrer verständnisvollen und netten Betreuung so einige Schwierigkeiten aus dem Weg geräumt haben. Ein großes Danke gilt auch Simone Meißner für die enorm flexible, nette und vor allen Dingen auch Spaß machende Zusammenarbeit bei der Korrektur des Manuskripts. Herrn Ullrich Voss von der Firma future apps danke ich für die Begutachtung des Internetgrundlagen-Abschnitts. Sorry, Ullrich, dass dieser Abschnitt nun nur noch auf der Buch-CD erscheint. Mein besonderer Dank gilt auch Georg (der schon weiß, wer damit gemeint ist) für die wertvollen Hinweise und Anregungen zu den regulären Ausdrücken. Meinem guten Geschäftsfreund Alistair Firth danke ich für die konstruktive Mitwirkung bei der Auswahl der für das Buch wichtigen Themen. Er ist dafür mitverantwortlich, dass Sie einige Themen nun nicht mehr im Buch, sondern auf der Buch-CD finden . Schließlich danke ich meiner guten Freundin Gabi Linsel für die hervorragende, sozialwissenschaftlich fundierte Beratung in den »Das schaff ich doch nie«-Phasen der Erstellung dieses Buchs.
Ich wünsche allen Lesern, dass sie mit Hilfe dieses Buchs und über ihre eigenen Experimente sichere und gute Internetprogrammierer werden und dass dieses Buch auch in Zukunft ein unentbehrlicher Helfer bei der Programmierung sein wird. Falls Sie Anregungen oder Kritik zum Buch haben oder mir einen der kleinen, vom bösen Fehlerteufel eingebauten Fehler mitteilen wollen, schreiben Sie mir einfach eine E-Mail. Viel Spaß bei der Internetprogrammierung (und auch sonst) Jürgen Bayer [email protected] 20
Einführung
1
Einführung
1.1 Zum Buch 1.1.1 Die in diesem Buch behandelte Internetprogrammierung Die Programmierung von Internetanwendungen ist ein weites Feld. Neben fundierten HTML-Kenntnissen benötigt ein Programmierer Kenntnisse der verschiedensten Technologien. Das Buch behandelt nicht alle Aspekte der Internetprogrammierung, weil das prinzipiell im Rahmen eines einzigen Buchs gar nicht möglich ist. Es beschreibt aber die Technologien und Sprachen, die Sie unter der vorwiegenden Verwendung von Microsoft-Servern und -Programmiersprachen einsetzen können, um ansprechende und funktionelle Internetanwendungen zu erstellen. Der Vorteil von Microsoft-Systemen ist aus meiner Sicht, dass diese recht einfach einsetzbar sind und einem relativ guten Standard entsprechen. Der sehr einfach zu administrierende (und vor allen Dingen kostenfreie) Microsoft-Webserver und ASP/ASP.NET zur Erstellung dynamischer Webseiten sind gute Beispiele dafür. Besonders das neue .NET-Konzept vereinfacht die Internetprogrammierung gegenüber anderen Konzepten oder Sprachen erheblich. Dieses Konzept steht auch sehr stark neben Java, dem wichtigsten Konkurrenten bei der Internetprogrammierung. Als wichtige Basis behandelt der erste Teil des Buchs die für Programmierer wichtisten Grundlagen. Dazu gehört eine allgemeine Einführung in die Internetprogrammierung und die Administration des Microsoft-Webservers. Ich beschreibe diese Themen dabei aus der Programmierersicht. (Teil-)Themen, die für Programmierer unwichtig sind, werden nicht angesprochen. Da Sie zwar über ASP oder ASP.NET recht einfach dynamische Webseiten erstellen können, ein ansprechendes HTML-Dokument mit dynamischer Reaktion auf Benutzereingaben meist aber nicht ohne eine clientseitige JavaScript- und DHTML-Programmierung auskommt, behandle ich im ersten Programmierteil des Buchs JavaScript und DHMTL recht ausführlich. Das Buch beschreibt in diesem Teil auch, wie Sie gängige Probleme wie beispielsweise die Überprüfung von Benutzereingaben 21
Einführung
oder die Erstellung eines Menüs lösen. Verschiedene Tipps und Tricks helfen Ihnen dabei, mit den teilweise komplexen Themen umzugehen. Dabei gehe ich immer auch auf die gängigen Browser ein (die leider oft eine unterschiedliche Programmierung erfordern). Die Grundlagenthemen HTML, CSS und XML werden im Buch nicht beschrieben, obwohl sie für Internetprogrammierer sehr wichtig sind. Ich musste die einzelnen möglichen Themen aber gewichten. Da ich davon ausgehen konnte, dass Sie HTML und CSS vielleicht schon kennen (weil Sie beispielsweise bereits Webseiten gestalten), und weil diese Themen keine wirklichen Programmierthemen sind, habe ich zu Gunsten von echten und interessanten Programmierthemen entschieden, HTML, CSS und XML nicht in das Buch zu nehmen. Sie finden auf der Buch-CD aber ausführliche, im Stil des Buchs geschriebene Artikel dazu. Einen großen Teil des Buchs nimmt dann die Programmierung dynamisch erzeugter Webseiten mit ASP.NET ein. Als Programmiersprache wird dazu zunächst C#, die »Muttersprache« des .NET Frameworks, beschrieben. ASP wird im Buch zwar nicht mehr ausführlich behandelt. Da aber ein gesundes ASP-Grundwissen für das Verständnis von ASP.NET recht wichtig ist, beschreibe ich in weiteren Verlauf dieses Buchabschnitts die ASP-Grundtechniken (unter ASP.NET). In diesem Kapitel werden auch die wichtigen ASP.NET-Objekte behandelt. Danach erläutere ich den Umgang mit den ASP.NET-Steuerelementen, die die Erstellung der Oberfläche einer Webanwendung (im Vergleich zum alten ASP) erheblich vereinfachen. Die in der Praxis wichtige Datenbankprogrammierung wird natürlich auch behandelt, genau wie das unter ASP.NET sehr einfache aber flexible Binden von Steuerelementen an Datenquellen. Neben diesen »Grundlagen« werden aber auch spezielle, praxisorientierte Themen, wie das Senden von E-Mails, der Upload von Dateien oder die Verwendung des Microsoft-Indexdienstes (zur Implementierung von Suchseiten) behandelt. Einen separaten Teil des Buchs nimmt dann die Entwicklung von Webdiensten unter .NET ein. Diese Dienste, die im Prinzip nichts anders liefern als Daten, laufen auf einem Webserver und können über das Internet von jedem Programm aus verwendet werden, das das zugrunde liegende Protokoll (SOAP) beherrscht. 22
1.1 Zum Buch
Einführung
Zur Internetprogrammierung gehört nicht nur die Entwicklung von (dynamischen) Webseiten. Der andere (relativ) wichtige Teil ist die Programmierung von klassischen Windowsanwendungen, die über eines der Internetprotokolle mit Servern oder anderen Programmen im Internet kommunizieren. Deshalb zeige ich im letzten Teil des Buchs, wie Sie unter C# Programme entwickeln, die über TCP/IP oder UDP/IP miteinander oder mit beliebigen Servern kommunizieren. Damit besitzen Sie eine gute Grundlage, um die Probleme, die sich Ihnen bei der Internetprogrammierung stellen, zu lösen. 1.1.2 Die Zielgruppe dieses Buchs / Voraussetzungen Dieses Buch ist an alle gerichtet, die bereits etwas Erfahrung in der Programmierung besitzen und nun zur Internetprogrammierung wechseln wollen. Es setzt voraus, dass der Leser die Grundlagen der Programmierung beherrscht. Dazu gehört im Wesentlichen der sichere Umgang mit Variablen, Schleifen, Verzweigungen und Funktionen, aber auch zumindest grundlegende Kenntnis der objektorientierten Programmierung (OOP). Für den Fall, dass Sie diese noch nicht besitzen, finden Sie auf der Buch-CD einen Artikel, der die Aspekte der OOP für verschiedene Programmiersprachen ausführlich beschreibt. Sie müssen aber nicht bereits ein Programmier-Crack sein, um dieses Buch verstehen zu können. Ein gesundes Grundlagenwissen reicht vollkommen aus. Im Bereich der OOP setze ich lediglich voraus, dass Sie wissen, was eine Klasse ist, und dass Sie die wesentlichen Grundlagen der Vererbung kennen. Als wichtige Basis setze ich weiterhin voraus, dass Sie die wichtigsten HTML-Gundlagen kennen. Sie sollten also wissen, was ein Tag ist, welches die wichtigsten Tags sind und wie Sie diese grundsätzlich einsetzen. Für den Fall, dass Sie dieses Wissen noch nicht besitzen, können Sie einfach den entsprechenden Artikel lesen, den Sie auf der Buch-CD finden. Weiteres wichtiges Grundwissen ist das Wissen um die Bedeutung und den Einsatz von CSS (Cascading Style Sheets). Gerade bei der Formatierung der Objekte eines HTML-Dokuments spielt CSS eine tragende Rolle. Und das gilt auch unter ASP.NET. Ich gehe immer wieder auf CSS ein, verzichte im Buch aber auf die Beschreibung der Grundlagen. Sie finden auf der Buch-CD aber (natürlich) einen Artikel, der CSS recht ausführlich behandelt. 23
Einführung
Im Datenbankteil setze ich voraus, dass Sie wissen, was eine Datenbank ist. Außerdem sollten Sie ein wenig mit SQL umgehen können. Auf der Buch-CD finden Sie (einmal wieder ...) einen ausführlichen Artikel zu dieser Datenbankabfrage und -Manipulationssprache. Das Buch kann die einzelnen verwendeten Programmiersprachen natürlich nicht ausführlich behandeln. Dazu gibt es schließlich ganze separate Bücher. Es beschreibt also nur die Grundlagen und die wesentlichen Aspekte. Wenn Sie weitere Informationen zu einer Sprache wünschen, sollten Sie ein passendes Buch parallel lesen. In der GoToReihe finden Sie zu allen hier eingesetzten Sprachen sehr gute Bücher. Als Systemumgebung benötigen Sie einen Rechner, der idealerweise Windows 2000 oder XP ausführt. Für den .NET-Teil des Buchs benötigen Sie möglichst ab 128 MB Arbeitsspeicher. Die CPU sollte natürlich nicht zu langsam sein, so etwa 700 MHz reichen aber aus. Die Festplatte sollte für die .NET-Installation zwischen 500 MB und 2 GB freien Platz besitzen (je nachdem, ob Sie nur das .NET Framework oder auch Visual Studio .NET installieren). Entwicklungsumgebungen benötigen Sie für dieses Buch nicht unbedingt. HTML-, DHTML- und JavaScript-Programme und CSSDateien können Sie in einem einfachen Editor entwickeln. Fehler in Programmen, die in HTML-Dateien eingebunden sind, können Sie mit dem frei erhältlichen Microsoft Script Debugger oder mit dem Netscape-Debugger suchen. ASP.NET-Programme können Sie, genau wie alle anderen .NET-Programme, ebenfalls in einem normalen Editor entwickeln. Wenn Sie allerdings Visual Studio .NET besitzen, sollten Sie diese Entwicklungsumgebung für die Programmierung von .NET-Anwendungen nutzen. Visual Studio bietet eine Vielzahl an hilfreichen Tools und Features. ASP.NET-Programme werden zwar im Gegensatz zu JavaScript-Programmen kompiliert, dieses geschieht allerdings automatisch. Visual Studio .NET benötigen Sie dazu also nicht. Normale .NET-Programme wie Windowsanwendungen oder Klassenbibliotheken müssen explizit kompiliert werden. Wenn Sie Visual Studio .NET nicht besitzen, können Sie
24
1.1 Zum Buch
Einführung
dazu den Kommandozeilencompiler des .NET Frameworks-SDK verwenden. Zum Debuggen von .NET-Programmen steht Ihnen im .NET Framework-SDK ein sehr guter Debugger zur Verfügung. 1.1.3 Die Referenz Das Buch ist gleichzeitig Arbeitsbuch und Referenz. In den meisten Kapiteln finden Sie neben einer grundlegenden Erläuterung eines Features teilweise umfangreiche Tabellen, die oft alle, sonst aber die wichtigsten Elemente beschreiben. Ursprünglich war geplant, zudem im letzten Teil des Buchs eine separate Referenz unterzubringen. Weil ich aber Befürchtungen hatte, dass Sie das Buch dann nicht mehr heben können ( ), habe ich mich entschieden, die Referenz in PDF-Form auf der Buch-CD unterzubringen. Ich denke, das Inhaltsverzeichnis und der Index dieser Referenz hilft Ihnen (wie mir schon jetzt) bei der täglichen Arbeit sehr dabei, herauszufinden, wie das eine oder andere Feature angewendet wird.
1.1.4 Die Buch-CD Auf der dem Buch beiliegenden CD finden Sie alle Beispielprogramme, viele zusätzliche Artikel und spezielle Tools. Im Buch sind einige Beispiele aus Platzgründen nicht vollständig abgedruckt. Die Dateien auf der CD sind identisch mit den Beispielcodes, enthalten aber komplett ausprogrammierte Programme. Die ASP.NET-Beispiele sind so angelegt, dass Sie diese direkt ausprobieren können, ohne Visual Studio .NET dazu verwenden zu müssen. Sie sollten die Beispiele in einen Ordner Ihrer Wahl kopieren und dann im IIS ein virtuelles Verzeichnis anlegen, das mit diesem Ordner verknüpft ist. Im Stammordner der Beispiele finden Sie eine Datei default.htm, über die Sie die einzelnen Beispielprogramme aufrufen können. Da ASP.NET-Programme nur dann ausgeführt werden, wenn die entsprechenden Dateien über den Webserver geöffnet werden, reicht es für diese Beispiele nicht aus, die default.htm-Datei direkt im Browser zu öffnen. Deshalb ist die Installation der Beispiele in einem virtuellen IIS-Ordner notwendig.
25
Einführung
Falls der IIS auf Ihrem System noch nicht installiert ist, lesen Sie im Artikel Installation und Einrichtung des Systems nach, den Sie auf der Buch-CD finden. Dort wird die Installation beschrieben. Öffnen Sie zum Anlegen des virtuellen Webordners dann den InternetdiensteManager über den Eintrag VERWALTUNG in der Systemsteuerung. Über den Befehl NEU im Kontextmenü des Eintrag STANDARDWEBSITE im Internetdienste-Manager können Sie ein neues virtuelles Verzeichnis anlegen. Ab Seite 87 finden Sie weitere Hinweise dazu. In den Artikeln der Buch-CD finden Sie außerdem zusätzliche Informationen zu wichtigen Themen, die vom Konzept her nicht in das Buch passten. Eine wichtige Auswahl dieser Artikel beschreibt die folgende Auflistung:
Installation und Einrichtung des Systems.pdf/.htm: beschreibt die Installation der für das Buch benötigen Komponenten und die grundsätzliche Einrichtung des Entwicklungsrechners. HTML.pdf/.htm: beschreibt die wesentlichen Aspekte von HTML, der Basissprache zur Beschreibung und Formatierung von Internet-Dokumenten. CSS.pdf/.htm: beschreibt die Grundlagen und Anwendung der Cascading Style Sheets zur flexiblen und einfachen Formatierung von HTML-Dokumenten. OOP-Grundlagen.pdf/.htm: behandelt die Grundlagen der objektorientiert Programmierung (auch für C#). SQL.pdf/htm: beschreibt die Grundlagen, die wichtigen Elemente und die Anwendung von SQL/92 (dem aktuellen Standard) und T/SQL (dem SQL des SQL Servers) zur Abfrage und Manipulation von relationalen Datenbanken.
Schauen Sie auf jeden Fall einmal in diese Artikel hinein, wenn Sie Informationen zu diesen Themen suchen. Die Artikel sind teilweise sehr umfangreich. Die Datei Links.htm im Stammordner der Buch-CD enthält Links zu allen im Buch genannten und zu anderen zu den Buch-Themen passenden Webseiten. Über diese Datei finden Sie sehr viele Informationen für den Bereich der Internetprogrammierung. Einzelne Links kön26
1.1 Zum Buch
Einführung
nen natürlich mit der Zeit ungültig werden, was besonders für die Microsoft-Dokumente gilt, die unverständlicherweise mit teilweise kryptischen oder eine Version beinhaltenden Namen versehen sind. Sofern ich Zeit finde, werde ich in unregelmäßigen Abständen ( ) eine aktuelle Version dieser Datei auf meiner Website unter der Adresse www.juergen-bayer.net/ip/links.htm pflegen.
1.1.5 Ein Wort an die weiblichen Leser Im Buch verwende ich immer die (leider) übliche männliche Form. Ich bin zwar ein ausgesprochener Feminist (sofern man das als Mann überhaupt von sich behaupten kann), eine zweigleisige Vorgehensweise (»der/die Programmierer/in«) oder der in den USA manchmal praktizierte Wechsel zwischen der weiblichen und der männlichen Form ist aber für den Lesefluss eher hinderlich. 1.1.6 Typografische Konventionen Dieses Buch verwendet einige typografische Konventionen, die dem allgemeinen Standard entsprechen. Syntaxbeschreibungen
Wenn ich die Syntax einer Deklaration beschreibe, verwende ich eine kompakte und übersichtliche Form wie im folgenden Beispiel (das die IndexOf-Methode der string-Klasse von C# beschreibt): int IndexOf({string | char} value [, int startIndex] [,int count])
Normale Wörter sind sprachspezifische Schlüsselwörter. Kursive Wörter sind Platzhalter für Eingaben, die Sie spezifizieren müssen. Die in eckigen Klammern stehenden Elemente sind optional. Diese Elemente können Sie, müssen Sie jedoch nicht angeben. Die eckigen Klammern sind nur Teil der Syntaxbeschreibung und werden nicht im Programmcode angegeben. Wenn an einer Stelle mehrere Varianten möglich sind, werden diese durch ein | (das Oder-Zeichen in vielen Sprachen) voneinander getrennt. Handelt es sich dabei um eine nichtoptionale Angabe, schließe ich diese in geschweifte Klammern ein. Diese Klammern werden dabei natürlich im Quellcode auch nicht mit angegeben. 27
Einführung
Sie müssen bei den Syntaxbeschreibungen ein wenig aufpassen: In einigen Sprachen wie JavaScript gehören eckige und geschweifte Klammern zur Syntax. Geschweifte Klammern werden in JavaScript und in C# (eine andere .NET-Sprache) verwendet, um Anweisungsblöcke zu kennzeichnen. In Visual Basic .NET werden diese Klammern verwendet, um Arrays direkt bei der Deklaration zu initialisieren. Eckige Klammern werden in JavaScript und C# bei Arrays verwendet, um die Indizes zu spezifizieren. Sie müssen die Syntaxbeschreibungsklammern also von den sprachspezifischen Klammern unterscheiden. Beispiel-Listings
Beispiel-Listings werden in der Schriftart Letter Gothic dargestellt: string now; now = DateTime.Now.ToShortDateString(); Response.Write("Heute ist der " + now);
Aufgrund der beschränkten Breite müssen einige Anweisungen umbrochen werden. In VBScript und Visual Basic .NET muss dazu der Unterstrich an eine umbrochene Zeile angehängt werden, was natürlich auch in den Beispiel-Listings umgesetzt wird: Response.Write("Heute ist der " & _ DateTime.Now.ToShortDateString());
Exkurse
Für den Fall, dass ein Begriff, der eigentlich nicht direkt zum jeweiligen Thema gehört, doch kurz beschrieben werden soll, erfolgt diese Beschreibung in Form eines Exkurses. Ein Exkurs wird wie dieser Absatz dargestellt. Typografische Konventionen im Fließtext
Im normalen Text werden sprachspezifische Schlüsselwörter in der Schriftart Courier dargestellt. Wörter in Kapitälchen im normalen Text bezeichnen Teile der Benutzerschnittstelle, wie z.B. Menübefehle und Schalter. Menübefehle, die in einem Menü untergeordnet sind, werden mit den übergeordneten Menüs angegeben, wobei die einzelnen
28
1.1 Zum Buch
Einführung
Menüebenen durch einen Schrägstrich getrennt werden (z.B. DATEI / BEENDEN). Datei- und Ordnernamen werden kursiv formatiert. Internetadressen werden folgendermaßen gekennzeichnet: www.addison-wesley.de. Tastenkappen wie (F1) stehen für Tasten und Tastenkombinationen, die Sie betätigen können, um bestimmte Aktionen zu starten. 1.1.7 Die Icons in diesem Buch Zur Erleichterung der Orientierung verwendet dieses Buch verschiedene Icons für Textabschnitte mit besonderer Bedeutung. Über dieses Symbol werden Hinweise gekennzeichnet, deren Beachtung wichtig ist. Programmiersprachen und die beim Programmieren verwendeten Komponenten und Server enthalten häufig so einige Fallen, in die Sie arglos tappen können. Spezielle »Achtung«-Hinweise, die mit diesem Icon gekennzeichnet sind, machen auf diese Fallen aufmerksam und bieten natürlich – sofern möglich – gleich auch eine Lösung. Dieses Symbol kennzeichnet allgemeine Tipps, Hinweise zur Lösung bestimmter Probleme, die im Buch nicht weiter behandelt werden, und Hinweise auf Webseiten oder andere Ressourcen, die ein Thema näher beleuchten.
1.2 Internetprogrammierung in der Übersicht 1.2.1 Was unterscheidet Internetprogramme von klassischen Anwendungen? Klassische Anwendungen werden lokal auf dem Rechner des Anwenders ausgeführt. Internetprogramme dagegen hauptsächlich auf entfernten Webservern. Das ist eigentlich schon der große Unterschied. Und daraus ergeben sich einige Vorteile der Internetprogrammierung gegenüber der klassischen Programmierung. Die Probleme bei der Installation klassischer Anwendungen
Klassische Anwendungen werden komplett oder teilweise (in Form verteilter Anwendungen) auf dem Rechner des Anwenders ausgeführt.
29
Einführung
Dazu ist es notwendig, dass die Anwendung auf dem Rechner des Anwenders installiert wird. Für einzelne Personen mag dies keinen großen Aufwand bedeuten. Für Firmen, die sehr viele Anwender mit einer Software ausstatten müssen, bedeutet dies aber schon recht viel Arbeit. Zudem ist die Installation häufig nicht allzu einfach, weil in der Regel einige Systemkomponenten installiert oder aktualisiert werden müssen. Eine umfangreiche Visual-Basic-6-Anwendung mit Datenbankzugriff erfordert beispielsweise die Vor-Installation von MDAC (den Microsoft Data Access Components, die für den Datenzugriff verwendet werden) in der Version, die auf dem Entwicklungsrechner verwendet wurde. Oft muss für diese Anwendungen auch die aktuelle JET-Engine (zum Zugriff auf Access-Datenbanken) installiert werden. Verwendet die Anwendung diverse andere COM-Komponenten (MDAC liegt ebenfalls in Form von COM-Komponenten vor), werden diese ebenfalls installiert. Dabei treten häufig Probleme auf, weil die eine oder andere Komponente aus irgendwelchen Gründen nicht installiert werden kann oder nach der Installation zu einem fehlerhaften Verhalten anderer Programme oder Komponenten führt. Meine Erfahrung aus der Praxis ist, dass es recht schwierig ist, eine komplexe Software an viele Anwender zu verteilen, die natürlich ganz unterschiedliche Betriebssystemumgebungen besitzen. Der Support, der für die Installation und den Betrieb der Anwendung notwendig ist, sprengt oft die Grenzen der Machbarkeit. Ein weiteres Problem ist die notwendige Nachinstallation der Anwendung, nachdem der Programmierer eine neue, fehlerbereinigte oder erweiterte Version entwickelt hat (was erfahrungsgemäß in der ersten Phase einer Softwareeinführung recht häufig vorkommt). Diese neue Version muss auf allen Rechnern erneut installiert werden. Die ITAbteilung einer Firma, die gerade erst 50 Rechner mit der ersten Version einer Anwendung ausgerüstet hat (und jetzt noch stöhnt), wird sich bedanken, wenn sie eine Woche später alles noch einmal wiederholen muss. Ist der Installationsaufwand für private Anwendungen oder innerhalb einer Firma vielleicht noch zu rechtfertigen, so ist dies aber nicht mehr der Fall für Firmen, die eine Software zum Zugriff auf Firmendaten an sehr viele externe Anwender verteilen muss. Ich habe selbst einmal eine solche Anwendung entwickelt. Das Centrum für Reisemedizin in
30
1.2 Internetprogrammierung in der Übersicht
Einführung
Düsseldorf ermöglichte damit seinen Kunden, so genannte Reisegesundheitsbriefe abzurufen, die Informationen zu gesundheitlichen Risiken und zu Vorsorgemaßnahmen für einzelne Länder beinhalten. Die Kommunikation dieses Programms mit dem Server, der die Daten bereithielt, lief (wie bei den meisten dieser Programme) über eine Telefonleitung und spezifische Protokolle. Wenn in einem solchen Fall eine neue Version der Anwendung an mehrere Tausend Kunden verteilt werden muss, bedeutet dies für die Firma einen erheblichen Aufwand und meist auch hohe Kosten. Die klassische Programmierwelt hat eine Lösung dieses Problems darin gefunden, dass Programme einfach auf mehrere Rechner verteilt werden. Auf einem oder mehreren Servern werden Komponenten installiert, die Programmteile (in Form von Klassen) enthalten. Über eine Kommunikationstechnologie wie das Microsoft COM- oder das allgemeinere CORBA-Konzept erzeugen die eigentlichen Anwenderprogramme aus diesen Klassen Objekte und rufen deren Methoden auf. Die Anwendung selbst enthält meist nur noch wenig Programmcode, die maßgebliche Logik (die »Geschäftslogik1«) befindet sich in den Komponenten. Eine Änderung der Geschäftslogik erfordert dann im Idealfall lediglich eine einzige Neuinstallation auf dem Server. Leider funktioniert dies in der Praxis oft nicht, da die Änderungen häufig so umfangreich sind, dass die Schnittstelle zu den Anwenderprogrammen geändert werden muss. Alte Anwenderprogramme werden inkompatibel und müssen neu programmiert und installiert werden. Zudem benötigt ein Anwenderprogramm eine direkte Netzwerkverbindung zu den Servern, die die Komponenten ausführen. In einem lokalen Firmennetz mag das kein Problem sein. Wenn der Anwender allerdings weit entfernt ist, wird die Kommunikation (über DFÜ oder TCP/IP) schwierig und meist auch sehr langsam. Hinzu kommt, dass das verwendete Kommunikationskonzept bestimmte Betriebssysteme voraussetzt. Das Microsoft COM-Konzept funktioniert z.B. nur unter Windows. Die Anbindung von Rechnern mit anderen Betriebssystemen ist kompliziert oder gar unmöglich.
1 Der Begriff »Geschäftslogik« kommt daher, dass diese Programmlogik die Logik widerspiegelt, mit der im »Geschäft« (in der Firma) Daten verarbeitet werden. Die Geschäftslogik meiner Firma schreibt z.B. vor, dass vogonische Kunden immer im Voraus bezahlen müssen.
31
Einführung
Die Lösung der geschilderten Probleme sind HTML-basierte Internetprogramme2. Diese werden in einem Webbrowser angezeigt und teilweise auf dem Anwenderrechner (in Form von JavaScript-Programmen), aber zum größten Teil auf dem Webserver ausgeführt (in Form von ASP-, ASP.NET-, JSP- und anderen Programmen). Da die Programmdateien immer und vollständig auf dem Webserver gespeichert sind (egal, ob client- oder serverseitig) und bei jeder Benutzung erneut zum Client heruntergeladen werden, erfordern diese Programme keine Installation und sind damit automatisch auch immer aktuell. Die Geschäftslogik ist normalerweise komplett in den auf dem Server gespeicherten Programmen untergebracht. Eine Änderung dieser Logik erfordert keine Anpassung auf dem Anwendercomputern. Ein Update der Anwendung kann also einfach auf den Webserver gespeichert werden. Fragt ein Benutzer die Anwendung erneut ab, erhält er sofort und ohne Probleme die neue Version. Hinzu kommt, dass die Anbindung neuer Anwender absolut keine Probleme bereitet. Firmen schützen den Internetzugang zu ihren kostenpflichtigen oder firmeninternen Programmen natürlich, so dass ein Anwender sich einloggen muss. Der einzige Aufwand zur Anbindung neuer Anwender ist dann, ein Anwenderkonto zu erzeugen und dem Anwender die Login-Informationen zukommen zu lassen. Das Centrum für Reisemedizin hat beispielsweise mittlerweile (natürlich) auf diese Art mein altes Programm durch ein Internetprogramm ersetzt (www.crm.de). Einfache Kommunikation
Klassische Programme mussten häufig mit anderen Anwendungen oder Servern kommunizieren, die weit entfernt laufen. Die Kommunikation erfolgte häufig über DFÜ-Verbindungen und Telefonleitungen. Die speziellen Protokolle, die dabei meist verwendet wurden, erforderten vom Programmierer viel Arbeit. Die Programmierung neuer oder die Erweiterung vorhandener klassischer Lösungen war aufgrund der komplexen, unterschiedlichen Server und Protokolle meist recht kompliziert, was besonders dann galt, wenn der Programmierer die vorhandene Lösung nicht selbst entwickelt hatte.
2 Wie Sie ab Seite 34 noch erfahren, können Internetanwendungen auch klassische Anwendungen sein, die über ein Internetprotokoll mit anderen Anwendungen kommunizieren.
32
1.2 Internetprogrammierung in der Übersicht
Einführung
Meine Reisegesundheitsbrief-Anwendung ist ein recht gutes Beispiel für diese Problematik. Die Verbindung mit dem Server des Centrums für Reisemedizin wurde dabei über ein Modem oder ISDN aufgebaut. Der Server erwartete Eingaben nach einem bestimmten textbasierten Protokoll und lieferte recht komplexe Textdaten, die das Programm zunächst interpretieren musste. Das war keine allzu leichte Aufgabe. Die Internetprogrammierung löst diese Probleme (natürlich). Reine, HTML-basierte Internetprogramme haben das Problem der Kommunikation mit entfernten Servern meist gar nicht, weil diese Server normalerweise in der Nähe des Webservers laufen. Aber auch für die Entwicklung von Windowsanwendungen, die entfernte Dienste nutzen, bietet die Internetprogrammierung Lösungen. So können Sie recht einfach Programme entwickeln, die über TCP/IP oder UDP/IP über das Internet mit anderen Programmen oder Servern kommunizieren. Die dabei standardisierten höheren Protokolle (wie HTTP und SMTP) oder Speichertechniken (wie XML) erleichtern die Kommunikation erheblich. Für die Verwendung dieser Protokolle und Techniken bieten moderne Programmiersysteme natürlich einfach anzuwendende Komponenten. Neben der reinen IP-Kommunikation können Sie aber auch mit Webdiensten arbeiten. Diese Dienste werden auf einem Webserver installiert und auch dort ausgeführt. Beliebige, SOAP3-fähige Anwendungen können diese Dienste sehr einfach verwenden, weil im Prinzip lediglich Methoden aufgerufen werden. Die Internetprogrammierung bietet also recht viele Möglichkeiten zur Lösung der Probleme der klassischen Programmierung. 1.2.2 Clientseitige versus serverseitige Internetprogrammierung Programme für das Internet können so entwickelt werden, dass diese auf dem Client (dem Anwenderrechner) oder dem Server laufen. Clientseitige Internetprogramme sind entweder echte (Windows-)Anwendungen, die über eines der Internetprotokolle (z.B. über TCP/IP, HTTP oder SOAP) mit anderen Anwendungen auf entfernten Rechnern kommunizieren, oder in HTML eingebundene Skripte. Serverseitige Programme 3 Das Simple Object Access Protokoll ist ein einfaches, textbasiertes Protokoll, das definiert, wie Anwendungen über das Internet Methoden von Webdiensten aufrufen können und wie die Rückgabewerte dieser Methoden zurückgeliefert werden.
33
Einführung
werden normalerweise (wenigstens im Fall von ASP) in HTML-Seiten eingebunden, auf dem Webserver ausgeführt und im Webbrowser des Client angezeigt. Clientseitige Internetprogramme
Internetprogramme, die komplett auf dem Computer des Anwenders ausgeführt werden, besitzen (zurzeit) nicht allzu viel Bedeutung bei der Internetprogrammierung. Die Verwendung echter (Windows-)Anwendungen für solche Programme ist problematisch, da diese für jedes Betriebssystem separat entwickelt und vor der Benutzung auf dem Client installiert werden müssen. Wird die Anwendung umgearbeitet und verbessert, muss sie von allen Anwendern neu installiert werden. Dieses Problem wurde ja bereits besprochen. Die Bedeutung von normalen Anwendungen, die über das Internet kommunizieren, könnte in Zukunft aber auch wieder größer werden. Zurzeit werden so genannte Peer-To-Peer-Programme diskutiert, die über das Internet eine direkte Verbindung zueinander aufbauen. Beispiele dafür sind die Dateitauschbörse Morpheus (www.morpheus.com) und das Projekt SETI@Home (www.seti-inst.edu/science/setiathome.html). Bei Morpheus kommuniziert ein Windows-Client direkt mit einem speziellen Server und den Clients anderer Anwender und ermöglicht so den direkten Austausch frei verfügbarer Dateien. Bei SETI@Home wertet ein spezielles Programm kleine Datenpakete aus, die ein SETI4-Server versendet, und sendet das Ergebnis zum Server zurück. SETI sucht nach außerirdischem Leben und nutzt über SETI@Home die Ressourcen von vielleicht Millionen verschiedenen Rechnern zur Auswertung der Beobachtungsdaten. Die Internetseite www.peer-to-peerwg.org befasst sich recht ausführlich mit dem Thema Peer-To-Peer. Das Buch behandelt die Programmierung solcher Anwendungen in Kapitel 16. Neben diesen Peer-To-Peer-Programmen werden clientseitige Anwendungen sehr häufig in Form von in HTML eingebundenen Programmen eingesetzt. Theoretisch wäre es damit möglich, komplette Pro4 Search for Extraterrestrial Intelligence
34
1.2 Internetprogrammierung in der Übersicht
Einführung
gramme zu entwickeln und so den Installationsaufwand zu umgehen. Script-Sprachen, Java-Applets und die anderen verwendeten Techniken sind in den Möglichkeiten aber arg eingeschränkt und können (aus Sicherheitsgründen) meist auch nicht auf die Ressourcen des lokalen Rechners zugreifen. Genutzt werden solche clientseitigen Programme aber, um HTML-Seiten, die ohne Programmierung sehr statisch sind, dynamisch zu gestalten. Eine HTML-Seite mit einem bei einer Mausberührung aufklappenden Menü wird beispielsweise fast ausschließlich über eingebettete Script-Programme erzeugt (alternativ ist die Verwendung von Java Applets oder ActiveX-Steuerelementen möglich). Sehr häufig werden Script-Programme in Verbindung mit ASP(.NET)Dokumenten verwendet, um einige Teile der Programmierung auf den Client auszulagern und damit die Ausführung der Anwendung zu beschleunigen. Serverseitige Internetprogramme
Serverseitige Internetprogramme werden auf dem Webserver ausgeführt. Ein Teil dieser Programme verwendet Techniken wie CGI, ASP, ASP.NET, JSP oder PHP zur Erzeugung von HTML-Code. Diese Programme werden normalerweise über einen Browser aufgerufen, der das HTML-Ergebnis natürlich auch darstellt. Die Artikelliste von OnlineShops wird z.B. häufig auf dieser Art aufgebaut und dargestellt. Bei vielen serverseitigen Internetprogrammen mit HTML-Oberfläche ermöglichen spezielle HTML-Steuerelemente dem Anwender die Eingabe von Daten, die beim Aufruf des Programms (meist über einen speziellen Submit-Schalter) zum Server übertragen und dort ausgewertet werden. Eine Bestellung in einem Online-Shop wird beispielsweise so auf den Webserver übertragen und dort über das serverseitige Programm in eine Datenbank gespeichert. Das Buch geht ab Seite 43 grundlegend und ab Kapitel 6 ausführlich auf ASP.NET ein. Manche Programme oder Server geben aber auch Daten zurück, oft in Form von XML. Diese Programme können von beliebigen Anwendungen aufgerufen werden, die die zugrunde liegende Technologie beherrschen. Die über den Microsoft SQL Server verwalteten Datenbanken können beispielsweise über das Internet recht einfach abgefragt werden. Das Programm auf dem Client, das dann eine Internet- oder Windowsanwendung sein kann, kann diese Daten beliebig weiterverarbeiten.
35
Einführung
Eine neue Version serverseitiger Programme sind Webdienste. Webdienste sind im Prinzip Objekte, die auf einem Webserver gespeichert sind und deren Methoden über das Internet aufgerufen werden. Der Aufruf der Methoden erfolgt über standardisierte Internetprotokolle wie HTTP oder SOAP. Geben Webdienst-Methoden Daten zurück, erfolgt dies in Form von XML. Zum Aufruf von Webdienst-Methoden und zur Verarbeitung der zurückgelieferten Daten müssen Sie aber nicht die Internet-Protokolle oder XML beherschen. Verschiedene Toolkits oder Klassen des Programmiersystems (z.B. des .NET Frameworkss) ermöglichen den einfachen Aufruf der Methoden von Webdiensten und die ebenso einfache Auswertung zurückgelieferter Daten. Webdienste werden ab Seite 48 grundlegend und in Kapitel 15 ausführlich behandelt.
1.3 HTML, DHTML, CSS, XHTML und XML HTML
HTML (HyperText Markup Language) ist eine textbasierte Sprache zur Beschreibung des Inhalts und der Formatierung von Dokumenten. Im Prinzip können Sie ein HTML-Dokument mit einem Word-Dokument vergleichen: Ein solches Dokument enthält Text, Steuerelemente, Grafiken, multimediale Inhalte und Formatierungen. Der maßgebliche Unterschied ist, dass der Quellcode eines HTML-Dokuments aus lesbarem Text besteht. Ein einfaches HTML-Dokument sieht z.B. so aus:
Einfaches HTML-Dokument
Einfaches HTML-Dokument Hallo, das ist ein einfaches HTML-Dokument.
Die Elemente in spitzen Klammern sind so genannte Tags, die unter anderem die Formatierung des Dokuments steuern. Das h1-Tag sorgt zum Beispiel dafür, dass der eingeschlossene Text als Überschrift erster Ebene dargestellt wird.
36
1.3 HTML, DHTML, CSS, XHTML und XML
Einführung
HTML-Dokumente werden hauptsächlich im Internet eingesetzt und von Webbrowsern angezeigt. Das kennen Sie ja wahrscheinlich bereits. Abbildung 1.1 zeigt das Beispieldokument im Internet-Explorer. Abbildung 1.1: Ein einfaches HTML-Dokument im InternetExplorer
Auf der Buch-CD finden Sie einen Artikel, der recht ausführlich auf den aktuellen HTML-Standard 4.0 eingeht. DHTML
DHTML (Dynamic HTML) ist keine Sprache wie HTML, sondern eine Erweiterung des HTML-Standards. Browser, die DHTML unterstützen, ermöglichen Script-Programmen (die in HTML eingebunden sind) den Zugriff auf die Elemente des HTML-Dokuments. HTML-Elemente werden dazu als Objekte betrachtet, deren Eigenschaften gelesen und geändert werden können. Mit JavaScript ist es über das DHTML-Modell z.B. kein Problem, die Hintergrundfarbe eines Verweises (Links) beim Herüberfahren mit der Maus zu ändern oder ein Menü beim Klicken mit der Maus aufzuklappen (wie Sie dies von einigen Websites her kennen). Nur, um zu demonstrieren, wie DHTML prinzipiell funktioniert, zeigt das folgende Beispiel ein HTML-Dokument, bei dem die Hintergrundfarbe eines Überschrift-Elements wechselt, wenn der Anwender die Maus darauf bewegt:
37
Einführung
Einfaches DHTML-Dokument
Einfaches DHTML-Dokument Fahren Sie mit der Maus über die Überschrift, um deren Hintergrundfarbe zu ändern.
Das Ergebnis dieses Quellcodes, dessen Verständnis schon einiges an Wissen fordert, sehen Sie in Abbildung 1.2. In Kapitel 4 geht das Buch ausführlich auf JavaScript, in Kapitel 5 auf DHTML ein. Zum grundsätzlichen Verständnis erläutere ich den Quelltext ein wenig: Das script-Tag leitet ein JavaScript-Programm ein. Innerhalb dieses Tag ist eine Funktion (changeColor) deklariert, die die Hintergrundfarbe des Header-Tag je nach dem übergebenen Argument ändert. Die Funktion greift über das DHTML-Objektmodell auf das Header-Tag (h1) zu und ändert den Stil dieses Tags (wo auch schon ein wenig CSS verwendet wird). Dieser ist dazu über das id-Attribut mit einem Namen versehen (header). Über die Attribute onmouseover und onmouseout werden die Bewegungen der Maus auf dieser Überschrift mit der Funktion change-
38
1.3 HTML, DHTML, CSS, XHTML und XML
Einführung
Color verknüpft. Immer dann, wenn die Maus über der Überschrift bewegt wird, wird die Funktion mit dem Argument 'red' aufgerufen. Wird die Maus aus dem Bereich der Überschrift herausbewegt, wird diese Funktion mit dem Argument 'white' aufgerufen. Abbildung 1.2: Das BeispielDHTMLDokument im normalen Zustand und mit der Maus auf der Überschrift
CSS
CSS (Cascading Style Sheets) ist eine Erweiterung von HTML, die es ermöglicht, den Stil (die Formatierung) von HTML-Elementen flexibler zu gestalten, als es mit HTML allein möglich ist. Über CSS-Stile können Sie einen Absatz oder eine Überschrift z.B. ohne Probleme mit einer bestimmten Hintergrundfarbe und einem Rahmen versehen, was mit HTML alleine nicht möglich ist. Das folgende Beispiel ändert den Stil des h1-Tag so ab, dass dieser einen Rahmen besitzt, mit einer grauen Hintergrundfarbe dargestellt wird und seinen Text mittig ausrichtet:
39
Einführung
Einfaches HTML-Dokument mit CSS
Einfaches HTML-Dokument mit CSS
Abbildung 1.3: Das BeispielHTML-Dokument mit CSS
40
1.3 HTML, DHTML, CSS, XHTML und XML
Einführung
In diesem Beispiel wird der Stil des h1-Tag über ein in das Dokument integriertes style-Tag umdefiniert. CSS-Stile können aber auch in externen Dateien verwaltet und in HTML-Dokumente gelinkt werden. Damit können Sie ein bestimmtes Layout für alle HTML-Dokumente einer Website festlegen und sehr einfach auch ändern. CSS wird im gleichnamigen Artikel auf der Buch-CD beschrieben. Die übliche Kombination
Üblicherweise verwenden Websites eine Kombination aus HTML, CSS und DHTML:
HTML erzeugt den Grundaufbau der Seite, Cascading-Style-Sheet-Dateien verwalten den Stil aller zur Website gehörenden HTML-Dateien (womit eine Änderung des Stils der Website recht einfach möglich ist), JavaScript-Programme reagieren auf bestimmte Ereignisse wie der Mausbewegung auf einem HTML-Element, über DHTML erhalten JavaScript-Programme Zugriff auf alle Objekte der HTML-Seite und können diese dynamisch verändern (z.B. ein Menü dynamisch erzeugen und sichtbar machen).
XHTML
XHTML (Extensible HyperText Markup Language) ist eine Weiterentwicklung von HTML 4.0. XHTML basiert auf HTML 4.0 und XML und verbindet die Vorzüge dieser beiden Sprachen. Da die aktuellen Webbrowser zurzeit und in der näheren Zukunft lediglich HTML 4.0 unterstützen, besitzt XHTML noch keine allzu große Bedeutung. XHTML wird deshalb in diesem Buch nicht beschrieben, ich zeige aber im HTML-Artikel, wie Sie Ihre HTML-Dokumente so gestalten, dass diese möglichst XHTML-konform sind. XML
XML (Extensible Markup Language) ist eine Familie von Standards zur Speicherung und Verarbeitung von strukturierten Daten in Textform. XML-Dateien sehen zwar ähnlich aus wie HTML-Dateien, besitzen aber eine grundlegend andere Bedeutung: HTML-Dateien enthalten unstrukturierte Dokumente (deren Bedeutung es ist, irgendwie dargestellt zu werden), XML-Dateien speichern strukturierte Daten (die eine Anwendung beliebig auswerten kann, nicht nur zur Darstellung). 41
Einführung
XML-Dateien können Sie mit Datenbanken vergleichen (die ja auch strukturierte Daten speichern). XML besitzt aber einige Vorteile gegenüber Datenbanken. Einer der wichtigsten ist die Speicherung der Daten in Textform. Deshalb kann eine Anwendung oder eine Komponente, die auf einem beliebigen System läuft, Daten zu einem anderen beliebigen System senden, das diese dann problemlos auswerten kann. So kann eine Windowsanwendung beispielsweise Daten von einem Webdienst anfordern, der auf einem Unix-Rechner läuft. Ein anderer wichtiger Vorteil ist die Flexibilität der Struktur eines XML-Dokuments. Im Vergleich zu einer Datanbank ist die Änderung der Struktur von XML-Daten sehr einfach. Ein einfaches XML-Dokument, das die Daten von zwei Adressen speichert, sieht z.B. so aus:
Wenn Sie dieses Beispiel ausprobieren wollen, müssen Sie eine Datei erzeugen, deren Endung .asp ist. Diese Datei müssen Sie in einem Ordner des Webservers speichern und im Browser über die URL des Webservers aufrufen (nicht über eine Dateiangabe). Die Zeichenfolgen sind so genannte ASP-Token. In diese Token sind Programmanweisungen eingebunden. Das Beispiel verwendet dazu die Sprache VBScript. Alternativ wäre für ASP auch JScript, der Microsoft-JavaScript-Dialekt, möglich. Fordert ein Browser ein ASP-Dokument an, erkennt der Webserver an der Dateiendung, dass es sich um eine ASP-Datei handelt. Der Webserver liest die Datei ein und übergibt sie an eine Funktion der Komponente asp.dll, die für die Abarbeitung von ASP-Programmen verantwortlich ist. Diese führt die Programmanweisungen des ASP-Dokuments über eine zur verwendeten Sprache passende Script-Engine aus. Einige Anweisungen (z.B. Response.Write) erzeugen HTML-Code, der gemeinsam mit dem direkt im ASP-Dokument enthaltenen HTML-Code in das Ergebnis geschrieben wird. Nach der Abarbeitung der Datei gibt die ASP.dll das Ergebnis an den Webserver zurück, der das damit erzeugte HTMLDokument schließlich zum Client zurücksendet. 45
Einführung
Das Ergebnis des Beispiels oben zeigt der folgende HTML-Code:
Hello World
Hello World Hello World Hello World
ASP.NET
ASP.NET ist die neue ASP-Variante, die auf dem .NET Framework basiert. Das .NET Framework wird in Kapitel 6 noch umfassender erläutert. Für den Anfang reicht es aus, zu wissen, dass das .NET Framework eine komplette Infrastruktur zur Erzeugung, Ausführung und Verteilung von Anwendungen zur Verfügung stellt. Ein wichtiger Teil des .NET Frameworks ist die umfangreiche Klassenbibliothek, die unter anderem sehr viele Klassen für die Internetprogrammierung enthält. ASP.NET erweitert das klassische ASP um einige wichtige Features. Um diese zu verdeutlichen, liste ich zunächst die Nachteile der Programmierung unter ASP auf:
46
Die Programmierung einer benutzerfreundlichen Programmoberfläche ist unter ASP recht schwierig. Um besondere Features, wie eine Überprüfung von Benutzereingaben, zu erreichen, sind einige JavaScript-, DHTML- und andere »Tricks« notwendig. ASP-Dokumente sind meist komplex aufgebaut, da der HTMLCode des Dokuments mit dem Programm vermischt ist. Die Wartung und Weiterentwicklung eines ASP-Dokuments ist deshalb meist nicht einfach, was besonders dann gilt, wenn ein anderer Programmierer die Anwendung entwickelt hat. Die in ASP verwendeten Skriptsprachen sind, verglichen mit echten Programmiersprachen, in den Möglichkeiten arg eingeschränkt. Beispielsweise fehlen echte Datentypen (Skriptsprachen kennen nur einen allgemeinen Datentyp), allgemeine Funktionen müssen explizit in ASP-Dokumente eingebunden werden. Zudem ist die objektorientierte Programmierung nur sehr eingeschränkt möglich.
1.4 Was ist ASP, was ist ASP.NET?
Einführung
ASP-Programme werden bei jeder Ausführung vom Webserver neu interpretiert. Die Ausführungsgeschwindigkeit ist deshalb nicht besonders hoch. Das Debuggen von ASP-Seiten ist zwar möglich. Verglichen mit echten Entwicklungsumgebungen ist das ASP-Debuggen aber sehr eingeschränkt.
ASP.NET hebt diese Nachteile auf. ASP.NET-Programme werden in einer echten Programmiersprache, wie C# oder Visual Basic .NET, entwickelt. Deshalb können Sie bei der Entwicklung alle Features nutzen, die eine moderne Programmiersprache bietet. Die erzeugten Programme werden (automatisch) bei der ersten Ausführung einer ASP.NET-Seite kompiliert. Für alle weiteren Ausführungen dieser Seite (bei denen die kompilierte Version verwendet wird) ist die Performance wesentlich höher als bei ASP-Programmen. Eine große Anzahl spezieller Internet-Steuerelemente, deren Verwendung sehr einfach ist, erleichtert die Erstellung der Oberfläche. Diese Steuerelemente sorgen bei der Ausführung des Programms selbst dafür, dass für den Webbrowser auf dem Client passender HTML-Code erzeugt wird. Dynamische Webseiten, die auf Ereignisse wie z.B. einen Mausklick auf einem Schalter reagieren, sind mit ASP.NET nur noch ein sehr kleines Problem. Um solche Seiten zu erstellen, erzeugen Sie einfache Ereignisbehandlungsmethoden für die gewünschten Ereignisse, so wie es Visual Basic-, Delphi- oder .NET-Programmierer sowieso schon gewöhnt sind. Bei der Ausführung des Programms wird bei einigen Steuerelementen je nach Browser sogar automatisch JavaScript-Code in das HTML-Dokument integriert. Damit wird das beim alten ASP oft notwendige »Hin und Her« (bezeichnet als »Roundtrip«) zwischen Client und Server auf ein Minimum reduziert. Wenn Sie beispielsweise in ASP eine Eingabe auf Gültigkeit überprüfen wollen, müssen Sie entweder selbst JavaScript-Code in das Dokument integrieren oder das Dokument an eine ASP-Seite senden, die die Eingaben auf dem Server überprüft. ASP.NET nimmt Ihnen diese Arbeit über spezielle Validierungs-Steuerelemente ab. ASP.NET besitzt also fast nur Vorteile. Der einzige »Nachteil« ist der, dass ASP.NET die Installation des .NET Frameworks auf dem Webserver erfordert. Wenn das .NET Framework nicht (wie andere Micro-
47
Einführung
soft-Technologien) eine Vielzahl an Sicherheitslöchern mit sich bringt, die erst nach und nach entdeckt werden (von den Hackern natürlich wesentlich früher als von Microsoft), wird das aber kein Problem darstellen. Andererseits werden viele Firmenkunden der Installation eines relativ neuen Framework auf einem Produktionsrechner wohl nicht so ohne weiteres zustimmen. Wenigstens so lange nicht, wie das .NET Framework noch nicht Bestandteil des Betriebssystems ist (was aber in der Windows-Version nach XP der Fall sein wird).
1.5 Was sind Webdienste? Webdienste sind Komponenten, die auf einem Webserver laufen und von beliebigen Anwendungen über das Internet verwendet werden können. Im Prinzip ist ein Webdienst eine Klasse mit Methoden, die allerdings – anders als normale Methoden – über das Internet von einem beliebigen (internetfähigen) Computer aufgerufen werden können. Das Ergebnis einer solchen Methode wird ebenfalls über das Internet zurückgeliefert. Eine Bank könnte z.B. einen Webdienst anbieten, der u.a. den aktuellen Kurswert von Aktien liefert. Beim Aufruf der entsprechenden Methode würde ein Kürzel für die Aktie übergeben werden, die Methode würde den Wert der Aktie in Form von XML zurückliefern. Microsoft verfolgt damit eine Idee, die als »Software as a Service« bezeichnet wird: Eine Anwendung bedient sich verschiedener Webdienste um den Anwender mit Informationen und Features zu versorgen und muss selbst kaum noch Programmcode enthalten. Der Aufruf des Webdienstes und das Zurücksenden der Daten erfolgen über SOAP, ein spezielles, normalerweise auf HTTP basierendes Protokoll, oder über das HTTP-Protokoll selbst. Deshalb können alle SOAPbzw. HTTP-kompatiblen Anwendungen Webdienste verwenden. Microsoft bietet ein kostenloses »SOAP-Toolkit« an, mit dem die Programmierung von SOAP-fähigen Anwendungen recht einfach ist. Wenn Sie Ihre Anwendungen in einer .NET-Sprache entwickeln, können Sie stattdessen auf die im .NET Framework enthaltenen Klassen zur Verwendung von Webdiensten zurückgreifen. Natürlich können Sie mit dem .NET Framework auch eigene Webdienste entwickeln. Das Buch behandelt die Programmierung von Webdiensten in Kapitel 15.
48
1.5 Was sind Webdienste?
Basiswissen
2
Basiswissen
In diesem Kapitel behandle ich nicht die Internet-Grundlagen (also keine Angst ...), sondern stelle lediglich die für Programmierer wichtigen Bereiche vor, allerdings ohne diese ausführlich zu erläutern. Ein Internetprogrammierer muss wissen, was eine IP-Adresse ist, muss aber nicht die Feinheiten der IP-Kommunikation oder der Einteilung von IP-Adressen kennen. Genauso sollte ein Internetprogrammierer zwar wissen, was das HTTP- oder das FTP-Protokoll ist. Er wird aber eigentlich nur in absoluten Ausnahmefällen direkt mit diesem Protokoll arbeiten. Ich beschreibe die einzelnen Themen deswegen in diesem Kapitel lediglich so, dass Sie wissen, worum es sich handelt und die einzelnen Themen vielleicht einmal auch selbst ausprobieren können. Wenn Sie mehr dazu wissen wollen, finden Sie diese Themen ausführlicher im Artikel Internet-Grundlagen für Programmierer auf der Buch-CD beschrieben.
2.1 RFCs Alles, was irgendwie mit dem Internet zusammenhängt, wird in technischen Dokumenten beschrieben, die als »RFC« (Request For Comment1) bezeichnet werden. Neben Diskussionen über neue Forschungsprojekte, Berichten über den Zustand des Internet und anderem werden dort auch die Internet-Protokolle sehr ausführlich dokumentiert. RFC-Dokumente werden einfach nummeriert. RFC 791 beschreibt z.B. das IP-Protokoll. Beim Verleger der RFCs, dem RFC-Editor, finden Sie eine Möglichkeit, die einzelnen RFCs einzusehen. Gehen Sie dazu zur Seite www.rfc-editor.org/overview.html. Klicken Sie auf den SEARCH-Link und geben Sie auf der Suchseite einen Suchbegriff wie z.B. die RFC-Nummer ein. Da die Webseite des RFC-Editors oft recht langsam ist und die Seiten einiger Dokumente manchmal erst gar nicht angezeigt werden, finden Sie eine gute und schnelle Alternative bei der Internet Engineering Task Force (IETF): www.ietf.org/rfc.html.
1 Aufforderung, Kommentare zur beschriebenen Technologie einzusenden
49
Basiswissen
Im weiteren Verlauf nehme ich immer wieder Bezug auf RFC-Dokumente. Beachten Sie, dass RFCs kontinuierlich weiterentwickelt werden. Finden Sie bei der Suche auf der RFC-Editor-Seite im rechten Bereich des Suchergebnisses einen Eintrag »Obsoleted by«, ist das betreffende RFC-Dokument mittlerweile durch ein neues ersetzt worden. Im RFC 2800 (zum Zeitpunkt der Drucklegung dieses Buchs aktuell) finden Sie eine Übersicht über die RFCs, die die Internetprotokolle betreffen.
2.2 Die IP-Adresse Jeder Rechner, der an das Internet oder an ein Intranet angeschlossen ist, besitzt eine eindeutige IP-Adresse. Eigentlich handelt es sich dabei um eine einfache 32-Bit-Zahl. IP-Adressen werden aber an sich immer so dargestellt, dass die einzelnen Bytes dieser Zahl durch Punkte getrennt angegeben werden. Abweichend von der normalen Zahl-Darstellung wird das erste Byte aber links angegeben (das erste Byte ist normalerweise das kleinere und müsste folglich rechts angegeben werden). Eine typische IP-Adresse wird z.B. so dargestellt: 128.66.12.1. Dieses Beispiel steht für die Zahl 17580672. Wenn Sie einmal eine als Zahl dargestellte IP-Adresse umrechnen wollen (oder müssen), konvertieren Sie die Zahl in einen Hexadezimalwert (für das Beispiel: 10C428016), drehen die einzelnen Bytes um (8016.4216.0C16.0116) und rechnen diese in Dezimalwerte zurück. Ein Teil der Adresse adressiert das lokale Netzwerk, an das der Rechner angeschlossen ist. Der andere Teil adressiert den Rechner. Im Beispiel steht 128.66 für das Netzwerk und 12.1 für den Rechner. 2.2.1 Die Klasseneinteilung der IP-Adressen IP-Adressen werden in verschiedene Klassen eingeteilt. Abhängig von der Klasse der Adresse werden unterschiedliche Teile als Netzwerkbzw. Rechneradresse gewertet. Welcher Klasse einer IP-Adresse angehört, wird an den ersten Bits erkannt:
50
2.2 Die IP-Adresse
Basiswissen
Ist das linke Bit einer IP-Adresse 0, handelt es sich um eine KlasseA-Adresse. Da es sich bei diesem Bit eigentlich um Bit 8 des linken Byte handelt, kann man auch sagen, dass ein Wert kleiner als 128 im linken Byte eine solche Adresse bezeichnet. Bei einer Klasse-AAdresse steht das linke Bit für die Klasse, die nächsten sieben Bit identifizieren das Netzwerk. Die restlichen drei Bytes bezeichnen einen Rechner im lokalen Netz. Damit existieren maximal 127 Klasse-A-Adressen, die jedoch jede für sich Millionen von angeschlossenen Rechnern adressieren können. Wenn das linke Bit einer IP-Adresse gesetzt ist und das folgende nicht, handelt es sich um eine Klasse-B-Adresse. Alternativ kann man sagen, dass ein Wert von 128 bis 191 im linken Byte eine solche Adresse kennzeichnet. Bei einer Klasse-B-Adresse stehen die linken zwei Bit für die Klasse, die nächsten 14 Bit bezeichnen das Netzwerk, die restlichen 16 Bit den Rechner. Damit sind 16.383 Netze der Klasse B möglich, die jedes für sich 65.535 Rechner enthalten können. Wenn die linken drei Bit einer Adresse 110 sind (bzw. wenn im linken Byte ein Wert von 192 bis 223 gespeichert ist), handelt es sich um eine Klasse-C-Adresse. Bei einer solchen Adresse bestimmen die linken drei Bit die Klasse, die folgenden 21 Bit das Netzwerk und die restlichen acht Bit den Rechner. Damit sind 2.097.152 Klasse-C-Netze möglich, die jedes für sich maximal 255 Rechner enthalten können. Adressen, die mit 111 beginnen (bzw. im linken Byte einen Wert größer als 223 speichern), sind für besondere Zwecke reserviert und gehören zu keinem speziellen Netzwerk. Momentan werden in diesem Bereich so genannte Multicast-Adressen verwaltet. Über diese Adressen können Gruppen von Computern adressiert werden, die ein gemeinsames Protokoll benutzen. Ein besonderer Klasse-C-Adressbereich ist 192.168.0.x. Diese Adressen sind für private Zwecke reserviert und werden im Internet nicht verwendet. Wenn Sie ein einfaches privates Intranet aufbauen, können Sie den Bereich dieser Adresse sehr gut nutzen, um Ihren Rechnern festen Adressen zuzuteilen und dabei nicht mit Adressen im Internet in Konflikt zu geraten, wenn die Rechner mit dem Internet verbunden sind. Die Adresse 127.0.0.1 bezeichnet immer das lokale System. Für diese Adresse existiert immer auch der Alias localhost. 51
Basiswissen
2.2.2 Subnetze und Subnetzmasken Ein Subnetz ist ein Teil eines Netzes, der nur über einen Router oder ähnliche Rechner Verbindung mit den Rechnern anderer Subnetze besitzt und der über einen eigenen Bereich von IP-Adressen adressiert wird. Subnetze werden häufig eingesetzt, um die Administration eines großen Netzes zu verteilen oder um Teile eines Gesamtnetzes (aus Sicherheitsgründen) von anderen abzuschotten. Um diese Subnetze zu adressieren, kann der Administrator Teile der Bits verwenden, die in einer IP-Adresse zur Rechneridentifikation gedacht sind. Dazu werden so genannte Subnetzmasken verwendet. Klasse-B-Netzwerke arbeiten beispielsweise normalerweise mit der Subnetzmaske 255.255.0.0. Eine Subnetzmaske wird so interpretiert, dass jedes gesetzte Bit in der Maske die Netzwerkadresse identifiziert. Im Beispiel stehen also die Bits der zwei linken Bytes für die Netzwerkadresse (was bei einer Klasse-BAdresse ja normal ist). Der Router, der das Netzwerk mit der Außenwelt verbindet, arbeitet mit genau dieser Subnetzmaske. Enthält das Netzwerk Subnetze, arbeiten die internen Router häufig mit der Subnetzmaske 255.255.255.0. Das bedeutet nun, dass das dritte Byte zur Adressierung des Subnetzes verwendet wird (die ersten beiden stehen ja für das Hauptnetz). Das rechte Byte adressiert dann innerhalb des Subnetzes die angeschlossenen Rechner. In einem solchen Netz können also maximal 255 Subnetze existieren, die jedes für sich maximal 255 Rechner enthalten können. Subnetzmasken müssen nicht wie im Beispiel ein komplettes Byte einbeziehen. Wenn weniger Subnetze vorhanden sind, die mehr Rechner adressieren sollen, kann der Administrator auch weniger Bits des Rechnerteils der IP-Adresse für die Adressierung der Subnetze verwenden. Bei einer Klasse-C-Adresse erlaubt die Subnetzmaske 255.255.255.192 beispielsweise vier Subnetze mit jeweils 64 angeschlossenen Rechnern. Nur damit Sie diese Rechnung verstehen: 192 entspricht binär 110000002. Die linken zwei Bit werden also für die Adressierung des Subnetzes verwendet, und daraus ergeben sich eben genau vier Möglichkeiten. Die restlichen sechs Bit gehören zur Rechneradresse, und das ergibt 64 Möglichkeiten.
52
2.2 Die IP-Adresse
Basiswissen
2.2.3 Vergabe von IP-Adressen In einem Intranet ohne direkten Zugang zum Internet können Sie IP-Adressen ohne weiteres frei vergeben. Sie müssen lediglich darauf achten, dass der Typ der Adresse (Klasse A, B oder C) und die Subnetzmaske gleich ist. Ist einer der Rechner indirekt (z.B. über eine ISDNKarte oder ein DSL-Modem) an das Internet angeschlossen, sollten Sie den Adressbereich für private Adressen (192.168.0.0 bis 192.168.0.255) verwenden, um keine Konflikte mit vorhandenen IP-Adressen zu verursachen. Für Rechner, die direkt am Internet angeschlossen sind, müssen Sie eine IP-Adresse beziehen. Privatpersonen oder kleinere Firmen erhalten diese über den Internet-Service-Provider. Größere Firmen und Internet-Service-Provider beziehen ganze Adressbereiche von einem der drei Internet-Registrations-Unternehmen. Für Europa ist das die Firma RIPE NCC (www.ripe.net). Für den amerikanischen Raum ist das Unternehmen ARIN zuständig, für den asiatischen Raum die Firma APNIC. IP-Adressen müssen eben weltweit eindeutig sein. Rechner, die über einen Router oder Provider an das Internet angeschlossen sind, werden auch häufig dynamisch über einen DHCP-Server mit einer IP-Adresse versorgt. Das ist beispielsweise der Fall, wenn Sie Ihren Rechner mit dem PoP des Providers über das DFÜ-Netzwerk von Windows verbinden. Ein DHCP-Server beim Provider ermittelt eine freie IP-Adresse in dem (Sub-)Netzbereich des Providers und übermittelt diese an Ihren Rechner. Dieser ist dann unter zwei IPAdressen erreichbar: Im lokalen Netz unter seiner privaten und über das Internet über die zugeteilte Adresse. Die IP-Adressen Ihres Rechners können Sie übrigens über das Programm ipconfig abfragen.
2.3 IP-Namensauflösung Zur Kommunikation in einem IP-Netz werden ausschließlich die IPAdressen der angeschlossenen Rechner verwendet. Wie Sie ja sicher schon wissen, können Sie zur Adressierung eines Rechners aber auch den Rechnernamen eingeben. In der einfachsten Form ist dies in einem Intranet der bloße Name des Rechners. In komplexen Intranets und im Inter-
53
Basiswissen
net werden zudem Domänen2 verwendet, die die Identifikation der Rechner vereinfachen. Bei dem Namen »www.addison-wesley.de« steht »de« beispielsweise für die Top-Level-Domäne de (Deutschland), »addison-wesley« bezeichnet die untergeordnete Domäne von Addison-Wesley und »www« ist der Name des Rechners, der in dieser Domäne verwaltet wird. Domänennamen werden von NICs (Network Information Centers) vergeben und verwaltet. Für Deutschland ist das DE-NIC zuständig (www.nic.de). Wenn Sie nun einen solchen Rechnernamen in einem Programm verwenden, das eine IP-Kommunikation aufbaut, muss der Name in die passende IP-Adresse umgewandelt werden. Dazu stehen zwei Verfahren zur Verfügung. Bei der einfachen und älteren Variante verwaltet eine spezielle Tabelle im Rechner die Namen der benachbarten Rechner mit deren IP-Adresse. Dies ist häufig auf Unix-Systemen üblich. Windows-Rechner fragen in einem einfachen Internet die IP-Adressen allerdings ganz einfach über das normale Windows-Netzwerk ab. Das neuere Verfahren nutzt eine verteilte Datenbank, den so genannten Domain Name Service (DNS). 2.3.1 Der Name-Service in lokalen Netzen Für die Adressierung einzelner Rechner in lokalen Netzen können Sie meist problemlos deren Namen an Stelle der IP-Adresse verwenden. Eine Webserver im Intranet sprechen Sie im Webbrowser z.B. einfach mit »http://Zaphod« an (wobei »Zaphod« der Rechnername ist). Für den lokalen Webserver können Sie auch den Alias localhost verwenden: »http://localhost«. Das System setzt den angegebenen Namen automatisch in die IP-Adresse des angesprochenen Rechners um. Wird der lokale Rechner angesprochen, setzt das System den Rechnernamen (bzw. localhost) immer in die Adresse 127.0.0.1 um. Werden entfernte Rechner angesprochen, fordert das System in einfachen Windows-Netzen die IP-Adresse über das Windows-Netzwerk direkt vom anderen Rechner an. Auf kleineren Unix-Systemen wird 2 Der Begriff »Domäne« (englisch »Domain« = »Gebiet«) bezeichnet im Allgemeinen einen Wissens- oder einen Steuerungsbereich. Im Internet ist mit einer Domäne ein Bereich von IPAdressen gemeint, die geographisch oder thematisch zusammengehören. Auf Windows-Systemen ist eine Domäne zudem eine Gruppierung von Computern und Betriebsmitteln, die zu einer Gruppe Benutzer gehören.
54
2.3 IP-Namensauflösung
Basiswissen
zur Ermittlung der IP-Adresse allerdings häufig eine Rechnertabelle verwendet, die in Form einer einfachen Textdatei meist im Ordner etc/ hosts gespeichert ist. Diese Tabelle enthält die einzelnen Rechnernamen und die dazugehörigen IP-Adressen. Größere Netze nutzen dagegen meist einen Nameserver, der die Rechnernamen der angeschlossenen Netze mit den IP-Adressen verbindet. Auf Windows-Systemen ist dies der WINS (Microsoft Windows Name Service), der auf den Server-Versionen von NT, 2000 und XP läuft. Nameserver sind in der Lage, sich mit benachbarten Nameservern auszutauschen, so dass ein Nameserver auch die IP-Adressen der Rechner benachbarter (Sub-)Netzwerke kennt. Außerdem ist die Administration gegenüber einer Rechnertabelle (die normalerweise manuell gepflegt wird) erheblich vereinfacht. 2.3.2 Der Domain Name Service (DNS) Genau wie im Intranet sind IP-Adressen auch im Internet sehr unhandlich. Deshalb werden im Internet (und in größeren Intranets) Namen verwendet, die in Domänen eingeteilt sind. Der Name www.addison-wesley.de besteht beispielsweise aus der Toplevel-Domäne de, der die Subdomäne addison-wesley untergeordnet ist, und dem in dieser Domäne verwalteten Rechner www. Toplevel-Domänen bezeichnen einzelne Länder (wie de für Deutschland oder at für Österreich) oder Geschäftsbereiche (wie com für kommerzielle Unternehmen, edu für Ausbildungsunternehmen und net für Netzwerkdienste). Mittlerweile sind die Toplevel-Domänen aber etwas durcheinander geraten, da prinzipiell jeder eine Internetadresse in einer nahezu beliebigen Toplevel-Domäne beantragen kann. Subdomänen bezeichnen das Zielnetzwerk, an das der adressierte Rechner angeschlossen ist. Für größere Netzwerke können innerhalb einer Subdomäne noch weitere Subdomänen verwaltet werden. Der Webserver im Netzwerk des »Marshal Space Flight Center« der Nasa wird z.B. mit www.msfc.nasa.gov adressiert. msfc steht hier für eine untergeordnete Subdomäne, die ein Teil der NASA-Subdomäne ist. Innerhalb der untergeordneten Domäne kann eine Firma oder eine Privatperson nahezu beliebig viele Rechner verwalten. Die meisten Rechner für das World Wide Web heißen wohl www, die für den FTP55
Basiswissen
Dienst werden meist ftp genannt. Prinzipiell sind aber auch alle anderen denkbaren (und gültigen Namen) möglich. Der Suchserver von Microsoft (search.micosoft.com) oder der Übersetzungsdienst von Altavista (babelfish.altavista.com) sind Beispiele dafür. Diese Domänennamen müssen, wie auch im Intranet, vor dem Senden von Daten in die IP-Adresse des Zielrechners umgewandelt werden. Dazu werden DNS-Server verwendet. Ein DNS-Server verwaltet in einer Datenbank Rechnernamen und die zugehörigen IP-Adressen. Erhält ein DNS-Server eine Anfrage nach einem unbekannten Namen, leitet er diese an einen so genannten autorativen DNS-Server weiter. Ein autorativer DNS-Server ist ein beliebiger DNS-Server, der Informationen für die Subdomäne bereithält. Kennt der autorative DNSServer den angeforderten Namen nicht, leitet er die Anfrage an einen Primary-Nameserver weiter, der Informationen für die ToplevelDomäne bereithält. Der Primary-Nameserver für die de-Domäne läuft beispielsweise beim DE-NIC. Der Primary-Nameserver kennt zwar nicht die Namen der einzelnen Rechner der Toplevel-Domäne, aber er kennt die dieser Domäne untergeordneten autorativen Server. Er leitet die Anfrage deshalb einfach an den nächsten passenden autorativen DNS-Server weiter. Kann der autorative DNS-Server den Namen auflösen, sendet er das Ergebnis zum ursprünglich angesprochenen DNS-Server zurück. Dieser speichert den Namen und die IP-Adresse dann in seinem Cache, damit zukünftige Anfragen direkt beantwortet werden können, und sendet das Ergebnis zu der IP-Adresse, die die Anfrage gestartet hat. Kann ein Name nicht aufgelöst werden, antwortet ein DNS-Server einfach nicht. Die Internetanwendung meldet dann nach einer gewissen Wartezeit, dass der Name nicht aufgelöst werden kann (was auch eine Falschmeldung sein kann, nämlich dann, wenn die Anfrage sehr viel Zeit in Anspruch nimmt). In der IP-Konfiguration eines Rechners ist entweder die Adresse eines DNS-Servers fest eingetragen oder festgelegt, dass diese Adresse bei der Einwahl in den PoP des Internet-Providers automatisch übertragen wird. Wenn beispielsweise ein Browser ein HTML-Dokument anfordert, kennt das System die IP-Adresse eines DNS-Servers, kann diesen nach der IP-Adresse des angegebenen Domänennamens fragen und die Anforderung dann an die so ermittelte IP-Adresse senden. 56
2.3 IP-Namensauflösung
Basiswissen
2.4 IP-Ports Im Internet oder in einem Intranet laufen die verschiedensten Dienste. Die bekanntesten sind wohl der WWW-, der FTP- und der SMTPDienst. Diese Dienste können über separate Serveranwendungen auf einem einzelnen Rechner ausgeführt werden, was beispielsweise unter Windows der Fall ist, wenn Sie den IIS installieren. Aber auch spezielle Server oder Anwendungen, die über das Internet mit anderen Anwendungen kommunizieren, müssen auf einem Rechner identifiziert werden. Genau dazu werden die so genannten IP-Ports verwendet. Ein Port ist einfach eine 16-Bit-Dezimalzahl, die einen Dienst oder ein Programm identifiziert. Es gibt reservierte, so genannte »Well Known Ports«, mit einer Nummer unterhalb von 256. Diese Ports adressieren bekannte Dienste wie WWW, SMTP und FTP. Der WWW-Dienst eines Webservers wird z.B. immer über den Port 80 adressiert, der FTP-Dienst verwendet den Port 21. Wenn Sie in einem Webbrowser eine Webadresse wie z.B. http:// www.addison-wesley.de eingeben, erweitert Ihr Webbrowser diese Adresse implizit um den Port des angesprochenen Dienstes: http://www.addisonwesley.de:80. Der Port wird über einen Doppelpunkt von der eigentlichen Adresse getrennt. Der Browser erkennt den anzusprechenden Port übrigens mehr oder weniger automatisch am eingegebenen Namen. Beginnt der Name mit »ftp://« oder »ftp.«, würde er den Port 21 anhängen. Beim Senden der Daten wird der Zielport als Teilinformation eines Datenpakets mitgesendet. Daraus erkennt das Betriebssystem auf dem Server, welcher Dienst anzusprechen ist. Beim Port 80 übergibt das Betriebssystem beispielsweise die eingegangenen Daten an den Webserver, der diesen Port für sich beim Betriebssystem reserviert hat. Ports mit einer Nummer größer als 255 können beliebig verwendet werden3. Programme und Dienste, die nicht zum Internet-Standard gehören, wie z.B. der Microsoft SQL Server, nutzen eine solche freie Portnummer.
3 Früher waren noch die Ports 256 bis 1024 für UNIX-typische Dienste reserviert, was aber heute nicht mehr gilt.
57
Basiswissen
Aber nicht nur Server-, sondern auch Clientanwendungen werden über einen Port identifiziert. Der Server muss angeforderte Daten ja schließlich zum Client zurücksenden. Dazu reserviert sich jede Clientanwendung beim Start normalerweise eine dynamisch vergebene, freie Portnummer. Beim Senden einer Anforderung wird – wie Sie beim UDP- und beim TCP-Protokoll ab Seite 64 noch sehen – auch diese Portnummer mit im Datenpaket übertragen, sodass der Server weiß, wohin er die angeforderten Daten senden soll. Deshalb ist es auch problemlos möglich, mit mehreren Instanzen eines Webbrowsers gleichzeitig zu arbeiten, ohne dass diese durcheinander geraten.
2.5 URIs, URLs und URNs URIs (Uniform Resource Identifier) werden im Internet zur Identifikation von Ressourcen verwendet. Eine Ressource ist im Allgemeinen etwas, das unter einem eindeutigen Namen angesprochen werden kann, beispielsweise eine Mailbox, eine Datei, ein Dienst oder ein Programm. URIs beschreiben typischerweise den Mechanismus, der verwendet wird, um die Ressource anzusprechen (z.B. http:// für das HTTP-Protokoll), den Namen des Computers, der die Ressource verwaltet, und den Namen der Ressource selbst. Das Schema einer URI ist für die einzelnen Protokolle festgelegt und weicht auch manchmal vom allgemeinen Schema ab. Die Adresse eines HTML-Dokuments sieht beispielsweise so aus: http://www.boarder-magazin.de/index.htm
Eine über FTP erreichbare Datei wird prinzipiell identisch adressiert: ftp://ftp.is.co.za/rfc/rfc1808.txt
Die URI zur Adressierung einer Mailbox oder einer Newsgroup sieht aber etwas anders aus: mailto:[email protected] news:microsoft.public.dotnet.languages.csharp
58
2.5 URIs, URLs und URNs
Basiswissen
URLs (Uniform Resource Locator) sind eine Unterordnung von URIs, die eine Datei bezeichnen, die über das Internet angesprochen werden kann. URLs sind Strings, die das zu verwendende Protokoll, die Adresse oder den Domänennamen und optional den Port, den Pfad und Argumente angeben: Protokoll://Host[:Port][Absoluter Pfad[?Argumente]] Für das HTTP-Protokoll sieht eine URL beispielsweise so aus: http://www.boarder-magazin.de/index.htm http://www.boarder-magazin.de:80/index.htm http://www.microsoft.com/Data http://search.microsoft.com?siteid=us/dev
Falls beim HTTP-Protokoll Argumente angegeben sind, werden diese meist von ASP(.NET)- oder CGI-Programmen ausgewertet. Falls bei einer URL keine Angabe der anzusprechenden Ressource (Datei) erfolgt, verwendet der Server die Ressource, die als Standard für den angesprochenen Ort eingestellt ist. URNs sind eine andere Art URIs, die Ressourcen bezeichnen, deren Ort unbestimmt ist, die aber über spezielle Dienste identifiziert werden können. Eine E-Mail-Adresse ist ein bekanntes Beispiel für eine URN. Der Speicherort der damit angesprochenen Mailbox kann nahezu beliebig (innerhalb der Domäne der Adresse) wechseln, die Adresse bleibt aber immer dieselbe. URNs garantieren Eindeutigkeit und eine endlose Lebenszeit.
2.6 Internet-Medientypen und MIME Wenn Programmierer über das Internet reden, fällt häufig der Begriff Medientyp bzw. MIME. Auch in diesem Buch kommt der Begriff MIME häufiger vor. Deshalb sollten Sie wissen, worum es sich dabei handelt. Mime ist die Kurzform für »Multipurpose Internet Mail Extensions« (Mehrzweck-Internet-Mail-Erweiterungen). MIME ist von der ursprünglichen Bedeutung her ein Standard, der es ermöglicht, dass
59
Basiswissen
E-Mails und angehängte (oft binäre) Daten in einer Datei gemeinsam versendet werden können. Um dem Empfänger den Typ der angehängten Daten mitteilen zu können (damit dieser die Daten korrekt interpretieren kann), werden spezielle Medientyp-Bezeichnungen verwendet. Der Typ text/html spezifiziert beispielsweise ein HTML-Dokument. Da sich herausgestellt hat, dass diese Medientypen auch zu anderen Zwecken im Internet nützlich sind, werden MIME-Typen mittlerweile sehr häufig zur Spezifizierung des Typs gesendeter Daten verwendet. Wenn ein Medientyp gemeint ist, müsste eigentlich auch der (allgemeinere) Begriff »Medientyp« verwendet werden, was auch in den offiziellen Schriften der Fall ist. Im normalen Sprachgebrauch wird aber meist der Begriff »MIME-Typ« verwendet. Eine Medientyp-Angabe besteht aus einem Haupttyp, einem optionalen Untertyp und einer ebenfalls optionalen Angabe des Zeichensatzes, falls es sich um einen Texttyp handelt. Haupttyp und Untertyp werden durch einen Schrägstrich getrennt angegeben. Tabelle 2.1 listet die zurzeit existierenden Medien-Haupttypen auf. Tabelle 2.1: Die MedienHaupttypen
Medien-Haupttyp
spezifiziert
text
Textdaten
image
Grafikdateien
video
Videodateien
audio
Sounddateien
application
Dateien, die an ein bestimmtes Programm gebunden sind
multipart
mehrteilige Daten
message
Nachrichten
model
Dateien, die mehrdimensionale Strukturen repräsentieren
Für jeden Haupttyp existieren meist recht viele Untertypen. Der textTyp wird beispielsweise in comma-separated-values, css, html, javascript, plain und andere Untertypen unterteilt. Tabelle 2.2 gibt eine Übersicht über die wichtigsten Medientypen.
60
2.6 Internet-Medientypen und MIME
Basiswissen
Medientyp
Bedeutung
application/zip
zip-Archivdateien
application/rtf
RTF-Dateien
application/msword
Word-Dateien
application/msexcel
Excel-Dateien
application/pdf
PDF-Dateien
audio/basic
Basis-Audiodateien (.au, .snd)
audio/x-midi
Midi-Dateien
audio/x-mpeg
MPEG 2-Dateien (.mp2)
audio/x-pn-realaudio
Real-Audio-Dateien (.ram, .ra)
audio/x-wav
Wav-Dateien (.wav)
image/gif
Bilddateien im GIF-Format (.gif)
image/jpeg
Bilddateien im JPEG-Format (.jpg, .jpeg, .jpe)
image/tiff
Bilddateien im TIFF-Format (.tiff, .tif)
message/http
Mail im HTTP-Format
message/news
Mail im Format für Newsgroups
multipart/byteranges
Mehrteilige (Mail-)Nachricht im Byte-Format
multipart/encrypted
Mehrteilige, verschlüsselte (Mail-)Nachricht
multipart/form-data
Mehrteilige HTTP-Nachricht mit den Daten eines HTML-Formulars
text/comma-separated-values
Textdatei mit kommabegrenzten Feldwerten (.csv)
text/css
Cascading Style Sheets-Datei (.css)
text/html
HTML-Datei (.htm, .html)
text/javascript
JavaScript-Datei (.js)
text/plain
Normale Textdatei (.txt)
text/richtext
RTF-Datei (.rtf)
text/tab-separated-values
Textdatei mit durch Tabulatoren begrenzten Feldwerten (.tsv)
video/mpeg
Videodateien im MPEG-Format (.mpeg, .mpg, .mpe)
Tabelle 2.2: Die wichtigsten Medientypen
61
Basiswissen
Tabelle 2.2: Die wichtigsten Medientypen (Forts.)
Medientyp
Bedeutung
video/x-msvideo
Videodateien im AVI-Format (.avi)
x-world/x-vrml
VRML-Dateien (.wrl)
Eine vollständigere Liste finden Sie unter selfhtml.teamone.de/diverses/ mimetypen.htm. Auf www.isi.edu/in-notes/iana/assignments/media-types finden Sie ein offizielles Verzeichnis der Medientypen. Das MIMEFormat wird in den RFCs 2045, 2046 und 2077 beschrieben. Für Texttypen kann zusätzlich der Zeichensatz angegeben werden, wenn die Textdaten in einem anderen als dem ISO-8859-1-Zeichensatz codiert sind. Dazu wird das charset-Attribut durch ein Semikolon getrennt an den Medientyp angehängt: text/plain; charset=ISO-8859-2
2.7 Einfache Internetprotokolle Das Internet basiert auf der untersten Ebene auf dem IP-Protokoll. Alle Daten werden über dieses Protokoll versendet. Die Protokolle UDP und TCP setzen auf IP auf und erweitern diese Protokolle um wichtige Features, wie beispielsweise Angaben zum Port des Clients und zum Zielport. Höhere Protokolle, wie z.B. HTTP und SMTP, basieren auf UDP oder TCP. Die folgenden Abschnitte beschreiben die niedrigen Protokolle, die höheren werden ab Seite 67 beschrieben. 2.7.1 Das IP-Protokoll Damit die Kommunikation zwischen den verschiedensten Rechnern im Internet überhaupt funktioniert, werden Daten im Internet über das standardisierte IP4-Protokoll versendet. Eine ausführliche Beschreibung dieses Protokolls finden Sie im RFC 791.
4 Internet Protocol
62
2.7 Einfache Internetprotokolle
Basiswissen
Beim IP-Protokoll werden die zu sendenden Daten in Pakete, die so genannten Datagramme, verpackt und mit zusätzlichen Informationen versehen. Ein Datagramm besteht aus einem Header, der Kontrollinformationen und die Ursprungs- und Zieladresse speichert, und aus den zu versendenden Daten. Die Größe des Headers kann fünf oder sechs 32-Bit-Wörter betragen, die aus einzelnen Feldern bestehen. Das sechste Wort ist optional. Deswegen verwaltet das Feld IHL (Internet Header Length) die aktuelle Größe des Headers. Abbildung 2.1 zeigt die schematische Darstellung eines IP-Datagramms.
Version
IHL
Dienst-Typ
Gesamtlänge Flags
Identifikation Time to Live
Protokoll
Fragmentierungs-Offset
Header-Prüfsumme
Ursprungsadresse Zieladresse Padding
Optionen
}
Abbildung 2.1: Format von IPDatagrammen Header
Beginn des Datenbereichs
... ...
Anhand der Zieladresse im Header können Router die einzelnen Datagramme durch das Internet leiten. Die Ursprungsadresse wird vom empfangenden Dienst dazu verwendet, eventuelle Ergebnisdaten zurückzusenden. Beim Senden der Daten kommt es vor, dass einzelne Datagramme für ein Netzwerk, das dieses Datagramm übertragen soll, zu groß sind. Die recht großen Pakete eines Ethernet-Netzes können in einem X.25-Netz beispielsweise nicht direkt versendet werden. Der Gateway dieses Netzwerks teilt die Datagramme dann in kleinere Fragmente auf. Diese Fragmente besitzen dasselbe Format wie das gesamte Datagramm. Das Feld Identifikation speichert dann eine Information, zu welchem Datagramm das Fragment gehört, im Feld Fragmentierungs-Offset wird die Position des Fragments im Datagramm verwaltet. Im Feld Flags verwaltet IP eine Information darüber, ob ein Fragment das letzte eines Datagramms ist. Damit Datenpakete nicht endlos durch das Internet geroutet werden, wenn der Empfänger nicht erreichbar ist, verwaltet das Feld Time to Live einen Wert, der von jedem Router um den Wert 1 reduziert wird. 63
Basiswissen
Erkennt ein Router, dass dieser Wert 0 ist, verwirft er das Paket einfach. Die Anwendung, die das Datenpaket gesendet hat, erkennt nach einer gewissen Zeit an der fehlenden Antwort, dass der Empfänger nicht verfügbar ist. Das IP-Protokoll besitzt keine Möglichkeit, die Zustellung der Daten zu garantieren, empfangene Daten auf Fehler zu überprüfen (lediglich die Header-Informationen können an Hand der Header-Prüfsumme überprüft werden) und Prozesse auf dem Zielrechner zu adressieren. Die maximale Länge der Daten ist zudem beschränkt, weil ein Datagramm nur eine für das Quellnetzwerk maximale Größe annehmen kann. Eine Einschränkung entsteht daraus aber nicht, weil das IP-Protokoll lediglich auf der untersten Ebene arbeitet. Programme, die über das Internet kommunizieren wollen, können IP nicht direkt nutzen. Dazu stehen die höheren Protokolle UDP und TCP zur Verfügung, die die Einschränkungen von IP aufheben. 2.7.2 Das UDP-Protokoll Das UDP-Protokoll (User Datagram Protocol) setzt auf dem IP-Protokoll auf und erweitert dieses um Informationen über den Ursprungs- und den Zielport, um eine weitere Prüfsumme und um eine Längenangabe für die eigentlichen Daten. Diese Informationen werden in den ersten beiden 32-Bit-Wörtern des IP-Datenbereichs gespeichert. Abbildung 2.2 stellt diesen Bereich dar (ohne die Header-Felder des IP-Datagramms). Abbildung 2.2: Format von UDP (ohne IPHeaderfelder)
Ursprungsport
Zielport
Länge
Prüfsumme Beginn des Datenbereichs
...
}
IPDatenbereich
Mit UDP kann ein Programm Daten an einen definierten Zielport senden und den eigenen Port für die Antwort zum Server übermitteln. Eine Überprüfung der Daten auf das korrekte Versenden ist nicht möglich. Die Prüfsumme im UDP-Header wird lediglich zur Kontrolle der Headerinformationen verwendet. Zudem ist die Größe der Daten auf die Maximalgröße der Datagramme beschränkt. UDP sendet die Daten ohne zu
64
2.7 Einfache Internetprotokolle
Basiswissen
überprüfen, ob der Empfänger überhaupt zum Empfang bereit ist. Ist der Empfänger nicht bereit, gehen die gesendeten Daten einfach verloren. UDP wird für eine performante Übertragung geringer Datenmengen verwendet. Um eine relative Übertragungssicherheit zu ermöglichen, geben Serverdienste, die UDP verwenden, möglichst immer eine Antwort auf eine Anforderung. Geht eine Antwort beim Client ein, wird das als erfolgreiche Übertragung gewertet. Geht keine Antwort ein, wird die Anforderung einfach erneut gesendet. Das bei TCP wesentlich aufwändigere Verpacken der Daten und der Verbindungsaufbau vor dem Senden erfordern oft mehr Verwaltungsaufwand als das eventuell erneute Senden bei UDP. Eine Beschreibung des UDP-Protokolls finden Sie im RFC 768. 2.7.3 Das TCP-Protokoll Das wesentlich häufiger verwendete TCP-Protokoll (Transmission Control Protocol) setzt wie UDP ebenfalls auf IP auf. TCP erweitert IP um:
eine Überprüfung der Bereitschaft des Empfängers, eine Überprüfung der empfangenen Daten über eine Prüfsumme, eine relativ sichere Zustellung der Daten und die Fähigkeit, große Datenmengen in mehrere Pakete aufgeteilt zu versenden.
Wie bei UDP verwaltet das TCP-Protokoll zusätzliche Headerinformationen im IP-Datenbereich (Abbildung 2.3). Die zu sendenden Daten werden in kleine Pakete aufgeteilt. Jedes Paket erhält eine Sequenznummer. Der Empfänger kann die einkommenden Pakete an Hand dieser Nummer in der richtigen Reihenfolge zusammensetzen. Da jedes Paket zusätzlich mit einer Prüfsumme versehen ist, kann der Empfänger überprüfen, ob die Daten auf ihrem Weg eventuell beschädigt wurden. Erhält der Empfänger beschädigte Pakete oder sind Pakete verloren gegangen, fordert er die fehlenden Pakete einfach nach einer gewissen Zeit vom Sender nach. Damit ist die Zustellung von Daten bei TCP sehr sicher. 65
Basiswissen
Abbildung 2.3: Format des TCP-Protokolls
Ursprungsport
Zielport Sequenznummer Quittierungs-Nummer
Offset
Reserviert
Flags
Dringlichkeitszeiger
Prüfsumme
Padding
Optionen
}} TCPHeader
Fenster
Beginn des Datenbereichs
... ...
IPDatenbereich
Um das Versenden der Daten von Rechner A zu Rechner B zu garantieren, baut TCP zunächst eine Verbindung zum Zielrechner auf. Dazu sendet TCP zunächst ein Segment an Rechner B mit der Aufforderung, die Sequenznummern der folgenden Pakete zu synchronisieren. Der Zielrechner erkennt dies als Verbindungswunsch, liest die Startsequenznummer5 des Senders aus und antwortet mit einem Segment, in dem er Rechner A die Startsequenznummer der Pakete seiner potenziellen Antwort mitteilt. Daran erkennt Rechner A die Bereitschaft und beginnt mit dem Senden der Daten. Die einzelnen Pakete können dabei in loser Reihenfolge versendet werden und gehen häufig unterschiedliche Wege durchs Internet. Die Reihenfolge, in der die Pakete ankommen, ist also nicht festgelegt. An Hand der Sequenznummern kann der Zielrechner die Daten korrekt zusammensetzen. Nach dem Senden der Daten sendet TCP ein Segment mit der Information, dass keine Daten mehr folgen. Der Zielrechner sendet daraufhin das Ergebnis der Anforderung (vielleicht eine HTML-Seite), natürlich wieder in Pakete unterteilt. Danach wird die Verbindung mit dem Senden eines Segments abgeschlossen, das wiederum Rechner A mitteilt, dass keine Daten mehr folgen. Dieser Handshake zwischen den beteiligten Rechnern sichert ab, dass die Daten beim jeweiligen Zielrechner ankommen. Wie bei UDP wird der Dienst des Zielrechners und die Anwendung auf dem Client über Ports adressiert, die den TCP-Paketen beigefügt werden. Das TCP-Protokoll wird im RFC 793 beschrieben. 5 Die Startsequenznummer wird von TCP nicht vorgeschrieben, ist aber meistens die 1.
66
2.7 Einfache Internetprotokolle
Basiswissen
2.8 Socket-Dienste Auf Rechnern, die an das Internet oder an ein Intranet angeschlossen sind, sorgen so genannte Socket-Dienste dafür, dass die zu sendenden und empfangenen Daten entsprechend dem TCP- bzw. dem UDPProtokoll verarbeitet werden. Socket heißt übersetzt »Steckdose«. Ein Socket verbindet wie eine Steckdose zwei entfernte Geräte miteinander, ohne dass man wissen muss, wie die Verbindung physikalisch realisiert wird. Unter Windows übernimmt diese Aufgabe die Winsock-Schnittstelle, die ein Teil des Windows-API6 ist. Diese Schnittstelle können Sie direkt über das Windows-API nutzen, was allerdings recht komplex ist. Einfacher ist die Verwendung von speziellen Komponenten, die meist Bestandteil einer Programmiersprache sind. Unter Visual Basic 6 nutzen Sie dazu z.B. das Winsock-Steuerelement, unter C#, Visual Basic .NET und anderen .NET-Sprachen nutzen Sie die Socket-Klasse (die Sie im Namespace System.Net finden). Damit können Sie eigene Server und Clients entwickeln, die über TCP oder UDP miteinander kommunizieren, ohne sich mit den komplexe Protokollen auseinandersetzen zu müssen. Kapitel 16 beschreibt, wie Sie eine eigene TCP- oder UDPKommunikation aufbauen.
2.9 Die wichtigsten höheren Protokolle Neben den bereits beschriebenen Protokollen IP, TCP und UDP (ab Seite 62) werden im Internet noch einige weitere Protokolle verwendet. E-Mails werden z.B. über das SMTP-Protokoll versendet, HTML-Seiten über das HTTP-Protokoll. Die für Programmierer wichtigsten Protokolle beschreibe ich in den folgenden Abschnitten. Wenn Sie diese Protokolle grundlegend kennen, verstehen Sie die Kommunikation zwischen einem Internetserver und einem Client wesentlich besser und können sich viele Fragen selbst beantworten. Die Frage, wie ein Programm, das auf einem Webserver ausgeführt wird, den Browsertyp erkennt, ist beispielsweise damit beantwortet, dass der Browser Informationen über sich selbst im Header der HTTP-Nachricht mitsendet. 6 API = Application Programming Interface. Eine Schnittstelle zu den Funktionen einer Applikation, meist in Form von klassischen DLL-Datseien oder COM-Komponenten. Das Windows-API beinhaltet ca. 1000 Funktionen, die Programme nutzen können, um auf die Funktionalität von Windows zurückzugreifen.
67
Basiswissen
2.9.1 Tools zum Testen der Kommunikation Wenn Sie die IP-Protokolle einmal selbst erforschen oder ausprobieren wollen, helfen Ihnen wahrscheinlich die drei Tools, die ich hier kurz vorstelle: Ein Paket-Sniffer überwacht die Netzwerkkarte und zeigt die empfangenen und gesendeten IP-Pakete an, ein von mir entwickelter IP-Client (dessen Quellcode und Installationsversion Sie auf der BuchCD finden) hilft dabei, die höheren Protokolle einmal selbst auszuprobieren. Ein Paket-Sniffer zum Auslesen der IP-Kommunikation
Wenn Sie die IP-Protokolle selbst einmal erforschen wollen, empfiehlt sich ein Paket-Sniffer. Ein solches Tool fängt alle Pakete ab, die über das Netzwerk gesendet werden, und zeigt diese an. Ein hervorragender (weil sehr einfacher) Sniffer ist der Shareware-Sniffer von Ufasoft (www.ufasoft.com/sniffer). Die Shareware-Version läuft ohne Einschränkungen. Die Vollversion kostet 20 Dollar. Eine kostenfreie Alternative ist das Freeware-Tool Ethereal (www.ethereal.com/distribution/win32/). Dieser Sniffer besitzt mehr Möglichkeiten, ist jedoch auch komplizierter zu konfigurieren und besitzt keine Möglichkeit, die Pakete im Klartext anzuzeigen. Der Ufasoft-Sniffer ist einfach zu bedienen. Im Menü Tools / Select Adapter können Sie die Netzwerkkarte auswählen, die überwacht werden soll (falls mehrere installiert sind). Im linken oberen Fensterbereich stellen Sie ein, welche Protokolle überwacht werden sollen. Für die Überwachung der höheren Protokolle stellen Sie TCP ein. Wenn Sie den PACKETS-Eintrag im Protokoll-Ordner aktivieren, können Sie noch einstellen, ob alle oder nur bestimmte Ports überwacht werden sollen. Wenn Sie nur HTTP-Anforderungen und -Antworten überwachen wollen, sollten Sie hier nur den Port 80 einstellen. Ansonsten erhalten Sie viele Pakete, die uninteressant sind. Mit (F5) starten Sie die Überwachung. Die gesendeten und empfangenen Pakete können Sie anschauen, indem Sie im linken oberen Bereich auf das Protokoll klicken. Über das VIEW-Menü können Sie die Ansicht der Pakete zwischen Hex-Werten und Text umschalten. Beachten Sie, dass die mir vorliegende Version 3.0 Build 72 die eingefangenen Pakete nur dann direkt anzeigt, wenn Sie den Eintrag PAKETS aktivieren. Ist dieser Eintrag nicht aktiviert, werden die Pakete erst angezeigt, wenn Sie kurz ein anderes Protokoll und danach wieder das TCP-Protokoll auswählen. 68
2.9 Die wichtigsten höheren Protokolle
Basiswissen
Abbildung 2.4: Der Sniffer von Ufasoft
Ein Sniffer überwacht den Netzwerkverkehr auf der Netzwerkkarte. Deshalb funktioniert ein Sniffer nur dann korrekt, wenn er auf dem Server installiert ist und die Anfragen von einem anderen Rechner aus über das Netzwerk erfolgen. Wenn Sie z.B. einen Webbrowser auf demselben Rechner verwenden, dessen Netzwerkkarte der Sniffer überwacht (Sniffer können auch entfernte Netzwerkkarten überwachen), werden Sie kein Ergebnis erhalten. Die lokale Kommunikation läuft eben nicht über die Netzwerkkarte. Sie benötigen also zumindest zwei Rechner, um die Netzwerkpakete abfangen zu können (oder einen Trick, den ich allerdings nicht kenne ...). Ein simpler IP-Client für TCP und UDP
Um die Kommunikation mit Servern über die einfachen Protokolle TCP und UDP ausprobieren zu können, habe ich mit Visual Basic 6 und C# je einen einfachen IP-Client entwickelt. Sie finden diesen Client im Quellcode und als Setup auf der Buch-CD. Abbildung 2.5 zeigt eine HTTP-Sitzung mit meinem kleinen IP-Client.
69
Basiswissen
Abbildung 2.5: Der einfache IPClient mit einer ausgeführten HTTPAnforderung
2.9.2 Das HTTP-Protokoll Das HTTP-Protokoll wird für die Kommunikation mit Webservern verwendet. Über dieses Protokoll kann ein Client Daten vom Server abfragen, Prozesse starten und Dateien uploaden. Der Server sendet angeforderte Daten ebenfalls über HTTP zum Client. Das HTTP-Protokoll besteht aus einem HTTP-Header und einem optionalen Datenbereich. Der HTTP-Header enthält einen der möglichen HTTP-Befehle (Get, Put, Post etc.) mit Argumenten und weitere Daten, wie z.B. Informationen über den Browser. Der Datenbereich enthält das HTML-Dokument bzw. Daten, die der Client zum Server hochladen will. Das HTTP-Protokoll wird im RFC 2616 beschrieben. Eine HTTP-Sitzung besteht aus einem »Request« (der Anforderung) und einem »Response« (der Antwort). Ein Client fordert den Server in einem Request auf, entweder Ressourcen (HTML-Dokumente, Bilder etc.) zu liefern, Programme auszuführen oder Dateien hochzuladen. Der Server antwortet mit einem Response auf diese Anforderung. 70
2.9 Die wichtigsten höheren Protokolle
Basiswissen
Grundsätzlicher Aufbau einer HTTP-Nachricht
HTTP-Nachrichten bestehen aus einzelnen Zeilen, die jeweils mit einem Carriage Return/Linefeed (CRLF = Unicode-Zeichen 13 + 10) abgeschlossen sind. Die erste Zeile enthält einen HTTP-Befehl (der auch als »HTTP-Methode« bezeichnet wird). Danach folgen einzelne Felder, die zusätzliche Informationen zum Befehl liefern. Dieser HTTP-Header wird mit einer leeren Zeile abgeschlossen. Danach folgt der optionale Datenbereich. In diesem Bereich sendet der Server angeforderte Ressourcen, z.B. ein HTML-Dokument, zum Client. Bei einem Datei-Upload sendet der Client diese Datei ebenfalls im Datenbereich zum Server. Tabelle 2.3 beschreibt die wichtigsten Befehle der HTTP-Version 1.1. Eine vollständige Auflistung finden Sie in der Referenz. Methode
Bedeutung
GET URI HTTP-Version
Über GET fordert ein Client eine Ressource an, deren Adresse in einem URI angegeben ist. GET kann mit If-Feldern im Header erweitert werden. If-Modified-Since bewirkt beispielsweise, dass nur Dokumente abgerufen werden, die ein neueres Datum besitzen, als in diesem Feld angegeben ist.
HEAD URI HTTP-Version
HEAD ist zunächst identisch mit GET mit dem Unterschied, dass der Server keine Daten in der Antwort übertragen darf. Damit können Informationen über die angeforderte Ressource ausgelesen werden ohne die Ressource selbst zu übertragen.
POST URI HTTP-Version
POST wird verwendet, um Daten vom Client zum
Tabelle 2.3: Die wichtigsten Methoden von HTTP 1.1
Server zu übertragen, die zu dem angegebenen URI gehören. Ein ausgefülltes HTML-Formular wird z.B. über POST an ein Programm auf dem Server übertragen (das im URI angegeben ist) und dort ausgewertet. PUT URI HTTP-Version
Mit PUT kann ein Client Daten an den Server übertragen, die dieser unter dem im URI angegebenen Dateinamen speichern soll (vorausgesetzt, der Benutzer besitzt das Schreibrecht auf dem Ordner).
71
Basiswissen
Header-Felder, die der Befehlszeile folgen, übermitteln spezifische Informationen oder erweitern den Befehl. Einige Header-Felder werden in Anforderungen und Antworten gemeinsam verwendet, andere gelten nur für Anforderungen oder Antworten. Tabelle 2.4 beschreibt die (für Internetprogrammierer) wichtigsten gemeinsamen Felder, Tabelle 2.5 die wichtigsten Felder einer Anforderung und Tabelle 2.6 die wichtigsten einer Antwort. Tabelle 2.4: Die wichtigsten allgemeinen HTTPHeader-Felder
Tabelle 2.5: Die wichtigsten HTTP-HeaderFelder einer Anforderung
72
Feld
Bedeutung
Connection
In diesem Feld kann der Sender spezifizieren, ob er die Verbindung nach dem Senden der Daten noch aufrechterhalten oder schließen wird. Mit dem Wert Keep-Alive signalisiert der Sender, dass er die Verbindung aufrechterhält, was immer dann verwendet wird, wenn der Empfänger Daten zum Sender zurücksenden soll. Mit dem Wert Close signalisiert der Sender, dass die Verbindung seinerseits geschlossen wurde und der Empfänger keine Daten zurücksenden sollte.
Content-Type
spezifiziert den MIME-Typ der gesendeten Daten. Für HTML-Dokumente wird in diesem Feld beispielsweise der Typ text/html angegeben.
Date
Dieses Feld speichert das Datum, an dem die Nachricht generiert wurde.
Feld
Bedeutung
Accept
definiert die akzeptierten Medientypen für die Antwort.
Accept-Charset
definiert die akzeptierten Zeichensätze für die Antwort.
Accept-Encoding
definiert die akzeptierten Verschlüsselungen für die Antwort.
Accept-Language
definiert die akzeptierten Sprachen für die Antwort.
Authorization
enthält die (einfach verschlüsselten) Logindaten des Benutzers für geschützte Webs.
Cookie
sendet ein zuvor vom Webserver an den Browser gesendetes Cookie zum Webserver zurück. Ein Cookie ist eine Informationseinheit, die ein HTML-Dokument auf dem Rechner des Anwenders ablegen kann und die im HTTP-Header zum Webserver zurückgesendet wird, wenn der Anwender dieses Dokument noch einmal abruft. Cookies erlauben das persistente Speichern von Daten in einer Internetanwendung und werden häufig verwendet, um den Anwender zu identifizieren.
2.9 Die wichtigsten höheren Protokolle
Basiswissen
Feld
Bedeutung
From
kann verwendet werden, um die E-Mail-Adresse des Benutzers oder spezielle Logging-Informationen an den Server zu übertragen.
Host
enthält die Hostadresse und den Port des Servers.
If-ModifiedSince
definiert, dass die angeforderte Ressource nur dann übertragen werden soll, wenn diese seit dem angegebenen Datum modifiziert wurde.
Referer
definiert die URL des Aufrufers. »Referer« ist übrigens falsch geschrieben und müsste eigentlich »Referrer« heißen.
User-Agent
enthält Informationen über den Client wie z.B. den Browsertyp und die Version.
Feld
Bedeutung
Location
Location wird verwendet, um den Client auf eine andere URL umzulenken (Redirect). Der Client erhält eine Antwort mit dem Status »302 - Object moved« mit der Angabe der URL der Ressource, auf die umgeleitet wurde, im Feld Location. Der Client reagiert normalerweise darauf, indem er die Ressource über die neue URL neu anfordert.
Server
Dieses Feld enthält Informationen über den Server.
Set-Cookie
Dieses Feld teilt dem Browser mit, dass er ein Cookie speichern soll.
WWW-Authenticate
Dieses Feld wird in einer HTTP-Nachricht mit dem Status 401 (Access denied) gesendet und definiert die möglichen Authentifizierungs-Methoden für den Client.
Tabelle 2.5: Die wichtigsten HTTP-HeaderFelder einer Anforderung (Forts.)
Tabelle 2.6: Die wichtigsten HTTP-HeaderFelder einer Antwort
Die Anforderung
Im Header einer Anforderung (dem Request) sendet ein Client in der ersten Zeile einen HTTP-Befehl zum Server. Bei den meisten Befehlen wird die verwendete HTTP-Version mit angegeben. In den folgenden Zeilen übergibt der Client in einzelnen HTTP-Feldern zusätzliche Informationen, die z.B. definieren, welche Grafikdateitypen, Sprachen und Codierungen akzeptiert werden, und Felder mit Informationen zum Client und zum Server.
73
Basiswissen
Das folgende Beispiel zeigt eine typische HTTP-Anforderung in einem Intranet. Angefordert wird die Datei default.htm im Stammordner des Webservers auf dem Rechner Zaphod. Client ist der Internet Explorer 6.02 (der sich allerdings als Version 5.01 ausgibt): GET /default.htm HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/ vnd.ms-powerpoint, */* Accept-Language: de Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: Zaphod Connection: Keep-Alive
Der Client muss nicht alle Felder spezifizieren, wie es im Beispiel oben der Fall ist. Normalerweise genügt die Angabe der Befehlszeile und des Host: GET /default.htm HTTP/1.1 Host: Zaphod
Die Angabe des Host ist Pflicht bei HTTP 1.1. Geben Sie dieses Feld nicht an, erhalten Sie die HTTP-Statusmeldung »400 – Bad Request« zurück. Bei Befehlen, die zu einer Antwort führen, sollte der Client die Verbindung aufrechterhalten und dem Server dies über das Connection-Feld mitteilen: GET /default.htm HTTP/1.1 Host: Zaphod Connection: Keep-Alive
Ruft der Client ein Dokument ab, das bereits in seinem Cache gespeichert ist, enthält die HTTP-Anforderung normalerweise im If-Modified-Since-Feld eine Angabe darüber, dass nur neuere Dokumente zurückgeliefert werden sollen:
74
2.9 Die wichtigsten höheren Protokolle
Basiswissen
GET /default.htm HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/ vnd.ms-powerpoint, */* Accept-Language: de Accept-Encoding: gzip, deflate If-Modified-Since: Sat, 23 Feb 2002 15:20:30 GMT If-None-Match: "30f488578c16c11:87d" User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: Zaphod Connection: Keep-Alive
Die Antwort
Auf eine Anforderung (Request) antwortet der Server mit einem Response. Diese Antwort besteht wieder aus einem Header und einem Datenbereich. Der Header beginnt mit einer Statuszeile, die die HTTP-Version und Informationen über den Erfolg bzw. über Fehler enthält, die bei der Abarbeitung der Anforderung aufgetreten sind. Danach folgen Header-Felder, die z.B. den Server identifizieren und das auf dem Server aktuelle Datum enthalten. Antwortet der Server z.B. auf eine GET-Anforderung, sieht die Antwort des Servers etwa so aus wie im folgenden Beispiel, falls alles in Ordnung ist: HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Content-Location: http://zaphod/Default.htm Date: Sat, 23 Feb 2002 15:48:30 GMT Content-Type: text/html Accept-Ranges: bytes Last-Modified: Sat, 23 Feb 2002 15:47:18 GMT ETag: "c0f7ee5f81bcc11:abc" Content-Length: 297
75
Basiswissen
Zaphods Web
Zaphods Web Willkommen auf Zaphods Web.
Hier finden Sie Beispiele für die verschiedenen Techniken der Internetprogrammierung.
Treten Sie ein.