Algorithmen und Programmieren V: Netzprogrammierung WS 2008/09 Musterlösung zum Übungsblatt 6 Christian Grümme Aufgabe 1: HTTP-Server Diese Aufgabe ist mit Hilfe des HTTPSEcho–Servers einfach zu realisieren. Aufgabe 2: Browser Der Browser ist einfach aufgebaut. Ein Bereich oben für die Eingabe einer Adresse, in der Mitte die Darstellung des Inhaltes der Adresse und unten eine Statusmitteilung. Das Adresseingabefeld und der zugehörige Knopf sind mit einem ProcessAction assoziiert. Dieser liest die eingegebene Adresse aus und erzeugt eine JComponent mit Hilfe der statischen Methode JComponentFactory.getJComponent(String, MyBrowser). Diese wird dann als neuer Inhalt in der Mitte des Browsers gesetzt. class ProcessAction 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class ProcessAction implements Act ionLis tener { /* * The browser to that this Act ionLis tener belongs to */ MyBrowser browser ; /* * * Constructor . * * @param browser * associated browser */ public ProcessAction ( MyBrowser browser ) { this . browser = browser ; } /* * ( non - Javadoc ) * * @see * java . awt . event . Acti onList ener # a ct i on Pe r fo rm e d ( java . awt . event . ActionEvent ) */ public void ac t io n Pe rf o rm ed ( ActionEvent e ) { String addr = this . browser . getAddress () ; JComponent new_component = J C o m p o n e n t F a c t o r y . getJComponent ( addr , this . browser ) ; this . browser . setMainField ( new_component ) ; } } Für die Bild und HTML-Formate wurden eigene Erweiterungen der JComponet bzw. der JEditorPane geschrieben und zwar die Klassen JImage und JBrowser. Für die Ausführung eines Shell-Skripts wurde eine Erweiterung einer JTextArea geschrieben, die JShell. Diese Klasse lädt das Skript in eine lokale Datei, führt sie aus und stellt deren Ausgabe als Text dar. Nach der Ausführung wird die lokale Datei gelöscht. class JShell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class JShell extends JTextArea { /* * SerialID of the class */ private static final long s e r i a l V e r s i o n U I D = 4 7 8 7 7 8 8 1 5 1 1 0 5 5 5 7 2 3 L ; /* * * Constructor , that initializes this component . */ public JShell ( URL url , InputStream inputStream ) throws IOException { Bu ffered Reader in = new Buffer edRead er ( new I n p u t S t r e a m R e a d e r ( inputStream ) ) ; String filename = ( new File ( url . getPath () ) ) . getName () ; PrintWriter out = new PrintWriter ( filename ) ; String line ; while (( line = in . readLine () ) != null ) { out . println ( line ) ; } out . close () ; File file = new File ( filename ) ; 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 // Reset file name to the local path filename = file . g et Ab s ol ut e Pa th () ; // Make file executable file . setExecutable ( true ) ; Process p = Runtime . getRuntime () . exec ( filename ) ; in = new Buffe redRea der ( new I n p u t S t r e a m R e a d e r ( p . getInp utStre am () ) ) ; StringBuffer buffer = new StringBuffer () ; while (( line = in . readLine () ) != null ) { buffer . append ( line + " \ r \ n " ) ; } this . setText ( buffer . toString () ) ; // Delete file file . delete () ; } } Bevor ein Shell-Skript ausgeführt werden darf, wird der Benutzer um Erlaubnis gefragt. Dazu wird die Methode notifyUser aufgerufen, die einen Bestätigungsdialog zeigt. Wenn der Benutzer das Ausführen des Shell-Skripts ablehnt, wird nur dessen Inhalt als Text gezeigt. method JComponentFactory.notifyUser(String) 1 2 3 4 5 private static boolean notifyUser ( String message ) { int answer = JOptionPane . s h o w C o n f i r m D i a l o g ( null , message , " Execute script ? " , JOptionPane . YES_NO_OPTION ) ; return ( JOptionPane . OK_OPTION == answer ) ; } Testläufe: Lokale Dateien Adventsgedicht, Text über HTTP Text über FTP FTP-Verzeichnis, unformatiert Animierte GIF-Datei über HTTP Frage, ob das Skript ausgeführt werden soll Ausführtes Skript Nicht ausführtes Skript Diskussionsaufgaben: CORBA 1. Was ist die OMG? Die Object Management Group ist ein Konsortium aus “allen” bekannten IT-Firmen, wie IBM, Apple, Sun Microsystems und Microsoft. Die Softwarestandarts entwickelt und spezifiziert. Sie spezifizierte u. a. CORBA, IDL und UML. 2. Was ist der ORB? Der Object Request Broker ist ein CORBA-Dienst. Der ORB realisiert die Fernaufrufe von CORBA. 3. Was ist IIOP? Das Internet Inter-ORB Protocol ist ein OMG-Standart damit ORBs, auch von unterschiedlichen Herrstellern, miteinander sprechen können. 4. Was ist IDL? Die Interface Definition Language ist eine Schnittstellenbeschreibungssprache, die von der OMG für CORBA spezifiziert wurde. Eine mit IDL beschriebene Schnittstelle kann verschiedene Implementierungen, auch in verschiedenen Programmiersprachen, haben und über CORBA-Objektverweise und über den ORB fernaufgerufen werden können. 5. Nennen Sie drei Unterschiede zwischen Java RMI und CORBA. 6. 7. 8. 9. 10. • CORBA ist sprachunabhängig, also nicht an eine bestimme Programmiersprache gebunden, während Java RMI an Java, bzw. an die JVM gebunden ist. • CORBA ist herstellerunabhängig, während Java und Java RMI Wahrenzeichen von Sun Microsystems sind. • Java RMI ist von Sun Microsystems spezifiziert und CORBA ist ein Industriestandart. Skizzieren Sie die Vorgehensweise bei der Entwicklung von CORBA-Anwendungen! Die ideale Vorgehensweise, wenn man eine Altsoftware S mit einer neuen Sprache X erweitern möchte: • Eine Schnittstelle für eine Altsoftware S mit IDL beschreiben. • Die IDL für die Sprache von S übersetzen. • Den erzeugten Code mit S zusammenbinden. • Die IDL für die Sprache X übersetzen. • Klienten-Code in der Sprache X entwickeln und mit dem erzeugten Code übersetzen und zusammenbinden. Welche typischen Bestandteile hat ein Modul in IDL? Ein Modul in CORBA besteht aus dem Schlüsselwort module gefolgt von einem Namen (<identifier>) nachdem mindestens eine weite Definition, eingeschlossen von geschweiften Klammern, steht und wird abgeschlossen durch ein Semikolon. <module>::= module <identifier> { <definition>+ }; Welche typischen Bestandteile hat eine Schnittstelle in IDL? Eine Schnittstelle besteht aus einen Schnittstellenkopf gefolgt von mindestens einer in geschweiften Klammern eingeschlossenen Exportvereinbarung und wird durch ein Semikolon abgeschlossen. Eine Exportvereinbarung kann eine Typvereinbarung, eine Ausnahmenvereinbarung, eine Attributvereinbarung, Konstantenvereinbarung, etc sein. Der Schnittstellenkopf besteht aus dem Schlüsselwort interface, dem ein abstract oder local vorangehen kann, gefolgt von einem Namen, dem auch weitere Namen folgen kann, wobei der erste durch ein Doppelpunkt und weitere durch ein Komma getrennt werden. <interface>::= [ abstract | local ] interface <identifier> [: <identifier> {, <identifier> }* ] { <export> }; <export>::= type_dcl ; | op_dcl ; | except_dcl ; | attr_dcl ; | const_dcl ; | ... Beschreiben Sie Syntax und Semantik der Parametervereinbarung in CORBA! Eine Parametervereinbarung besteht aus einem Attribute ( in | out | inout), aus einen Typ und aus einem Namen. • in Wertparameter • out Ergebnisparameter • inout Wert/Ergebnisparameter Wie werden die Parametermechanismen von CORBA in der ORB-Implementierung des JDK realisiert? Für die Typen von IDL und Java existiert eine bijektive Abbildung. Für das Attribut in werden die normalen Wertparameter in Java genommen und für die Parameter out und inout gibt es keine Entsprechungen in Java. 11. Was macht der Portable Object Adapter? Das ist der Standartadapter bei CORBA, der sowohl über den Fernaufrufdienstes Aufrufe als Nachricht verschickt als auch eingegangene Nachrichten an den entsprechenden Treiber weiterleitet. HTTP 1. Wie ist die Interaktion zwischen Dienstnutzer und -erbringer in HTTP? Bei HTTP in der Version 1.0 sind sieht eine Interaktion folgendermaßen aus: 1. (Server öffnet einen TCP-Server Port und wartet auf Anfragen.) 1. Klient baut eine TCP-Verbindung zum Server auf. 1. Klient sendet eine HTTP Anfrage. 1. Server sendet eine HTTP Antwort. 1. Die Verbindung wird beendet. HTTP 1.1 sieht mehrere Anfragen pro Verbindung aus, die aber auch nach dem Anfrage/AntwortSchema verlaufen. 2. Wie ist eine HTTP-Anfrage aufgebaut? Eine HTTP-Anfrage besteht aus einer Methode gefolgt von einer Ressource mit anschließender HTTP-Version und einem Zeilenumbruch (\r\n). Dann folgen optionale Kopfzeilen und eine abschließende eine Leerzeile (\r\n). Bei HTTP 1.1 ist die Kopfzeile host obligatorisch. Beispiel GET /index.html HTTP/1.1 Host: google.de Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive 3. Nennen Sie drei in HTTP definierte Methoden! • GET Anforderung von Inhalten • POST Wie GET mit zusätzlichen Datenblock. • PUT Lädt ein Dokument zum Server hoch. • HEAD Wie GET nur es wird bei der Antwort kein Datenblock gesendet. 4. Nennen Sie drei Kopfzeilen, die in einer HTTP-Anfrage auftreten können, und ihre Bedeutung! • User-Agent gibt Auskunft über den verwendeten Browser Betriebssystem. • Accept enthält eine Liste von MIME-Typen, die vom Klienten unterstützt werden. • Keep-Alive gibt die Sekunden an für die die Verbindung für weitere Anfragen noch offengehalten wird 5. Wie ist eine HTTP-Antwort aufgebaut? Die HTTP-Antwort besteht aus der HTTP-Version, dem Antwortcode, gefolgt von seiner Beschreibung und abgeschlossen von einem Zeilenumbruch. Dann folgen optionale Kopfzeilen, jeweils in einer Zeile. Der Kopf wird durch eine Leerzeile abgeschlossen worauf dann der Datenblock erfolgt. HTTP/1.1 200 OK Date: Wed, 21 Jan 2009 13:05:26 GMT Server: Apache/2.0.59 (Linux/SuSE) Last-Modified: Wed, 21 Jan 2009 07:28:40 GMT ETag: "2d8920a-5cce-1ad2fa00" Accept-Ranges: bytes Content-Length: 23758 Content-Type: text/html; charset=utf-8 Via: 1.0 www.inf.fu-berlin.de Connection: close <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> .... 6. Nennen Sie drei Kopfzeilen, die in einer HTTP-Antwort auftreten können, und ihre Bedeutung! • Content-Length gibt die Anzahl der Bytes des Datenblocks an. • Content-Type gibt den MIME-Type des Datenblocks an. • Last-Modified gibt den Zeitstempel der Daten an. 7. Nennen Sie drei wichtige Antwortcodes in HTTP und ihre Bedeutung! 8. 9. 10. 11. • 200 OK Anfrage war in Ordnung. • 302 Found Anfrage wird an eine andere Ressource weitergeleitet. • 403 Forbidden Der Klient hat keinen Zugriff auf diese Ressource. • 404 Not Found Die angefragte Ressource wurde nicht gefunden. • 500 Internal Server Error Der Server hatte einen internen Fehler. Was bewirkt die Benutzung der Kopfzeile If-modified-since? Wird die If-modified-since Kopfzeile bei einer GET mitgesendet, antwortet der Server mit dem neuen Dokument, wenn das angeforderte Dokument seitdem verändert wurde und mit dem Code 304 wenn die Datei seitdem nicht mehr verändert wurde. Was sind MIME-Typen? Nennen und beschreiben Sie drei Beispiele! Multipurpose Internet Mail Extensions ist ein Standart um Dokumente ihrer Art nach zu Klassifizieren. • text/html für Dokumente die HTML-Text enthalten. • application/pdf für Dokumente im Portable Document Format. • image/jpeg für Dokumente die JPEG-kodiert sind. Was ist SSL und was ist HTTPS? Welche Unterstützung bietet Java für den Umgang mit HTTPS? Secure Sockets Layer (SSL) ist ein Protokoll, das direkt auf TCP auf setzt und zur transparenten Verschlüsselung von Datenübertragungen gedacht. HTTPS ist einfach das HTTP das nicht direkt TCP benutzt, sondern auf SSL aufsetzt. Welche Unterstützung bietet Java für die Entwicklung von Klienten für URLs mit verschiedenen Schemata? Die Klasse java.net.URLConnection kann für alle unterstützten Protokolle das Schema verstecken. Es wird die URL über den Konstruktor übergeben und über die Methode getContent() wird der Inhalt als Objekt zurückgeliefert.