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