Lektion 8 - Universität Basel

Werbung
Lektion 8:
Netzzugriff und Client-Server
Programmierung
Helmar Burkhart
Informatik
Universität Basel
[email protected]
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-0
Übersicht Lektion 8
• Internet-Protokolle (TCP, UDP)
• Paket java.net: Socket und
URL
• Landkarte der Client-Server Technologien:
− CGI
− Servlets
− JSP
− RMI und CORBA
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-1
Protokolle im Internet
Über Netzwerkaspekte wurde schon in Informatik I, Lektion
10 berichtet.
Anwendung
(http,ftp,telnet,...)
Im Internet wird die
sog. TCP/IP
Protokollhierarchie
verwendet.
Transport
(TCP, UDP)
Vermittlung
(IP)
Verbindung
(Ethernet,...)
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-2
Java Netzwerkprogrammierung
• Ein Java-Programm, das Netzwerkzugriffe macht, arbeitet
auf der Schicht ANWENDUNG.
• Es stehen 2 Transportprotokolle zur Verfügung:
– TCP (Transmission Control Protocol):
Verbindungsorientiertes Protokoll, das einen zuverlässigen
Transport von Daten zwischen 2 Computer unterstützt.
Insbesondere wird die Reihenfolge der Daten behalten.
Bsp.: HTTP, TELNET, FTP.
– UDP (User Datagram Protocol):
Protokoll, das den Transport unabhängiger Datenpakete
(datagrams) unterstützt ohne die Ablieferung zu garantieren.
Bsp.: PING.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-3
Client-Server Verbindung: TCP
Ein Socket ist eine Software-Abstraktion für den
verbindungsorientierten Zugriff auf Daten im Netzwerk:
Ein Socket identifiziert einen Rechner und dessen Port.
Datenströme
Anwendung
Socket
Client-Rechner
Port
Daten
Server-Rechner
TCP/IP
16 bit Port-Adresse
Institut für Informatik
Universität Basel
32 bit IP Adresse
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-4
Client-Server Verbindung: UDP
Die Datenpakete identifizieren den Port an den sie
geschickt werden sollen. UDP-Programmierung erfolgt auf
tieferer Systemstufe, ergibt deshalb mehr Effizienz.
Datenpakete
Anwendung
Port
Client-Rechner
Port
Daten
Server-Rechner
UDP/IP
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-5
Netzwerkprogrammierung unter Java
Das Paket java.net unterstützt die Erstellung von
Anwendungen, die Zugriff auf Daten im Internet nehmen.
TCP-orientierte Anwendungen:
• Socket, ServerSocket
• URL, URLConnection
UDP-orientierte Anwendungen:
• DatagramPacket, DatagramSocket,
MulticastSocket.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-6
Klasse Socket
Socket ist ein Endpunkt für die Kommunikation zwischen
2 Rechnern.
• Socket(String host, int port)
Erzeugt ein Socket-Objekt auf dem Port eines Rechners.
Die Kommunikation mit dem Socket erfolgt stromorientiert:
•
•
InputStream getInputStream()
OutputStream getOutputStream()
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-7
Beispiel: Von Socket lesen
try{
Socket s
= new Socket(args[0],
Integer.parseInt(args[1]));
BufferedReader in = new BufferedReader(
new InputStreamReader(
s.getInputStream()));
String inputLine;
while( (inputLine = in.readLine()) != null)
System.out.println(inputLine);
s.close();
}
catch (IOException e){
System.out.println("Fehler " + e);}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-8
Klasse ServerSocket
• ServerSocket(int port)
Serversocket erzeugen der Port überwacht.
• Socket accept()
Auf Verbindungswunsch warten und diesen akzeptieren.
• void close()
Serversocket schliessen.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-9
ServerSocket erzeugen
try{
ServerSocket s = new ServerSocket(1234);
Socket incoming = s.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(
incoming.getInputStream()));
PrintWriter out = new PrintWriter(
incoming.getOutputStream(), true); // autoflush
out.println("Hallo. Eingabe von ciao zum
Beenden !");
String inputLine ="";
while( ! inputLine.equals("ciao")){
inputLine = in.readLine();
out.println("Echo: " + inputLine);
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-10
Klasse URL
• Ein URL-Objekt erlaubt den Zugriff auf Daten die durch
die URI/URL-Angabe (Uniform Resource
Locator/Identifier) definiert ist (s. Info. I Lektion 10).
public URL(String url_Name)
throws MalformedURLException
• Einbettung in die "normale" Eingabe mittels
openStream():
public final InputStream openStream()
throws IOException
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-11
Datenzugriff via URL
import java.net.*;
import java.io.*;
...
URL url;
String inputLine;
url = new URL(args[0]);
BufferedReader in = new BufferedReader(
new InputStreamReader(
url.openStream()));
while( (inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-12
Lokaler/Globaler Informationsverbund
• Der Zugriff auf lokale Daten (eines Computers) und der
Zugriff auf globale Daten (des Internets) sind
programmtechnisch äquivalent.
• Java-Anwendungen können ohne Probleme für den
lokalen UND globalen Informationsverbund geschrieben
werden.
• Programmieren "fürs Internet" ergibt qualititativ neue
Aspekte.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-13
Anwendung: Währungskonverter
Auf dem Internet finden sich Währungskonverter, die das
interaktive Umrechnen zwischen Währungen unterstützen.
Beispiel:
http://www.oanda.com/convert/classic
Ein solcher Konverter setzt sich zusammen aus
• Benutzerschnittstelle
• Datenzugriff (Wechselkurse)
• Berechnungsteil
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-14
Architektur eines Online-Währungskonverters
Benutzerschnittstelle
Aktuelle
Währungsdaten
Berechnung
Socket
Anwendung
Client-Rechner
Port
Daten
Server-Rechner
TCP/IP
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-15
WWW Client-Server Modell
Anforderung
Web
Browser
Web
Server
HTTP-Protokoll
HTML
Datei
Resultat
Client-Rechner
Server-Rechner
• Zugriff auf statische HTML-Datei und deren Anzeige
• Dynamische Komponenten auf der Klientenseite
(ECMAScript, Java Applets, Plug-ins)
• Kein "Gedächtnis" auf der Serverseite
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-16
Dynamische Webseiten
Anforderung
Web
Browser
HTTP-Protokoll
Anforderung
Web
Server
HTML
Datei
Web
Anwendung
Resultat
• Erzeugung der Webseiten zur Laufzeit
• Generierung klientenunabhängiger
Standardformate
"Datenbank"
• "Gedächtnis" auf der Serverseite
• Einsatz leistungsfähiger Server (Bsp. Suchmaschinen)
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-17
CGI Technologie (1)
CGI = Common Gateway Interface
Web
Browser
HTTP
Web
Server
CGI
CGISkript
Externes
Programm
• Die Aufbereitung der Webseite erfolgt mittels CGIProgramm/Skript (z.B. Perl-Script).
• Aufruf des Skripts mittels Formular bzw. direkt in URL.
• Get-Übermittlung für kurze sichtbare Daten, PostÜbermittlung für nicht sichtbare (grosse) Daten.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-18
CGI Technologie (2)
Aufruf des Skripts aus Formular:
<form method="GET" name="form-name"
action="cgi-bin/cgi-name">
• CGI-Skript ist unabhängig vom Webserver.
• Skript erfrägt Information mittels Umgebungsvariablen.
if($ENV{'REQUEST_METHOD'} eq 'GET'){
Perl-Skript
$Daten = $ENV{'QUERY_STRING'}}
else{
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-19
Java Servlets
Web
Browser
HTTP
Web
Server
Externes
Programm
Servlet
• (HTTP) Servlets sind Programme, die die Funktionalität des
(HTTP) Servers erweitern.
• Servlet sind genau definiert und reine Java-Programme.
• Analogie: Servlet (serverseitig) vs. Applet (klientenseitig)
• JSDK 2.2 (Java Servlet Development Kit)
• Benötigt wird servlet-fähiger Webserver oder Werkzeug
servletrunner.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-20
Vererbungshierachie
Schnittstelle
Servlet
GenericServlet
HttpServlet
javax.servlet.
Servlet
Abstrakte Klasse
mit Methode
service()
Abstrakte Klasse
mit Methoden
doGet(),
doPost()
MyServlet
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-21
HTTP- Servlets
In Anwendungsservlet überschreiben
Aufruf vom Klienten
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-22
Beispiel: Echo-Servlet
import java.io.*; import javax.servlet.*;
public class Echo extends HttpServlet {
public void doPost ( HttpServletRequest request
HttpServletResponse response
) throws ServletException, IOException
{
PrintWriter out;
String
in, title = "Echo Servlet";
response.setContentType("text/html");
out = response.getWriter();
in = request.getParameter(”Comments");
out.println("<HTML><BODY>");
out.println("<H1>" + title + "</H1>");
out.println(”Echo:” + in);
out.println("</BODY></HTML>");
out.close();}}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-23
Lebenszyklus eines Servlets
Laden der Servlet-Klasse
Erzeugen einer Instanz
Ausführen der init()-Methode
prüfen auf neuere Version des *.class-Files:
allenfalls neu laden
Ausführen der Methode service()
z.B. Herunterfahren des Servers
Ausführen der destroy()-Methode
Aufräumarbeiten
Beispiel für Servlet mit Gedächtnis: Fibonacci
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-24
Java Server Pages (JSP)
• Vermischung von HTML/XML-Dokumentcode mit Java
Programmcode
• Wird vom JSP-Server intern in ein Servlet übersetzt.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-25
RMI - Remote Method Invocation
• RMI ist eine Technik mit der verteilte Anwendungen
entwickelt werden.
• Ein Fernobjekt (remote object) ist ein Objekt, dessen
Methoden von einer anderen virtuellen Maschine
(möglicherweise laufend auf einem anderen Rechner)
aufgerufen werden können.
• Methodenaufrufe auf einem Fernobjekt sind syntaktisch
gleich.
• Ein Fernobjekt entsteht, indem es z. B. die Klasse
java.rmi.Remote erweitert.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-26
Prinzip des Fernmethodenaufrufs
Client
Server
Lokale Methode
Abwarten
Aufruf
Aufruf Fernmethode
Fernmethode
ausführen
Abwarten Antwort
Lokale Methode
Institut für Informatik
Universität Basel
Abwarten
Aufruf
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
Z
e
i
t
a
c
h
s
e
8-27
Stummel (stubs)
Technisch erfolgt der Aufruf über Stummel (stubs). Diese sind
lokale Repräsentanten des Fernobjekt auf der Klientenseite.
Parameter- und
Resultatübergabe
(Marshalling, Demarsh.)
Aufruf Fernmethode
Aufruf des
Stummels
Institut für Informatik
Universität Basel
Fernmethode
ausführen
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-28
Echo Server: Definition des Interface
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Echo extends Remote {
String getEcho(String arg) throws
RemoteException;
}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-29
Echo Server: Interface implementieren
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class EchoImpl extends UnicastRemoteObject
implements Echo {
public EchoImpl() throws RemoteException {
super();
}
public String getEcho(String arg) {
return "Echo: " + arg;
}
}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-30
Echo Server: Server implementieren
import java.rmi.Naming;
public class EchoServer {
public static void main(String args[]) {
try {
Echo obj = new EchoImpl();
String host = "eudora.ifi.unibas.ch";
String name = "//" + host + "/" + "Echo";
// Bind this object instance to the name
Naming.rebind("Echo", obj);
System.out.println("Echo bound in registry");
} catch (Exception e) {
System.out.println("EchoServer err: " + e.getMessage());
e.printStackTrace();
}
}
}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-31
Echo Server: Client implementieren
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
public class EchoClient {
public static void main(String args[]) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
String name = "//" + args[0] + "/" + "Echo";
Echo obj = null;
obj = (Echo)Naming.lookup(name);
System.out.println(obj.getEcho(args[1]));
} catch (Exception e) {
System.out.println("EchoClient exception: " +
e.getMessage());
e.printStackTrace();
}
}
}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-32
Erzeugen von RMI- Anwendungen
1. Entwurf und Implementierung
–
Remote interface definieren
–
Remote interface implementieren
– Server implementieren
–
Client implementieren
2. Kompilieren und Stubs kreieren
– javac
–
rmic
3. Klassen im Netzwerk zugreifbar machen
4. Anwendung starten
– rmiregistry starten
–
–
Institut für Informatik
Universität Basel
Server starten
Client starten
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-33
Java IDL
• IDL - Interface Definition Language: Logische Sicht in
einer eigenen Sprache.
• CORBA - Common Object Request Broker Architecture
• OMG - Object Management Group
• RMI zielt auf reine Java-Anwendungen, CORBA zielt auf
Fremdcodeeinbindung.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-34
Literatur
Offizielle Spezifikationen, Klassenbibliotheken & -dokumentation
•
•
http://java.sun.com/products/servlet/
http://java.sun.com/products/jsp/
Tutorials
•
•
The J2EE™ Tutorial
• Java Servlet Technology / JavaServer Pages ™ Technology
http://java.sun.com/j2ee/tutorial/
The Java ™ Tutorial
• Trail: Servlets: http://java.sun.com/docs/books/tutorial/servlets/
• Trail: RMI: http://java.sun.com/docs/books/tutorial/rmi/
• Trail: Java IDL: http://java.sun.com/docs/books/tutorial/idl/
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 8: Netzzugriff und C/S Programmierung
8-35
Herunterladen