Algorithmen und Programmieren V: Netzprogrammierung WS 2008/09

Werbung
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.
Herunterladen