Inhalt
Internet-Anwendungen selbst programmieren
In den RFCs ist ein Socket als ein Tupel aus Ziel- und Quell-IP-Adresse, Ziel- und Quell-Port und Netzwerkprotokoll beschrieben.
(aus 'Socket' bei wikipedia - inzwischen geändert!)
Der Ziel-Port wählt einen bestimmten Dienst aus, der Quell-Port wird zufällig generiert. Auf diese Weise sind mehrere Verbindungen zu einem Dienst zwischen zwei Rechnern (hosts) möglich.
Wir benutzen ein Socket (engl. Steckdose, Buchse) als eine Software-Schnittstelle zum Zweck der Nutzung einer bidirektionalen Verbindung zwischen Computern. Diese Schnittstelle wird in objektorientierten Sprachen als ein spezielles Objekt auftreten, das die Handhabung erleichtert.
Vergleich mit einer Telefonverbindung
Man kann das Socket-Konzept mit einer Telefonverbindung vergleichen. Das Telefongerät entspricht dem Socket. Die IP-Adressen wären die Telefonnummern, die Ports wären die Nummern der Durchwahlverbindungen. Um einen Telefon-Dienst in Anspruch nehmen zu können, muss man also die Nummer samt Durchwahl des Dienstes kennen. Gewöhnlich meldet sich 'der Dienst' nach einer Anwahl und nach Austausch von 'Anmeldeinformationen' steht die Verbindung solange bis einer der beiden Teilnehmer auflegt. Nach dem Zustandekommen ist eine Verbindung symmetrisch und fullduplex, dh. beide Teilnehmer können gleichzeitig 'senden'. Was wird passieren, wenn man, nachdem der Angerufene abgehoben hat, eine Zeitlang nichts sagt? Die eigene Nummer muss man übrigens beim Anrufen nicht kennen. Hat man mehrere Telefone, so kann man in der Regel auch mehrere Verbindungen gleichzeitig zu einem Dienst z.B. einem Call-Center aufbauen.
Daten auf ein Socket schreiben - "Sprechen"
- // Mit dem Server verbinden
- Socket meinSocket = new Socket(AdresseDesServers, PortDerServeranwendung);
- // Einen Ausgabestrom öffnen. Da der Ausgabestrom des Sockets
- // nur begrenzte Möglichkeiten bietet, wird dieser üblicherweise
- // direkt mit einem Highlevel-Strom wie z.B. PrintWriter verknüpft.
- // Der zweite Parameter ist optional und gibt an, dass Daten nicht
- // gepuffert, sondern direkt geschickt werden sollen.
- PrintWriter writer = new PrintWriter(meinSocket.getOutputStream(), true);
- // Etwas schreiben, also an den Server schicken.
- writer.println("Hallo Server");
- writer.print("Wie gehts?");
- // Socketverbindung schließen, wenn man fertig ist.
- meinSocket.close();
Aufgabe - Ein "Quassel-Client"
Schreibe einen Client, der sich mit dem "QuasselMichVollServer" verbindet und Text an ihn sendet (Bei Interesse siehe das dazugehörige BlueJ-Projekt).
Hinweis: Da z.B. das Aufbauen einer Verbindung eine "gefährliche" Sache ist, muss man an einigen Stellen mit Exceptions umgehen. Wo welche Exceptions behandelt werden müssen, findest Du aber als alter Hase problemlos heraus 
Daten vom Socket lesen - "Zuhören"
- // Mit dem Server verbinden, falls nicht schon geschehen.
- Socket meinSocket = new Socket(AdresseDesServers, PortDerAnwendung);
- // Einen Eingabestrom öffnen. Ähnlich wie der Ausgabestrom
- // wird dieser mit einem Objekt verknüpft,
- // das die Nutzung komfortabler macht.
- Scanner eingang = new Scanner(meinSocket.getInputStream());
- // Eine Zeile lesen und ausgeben
- String s = eingang.nextLine();
- System.out.println(s);
- // Schließen, wenn ich die Verbindung nicht mehr brauche
- meinSocket.close();
Aufgabe - Daytime-Client
Ein Daytime-Server ist ein Server, der bei Verbindung die aktuelle Zeit in einem nicht genau festgelegten Format an den Client schickt. Ein solcher Server befindet sich z.B. unter time.fu-berlin.de oder panix1.panix.com in New York. Zum Testen kannst Du auch einen lokalen Daytime-Server laufen lassen.
Schreibe ein Programm, das die aktuelle Zeit bei einem Daytime-Server ermittelt.
Einen Server schreiben
- // Ein ServerSocket erstellen, der unter dem angegebenen
- // Port Verbindungen aufbauen kann.
- ServerSocket server = new ServerSocket(port);
- // Auf eingehende Verbindungen warten.
- // Bei Verbindung wird ein Socket erstellt und zurück gegeben.
- // Dabei wird ein neuer, freier Port gewählt.
- // Der Port des ServerSocket's ist damit wieder frei.
- Socket client = server.accept();
- // Die Kommunikation zwischen Server und Client verläuft
- // dann genau wie auf Client-Seite.
Aufgabe - einen einfachen Witze-Server schreiben
Programmiere einen Server, der bei Verbindungsaufbau einen zufällig ausgewählten Witz an den Client schickt. Zum Testen des Servers kannst Du den Daytime-Client aus der obigen Aufgabe kopieren und anpassen, da die Kommunikation zwischen Daytime-Client und Daytime-Server analog verlief.
World Wide Web - WWW
Der am häufigsten benutzte Dienst im Internet ist das World Wide Web, das man täglich mit seinem Webbrowser durchforstet. Ein einfacher Webbrowser lässt sich auch selbst programmieren. (Ein richtiger auch, aber dann braucht man etwas mehr Zeit
)
Aufgabe -Feuerfüchschen
Schreibe einen einfachen Webbrowser, der sich mit einem Webserver verbindet, eine Anfrage schickt, und den HTML-Quellcode der angeforderten Seite auf dem Bildschirm ausgibt.
Optional: Entferne alle Tags aus dem Code und erzeuge bei jedem angefangenen Block-Level-Element eine neue Zeile. Zeige bei Bildern den Inhalt des "alt"-Attributes an, ...
Ebenso lässt sich ein Webserver schreiben.
Aufgabe - Flickenindianer
Schreibe einen Modell-Webserver, der ein paar wenige, unterschiedliche Webseiten an einen Client schickt.


