Netzwerkprogrammierung Sommersemester 2007 Inhalt der LV Grundlegende Begriffe Konzepte des WWW Socketprogrammierung Java RMI .NET Remoting RMI und .NET Remoting Callbacks WebServices Anwendungen im Web-Browser Dynamisch Klassen über Netzwerke laden Remote Technologien TCP Client/Server UDP / UDP Multicast Java Socketprogrammierung HTML (DOM, JS, CSS, XHTML) HTTP Protokoll Java Applets .NET im Browser Java Servlets und Java Server Pages (JSP) Netzwerkprogrammierung 2 Grundlegende Begriffe Computernetzwerke Ansammlung von Computern und anderen Geräten, welche Informationen austauschen und bereitgestellte Dienste nutzen Netzwerkprogrammierung 3 Grundlegende Begriffe Client / Server Modell Server stellt Dienste zur Verfügung Client(s) greifen auf diese Dienste zu Server und Client können sich auch beide auf dem selben Rechner befinden Client initiiert die Verbindung zum Server (in der Regel) Clients kennen die Adresse des Servers Server kennt erst seine Clients, wenn sich diese bei ihm anmelden Netzwerkprogrammierung 4 Grundlegende Begriffe Mail Server Drucker Server Clients Datenbank Server Client – Server Modell Netzwerkprogrammierung 5 Grundlegende Begriffe Netzwerkkommunikation Kommunikation beschrieben durch das OSI Schichtenmodell Netzwerkorientiert Schicht 1-4 im OSI Anwendungsorientiert Schicht 5-7 im OSI Netzwerkprogrammierung 6 Grundlegende Begriffe OSI Referenzmodel - Zusammenbau des Pakets Netzwerkprogrammierung 7 Grundlegende Begriffe Einordnung der Protokolle Paket wieder einlesen Auspacken wie Kisten in Kisten Netzwerkprogrammierung 8 Grundlegende Begriffe IP Paket – Header z.B.: 0x06 für TCP oder 0x11 für UDP Dem Header folgt Datenbereich (z.B.: TCP Paket) Netzwerkprogrammierung 9 Grundlegende Begriffe TCP/IP Seit Mitte der 90er: eingesetzt für WWW Im OSI Transport Layer (Schicht 4) Full Duplex (Daten senden und Empfangen gleichzeitig möglich) Paketorientiert Verbindungsorientiert – Dauerverbindung / Standleitung Netzwerkprogrammierung 10 Grundlegende Begriffe Rechner 1 Rechner 2 SEQ: 1 A CK: 5 [D ACK : 1 SEQ: 6 SEQ: 2 AC K: 6 AC SEQ: 7 ATA] [DATA] [DATA] TCP Datenaustausch und Bestätigung ATA] K: 2 [D Netzwerkprogrammierung 11 Grundlegende Begriffe Rechner 1 Rechner 2 SEQ: 1 A CK: 5 [D TimeOut . X ACK : 1 SEQ: 6 SEQ: 1 AC K: 5 AC SEQ: 6 ATA] [DATA] Neuer Versuch Packet 1 zu übertragen [DATA] TCP Timeout und erneutes Senden ATA] K: 1 [D Netzwerkprogrammierung 12 Grundlegende Begriffe UDP unsicher (keine Empfangsbestätigung) Datagramme sind untereinander unabhängig Keine Prüfung ob Empfänger überhaupt online ist UDP ähnlich einer Postwurfsendung (Spam) und TCP ähnlich eines Telefonanrufs Netzwerkprogrammierung 13 Grundlegende Begriffe UDP Pakete werden verschickt aber keine Bestätigung zurückgesendet Empfänger Sender Netzwerkprogrammierung 14 Grundlegende Begriffe Sendet UDP Packet Netzwerk Ein UDP Broadcast Datagramm wird ins Netz geschickt Alle Rechner im Netz empfangen das Paket Netzwerkprogrammierung 15 Grundlegende Begriffe In C oder ASM Verwendung und Konstruktion von TCP/UDP Paketen mitunter per Hand Empfang und Bufferung dem Entwickler selbst überlassen In höheren Programmiersprache (Java, .NET,..) Stream Gedanke – Verarbeitung der Netzwerkverbindung wie eine lokale Datei Bufferung kann durch das Framework automatisch erfolgen Damit leichtere Entwicklung, aber weniger spezial Lösungen möglich (neue Protokolle oder ähnliches) Netzwerkprogrammierung 16 Grundlegende Begriffe URLs Resource Locator (URL, engl. „einheitlicher Quellenanzeiger“) Symbolische Adresse www.hs-zigr.de und physikalische Adresse 141.46.8.60 Unterkategorie von URI (Uniform Resource Identifier) URI bezieht alle Schemas ein (file:// mailto: file://) URL eigentlich nur http:// und ftp:// Uniform Netzwerkprogrammierung 17 Grundlegende Begriffe Proxy Server Befindet sich zwischen lokalem Netz und Internet Proxy Server holt angeforderte Daten aus dem Internet und gibt sie zum anfragendem Rechner stellvertretend weiter In Application-Schicht angesiedelt Caching möglich Nachteile: meist nur wenige Protokolle erlaubt, Programme wie ICQ funktionieren über einen Proxy Server oftmals nicht Vorteil: kann beschleunigen, kann mehr Sicherheit bieten, da Clients nicht selbst ins Netz gehen Netzwerkprogrammierung 18 Grundlegende Begriffe Intranet Internet / Netzwerk Ziel-Server (Web-Server) Proxy-Server Anwender-Rechner Proxy-Server Modell Netzwerkprogrammierung 19 Grundlegende Begriffe Ports und Sockets URLs zur Adressierung einzelner Knoten im Netz (Rechner) Serverprozess selbst muss adressiert werden (welche Dienst soll angesprochen werden) Port – jeder Dienst bekommt eine Nummer Jede Portnummer kann nur einmal vergeben werden auf einem Rechner Erstellt man einen neuen Dienstprozess bekommt dieser vom System einfach einen freien Port zugewiesen (bei Serverprozessen meist unerwünscht) Jeder Port entspricht einem Socket (Steckdose) Netzwerkprogrammierung 20 Grundlegende Begriffe Rechner 1 Rechner 2 S S Socketverbindung Ports Ports (einige offen einige (einige offen einige geschlossen) geschlossen) # 1 - 65536 Netzwerkprogrammierung 21 Grundlegende Begriffe Standardisierte Ports (well known - TCP): 80: http (Webserver) 21: ftp (Fileserver) 22: sftp (sicherer Fileserver) 25: smtp (Email-Versanddienst) … Operationen auf Sockets: Öffnen Lesen / Schreiben Schließen Hören (auf eingehende Verbindung warten) Akzeptieren (eine eingehende Verbindung annehmen) Binden (einem Serverprozess einen ganz bestimmten Port zuweisen) Netzwerkprogrammierung 22 Konzepte des WWW HTML Entstehung: In der Schweiz (Genf) 1989 USA (MIT) Eigenschaften: Geräteunabhängig Sprache zur Darstellung von Inhalten wie Texten, Bildern und Hyperlinks in Dokumenten Kein Seitenkonzept wie etwa bei PostScript Netzwerkprogrammierung 23 Konzepte des WWW Aufbau eines HTML Dokuments: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Titel der Webseite</title> </head> <body> Inhalt der Webseite </body> </html> Netzwerkprogrammierung 24 Konzepte des WWW Tags und Attribute <TAG>…</TAG> <TAG attribut1="abc">…</TAG> Bis auf wenige Ausnahmen wie XML Heute immer mehr XHTML HTML welches XML konform ist z.B.: <br> muss nun <br/> sein <img src="pic.jpg" /> Netzwerkprogrammierung 25 Konzepte des WWW CSS (Cascading Style Sheets) legt fest, wie ein besonders ausgezeichneter Inhalt in einem HTML/XML Dokument dargestellt wird Kann sowohl als separate Datei angelegt werden, oder in das HTML Dokument eingebettet werden Netzwerkprogrammierung 26 Konzepte des WWW CSS (Cascading Style Sheets) Netzwerkprogrammierung 27 Konzepte des WWW <input name="e1" style="border:none; border-bottom: 2px dashed black;" /> Gute Beispiele und Referenz: http://de.selfhtml.org/ Netzwerkprogrammierung 28 Konzepte des WWW JavaScript Clientseitige Programmiersprache in HTML eingebettet (oder externe Datei) Erlaubt dynamische Inhalte Erweitert die Möglichkeiten von HTML grundlegend (JavaScript hier stellvertretend für alle Browser-Scriptsprachen wie VBScript) Netzwerkprogrammierung 29 Konzepte des WWW JavaScript und DOM HTML Seite ist zur Laufzeit durch ein DOM Object (Document Object Model) beschrieben Per JavaScript kann das DOM verändert werden http://de.selfhtml.org/dhtml/beispiele/anzeige/datumu hr.htm http://de.selfhtml.org/javascript/beispiele/anzeige/tasc henrechner.htm Netzwerkprogrammierung 30 Konzepte des WWW Hinweis: Um heute dynamische Webanwendungen zu entwickeln, ist JavaScript, DOM, CSS ein Muss! Wenn Sie etwas Freizeit haben, schauen Sie sich Beispiele in SelfHTML an und entwickeln Sie selbst kleine dynamische HTML Seiten Netzwerkprogrammierung 31 Konzepte des WWW HTTP Hypertext Transfer Protocol Aufbau der Verbindung des Webbrowsers mittels TCP/IP TCP Paketinhalt in Form von HTTP HTTP ist ein Klartext-Protokoll (man kann es als Mensch lesen) HTTP-Request und HTTP-Response (Anfrage und Antwort) Netzwerkprogrammierung 32 2 Web-Server (www.google.de) 3 GET / HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/ vnd.ms-powerpoint, application/msword, application/x-icq, */* Accept-Language: de UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Host: 127.0.0.1:81 Connection: Keep-Alive HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html Set-Cookie: PREF=ID=5d5b86a54ea78fff:TM=1172152002:LM=1172152002:S=yRZ ldpnO3qqV9 FoT; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com Server: GWS/2.1 Transfer-Encoding: chunked Date: Thu, 22 Feb 2007 13:46:42 GMT 1 4 Client <html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859 -1"><title>Google</title><style><!-body,td,a,p,.h{font-family:arial,sans-serif} .h{font-size:20px} .h{color:#3366cc} .q{color:#00c} --></style> <script> <!-function sf(){document.f.q.focus();} …………… Netzwerkprogrammierung 33 Konzepte des WWW Größte Bedeutung hat jeweils die 1. Zeile Andere Angaben sind meist nicht zwingend nötig Ergebniscodes Content-Typen (MIME-Typen) 200-299 Erfolg (alles Ok) 300-399 Umleitung (auf andere Seite) 400-499 Fehler Clientseite (z.B.: falsche URL eingegeben) 500-599 Fehler Serverseite (ein Serverscript hat Fehler verursacht) text/html text/plain image/gif image/jpeg application/octet-stream application/msword multipart/form-data http ist Zustandslos –Anfragen sind nicht miteinander verbunden Netzwerkprogrammierung 34 Konzepte des WWW Web-Server was passiert wenn eine Webseite angefordert wird Netzwerkprogrammierung 35 Konzepte des WWW Fragen: Beim öffnen einer typischen Webseite mit Bilder, StyleSheets, JavaScripten Wie viele http-Requests sendet der Browser zum Server? Ist paralleles herunterladen beim öffnen einer Webseite möglich/sinnvoll? Netzwerkprogrammierung 36 Ausblick Übungsaufgabe 1 Entwickeln Sie einen minimalistischen Webserver. Entscheiden Sie dabei selbst ob Ihr Webserver mehrere Anfragen gleichzeitig behandeln kann oder nicht. Konzentrieren Sie sich beim parsen des http-Request Headers auf die erste Zeile und implementieren Sie den Befehl GET. Generieren Sie einen httpResponse Header, der von einem Browser verstanden wird und auch der Seiteninhalt (HTML Seite, Bilder) angezeigt wird. Sie können in 2er Gruppen zusammenarbeiten. Netzwerkprogrammierung 37 Socket Programmierung Um die Übungsaufgabe Lösen zu könne, benötigen wir Sockets. Server Entwickeln: Verwendung von ServerSocket in Java. Als Client nehmen wir zum Testen „telnet“ Wie verwenden TCP als Transportprotokoll Netzwerkprogrammierung 38 Socket Programmierung import java.io.*; import java.net.*; public class _1_ServerSocket { public static void main( String[] args ) { ServerSocket server; // unser ServerSocket try { server = new ServerSocket(1111); // maximal 65536 Socket client = server.accept(); // blockiert! PrintWriter clientOut = new PrintWriter(new BufferedOutputStream(client.getOutputStream())); clientOut.println("Hallo Client...\nBye."); clientOut.flush(); // damit Buffer übertragen wird! client.close(); } catch (IOException ex) { System.out.println(ex); } } } Netzwerkprogrammierung 39 Socket Programmierung Test mit telnet: Netzwerkprogrammierung 40 Socket Programmierung Was kann unser Server: genau eine Verbindung entgegennehmen einmalig eine Textnachricht an den Client senden Verbindung mit Client trennen Server wird beendet Erweitern wir den Server mit: Server arbeitet dauerhaft und kann beliebig viele Verbindungen verarbeiten Client kann auch Daten zum Server senden Netzwerkprogrammierung 41 Socket Programmierung import java.io.*; import java.net.*; public class _2_ServerSocket { public static void main(String[] args){ ServerSocket server; try { server = new ServerSocket(1111); // maximal 65536 while (true){ // wiederhole immer wieder! Socket client = server.accept(); PrintWriter clientOut = new PrintWriter(new BufferedOutputStream(client.getOutputStream())); BufferedReader clientIn = new BufferedReader(new InputStreamReader(client.getInputStream())); clientOut.println("Hallo Client...\nBye."); clientOut.flush(); String str = clientIn.readLine(); // empfangen System.out.println(str); // auf Serverseite ausgeben client.close(); } } catch (IOException ex){ System.out.println(ex); } } } Netzwerkprogrammierung 42 Socket Programmierung Was kann unser Server: Endlos viele Verbindung entgegennehmen einmalig eine Textnachricht für den Client ausgeben einmalig eine Textnachricht empfangen Verbindung mit Client trennen Was kann unser Server nicht: Clients gleichzeitig – parallel – bedienen Clients müssen sich „anstellen“ in einer Warteschlange mehrer Netzwerkprogrammierung 43 Socket Programmierung Multithreaded Server Wir verwenden für jeden Client einen eigenen Thread. Damit können diese quasi-parallel abgearbeitet werden. Hinweis: In der Praxis können sich mehrere 1000 Clients gleichzeitig verbinden wollen sehr viele Threads verlangsamen das System (zu viel Verwaltung durch BS nötig). Deshalb werden auch Thread-Pools eingesetzt (z.B.: 100 feste Arbeitsthreads). Netzwerkprogrammierung 44 Socket Programmierung import java.io.*; import java.net.*; public class _3_MultiThreaded { public class ClientThread extends Thread { // ein Thread public Socket clientSocket = null; public ClientThread(Socket s) { clientSocket = s; } public void run() { // wird aufgerufen wenn Thread gestartet wird! try { PrintWriter clientOut = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream())); BufferedReader clientIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); clientOut.println("Hallo Client...\nBye."); clientOut.flush(); String str = clientIn.readLine(); System.out.println(str); clientSocket.close(); } catch (IOException ex) { System.out.println(ex);} } } Netzwerkprogrammierung 45 Socket Programmierung public void runServer() { ServerSocket server; try { server = new ServerSocket(1111); // maximal 65536 while (true) { Socket client = server.accept(); ClientThread ct = new ClientThread(client); ct.start(); } } catch (IOException ex) { System.out.println(ex);} } public static void main(String[] args) { System.out.println("*******************************************"); System.out.println("*>>>-----------------------------------<<<*"); System.out.println("*>>> Multithreaded Server <<<*"); System.out.println("*>>>-----------------------------------<<<*"); System.out.println("*******************************************"); _3_MultiThreaded prog = new _3_MultiThreaded(); prog.runServer(); } } Netzwerkprogrammierung 46 Socket Programmierung Nun können wir mit mehreren Telnet Clients gleichzeitig testen: Netzwerkprogrammierung 47 Socket Programmierung Was kann unser Server: beliebig viele Verbindungen parallel entgegennehmen einmalig eine Textnachricht für den Client ausgeben einmalig eine Textnachricht empfangen Verbindung mit Client trennen Fragen: Kann man unseren Server über einen Webbrowser ansprechen und wenn wie? Wenn Ja, was würde im Webbrowser und im Server angezeigt werden? Netzwerkprogrammierung 48 Socket Programmierung Netzwerkprogrammierung 49 Übungsaufgabe 1 Entwickeln Sie einen minimalistischen Webserver. Entscheiden Sie dabei selbst ob Ihr Webserver mehrere Anfragen gleichzeitig behandeln kann oder nicht. Konzentrieren Sie sich beim parsen des http-Request Headers auf die erste Zeile und implementieren Sie den Befehl GET. Generieren Sie einen http-Response Header, der von einem Browser verstanden wird und auch der Seiteninhalt (HTML Seite, Bilder) angezeigt wird. Entwickeln Sie ihr Programm mit Java und verwenden Sie die Klassen Socket und ServerSocket. Nach eigenem Kenntnisstand können Sie eine Konsolenanwendung oder Fensteranwendung erstellen. Netzwerkprogrammierung 50 Übungsaufgabe 1 Hinweise: http-Response: clientOut.println("HTTP/1.1 200 OK"); clientOut.println("Content-Type: text/html"); clientOut.println(""); // Header zuende - eine Leerzeile !!! clientOut.println("<html><body><center>TEST</center></body></html>"); clientOut.flush(); Verwenden Sie Datei-Streams um Dateien (HTML, Bilder) zu öffnen und deren Inhalt in clientOut zu schreiben. Netzwerkprogrammierung 51 Sprachvergleich mit C++ #include <windows.h> #pragma comment( lib, "wsock32.lib") bool IS_SERVER_RUNNING = true; bool PROGRAM_IS_RUNNING = true; unsigned short PORT = 1111; // Server Port struct AClient { SOCKET Socket; // Socket auf welchem wir arbeiten HANDLE ThreadHandle; // der mit diesem Client verbundene Thread }; DWORD WINAPI ClientThreadFunc( LPVOID ClientData ) { AClient* Data = (AClient*)ClientData; // Wir senden ein Hallo Welt an den Clienten // char* Text = "Hallo Welt!\n"; send(Data->Socket,Text,strlen(Text),0); // Beenden der Verbindung // closesocket(Data->Socket); delete Data; return 0; } Netzwerkprogrammierung 52 Sprachvergleich mit C++ void CreateClient(SOCKET Sock) { AClient* Data = new AClient[1]; unsigned long ID = 0; HANDLE Handle = 0; Handle = CreateThread(NULL,0,ClientThreadFunc,(void*)Data,CREATE_SUSPENDED,&ID); Data->ThreadHandle = Handle; Data->Socket = Sock; ResumeThread(Handle); } DWORD WINAPI ServerThreadFunc( LPVOID param ) { sockaddr Addr; SOCKET ServerSocket = 0; SOCKET ActClient = 0; ServerSocket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); // Socket erstellen // memset(&Addr,0,sizeof(sockaddr)); // Adresse an die wir den Socket binden wollen festlegen // Addr.sa_family = AF_INET; unsigned short temp = htons(PORT); memcpy(&Addr.sa_data[0],&temp,sizeof(unsigned short)); bind(ServerSocket,&Addr,sizeof(Addr)); // Binden des Sockets an die Adreese (Port) // listen(ServerSocket,SOMAXCONN); // Socket auf listen schalten // while(IS_SERVER_RUNNING){// Auf Clienten warten // ActClient = accept(ServerSocket,NULL,NULL); if(ActClient == INVALID_SOCKET) continue; CreateClient(ActClient); } PROGRAM_IS_RUNNING = false; // Signal zum Beenden des gesamten Programms // return 0; } Netzwerkprogrammierung 53 Sprachvergleich mit C++ int main () { // Windows mitteilen das wir Sockets benutzen wollen // WSADATA WsaData; WSAStartup(0x101,&WsaData); unsigned long ThreadID = 0; HANDLE ThreadHandle = 0; ThreadHandle = CreateThread(NULL,0,ServerThreadFunc,NULL,CREATE_SUSPENDED,&ThreadID); ResumeThread(ThreadHandle); // Programm wartet bis Thread fertig ist // // Hier könnte alles mögliche Andere verarbeitet werden // while (PROGRAM_IS_RUNNING) Sleep(1); // wieder aufräumen // WSACleanup(); return 0; } Ergebnis: Befehle sind sehr ähnlich, nur etwas mehr Schreibaufwand und nicht Objektorientiert Netzwerkprogrammierung 54 Socket Programmierung Client Entwickeln bislang haben wir fertige Clients verwendet (telnet, Browser) Eigener Client verwendet einen Socket um sich zum Server zu verbinden Lesen und Schreiben auf Socket genau wie bereits im Server Netzwerkprogrammierung 55 Socket Programmierung public class _4_ClientSocket { public class ClientThread extends Thread { public void run() { try { Socket clientSocket = new Socket("127.0.0.1", 1111); PrintWriter clientOut = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream())); BufferedReader clientIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String str = clientIn.readLine(); System.out.println(str); clientOut.println("Hallo zurück"); clientOut.flush(); clientSocket.close(); } catch (IOException ex) { System.out.println(ex); } } } public _4_ClientSocket() { ClientThread ct = new ClientThread(); ct.start(); } public static void main(String[] args){ _4_ClientSocket prog = new _4_ClientSocket(); } } 56 Netzwerkprogrammierung Socket Programmierung Fragen: Bei Consolenprogrammen ist für einen Client kein Thread nötig. Bei einer GUI Anwendung in der Regel jedoch schon – warum? Netzwerkprogrammierung 57 Socket Programmierung WGet Client Ziel: Ein Programm entwickeln, welches HTML Daten von einem beliebigen Webserver holt. Aufruf: java wget www.google.de /index.html Netzwerkprogrammierung 58 Socket Programmierung import java.io.*; import java.net.*; public class _5_WGet { public _5_WGet(String host,String file) { ClientThread ct = new ClientThread(host,file); ct.start(); } public static void main(String[] args) { if (args.length < 2) { System.out.println("Aufruf: java _5_wget www.host.de /file"); } else { _5_WGet prog = new _5_WGet(args[0], args[1]); } } Netzwerkprogrammierung 59 Socket Programmierung public class ClientThread extends Thread { public Socket clientSocket = null; public String targethost; public String targetfile; public ClientThread(String host, String file){ targethost = host; targetfile = file; } public void run() { try { clientSocket = new Socket(targethost, 80); PrintWriter clientOut = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream())); BufferedReader clientIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); clientOut.println("GET "+targetfile+" HTTP/1.1"); clientOut.println("Host:" + targethost+":80"); clientOut.println(""); clientOut.flush(); Netzwerkprogrammierung 60 Socket Programmierung System.out.println("HTTP-Response-Header:"); String str = clientIn.readLine(); while (!str.equals("")) { System.out.println(str); str = clientIn.readLine(); } System.out.println(""); System.out.println(„HTTP-Daten:"); str = clientIn.readLine(); while (!str.equals("")) { System.out.println(str); str = clientIn.readLine(); } clientSocket.close(); } catch (IOException ex){ System.out.println(ex);} } } } Netzwerkprogrammierung 61 Socket Programmierung Netzwerkprogrammierung 62 Socket Programmierung UDP verbindungslos „Broadcast“ möglich – senden an alle Rechner in einem Netzwerk Jeder Client entscheidet ob ihn das Paket interessiert oder nicht Eine mögliche Lösung für „Chat-Anwendungen“ Aber zunächst einfache Client-ServerKommunikation Netzwerkprogrammierung 63 Socket Programmierung public class _6_UDPServer { public class ClientThread extends Thread { public DatagramSocket clientSocket = null; public void run() { try { clientSocket = new DatagramSocket(1234); // 1234=Port while (true) { // Ein Paket empfangen: byte[] buf = new byte[256]; DatagramPacket packet = new DatagramPacket(buf, buf.length); clientSocket.receive(packet); String received = new String(packet.getData()); System.out.println("Empfangen: " + received); // sender merken InetAddress sender = packet.getAddress(); // Ein Paket senden: packet.setAddress(sender); received = "Dank zurück :)"; buf = received.getBytes(); packet.setData(buf); clientSocket.send(packet); } } Netzwerkprogrammierung 64 Socket Programmierung Was kann unser Server: UDP Datagramme annehmen auf Port 1234 Dem Sender eine Nachricht zurücksenden Anfragen werden nicht parallel verarbeitet Verwendet: DatagramSocket und DatagramPacket Netzwerkprogrammierung 65 Socket Programmierung Fragen: Warum bekommt nicht jeder eingehende „Client“ einen eigenen Thread wie bei unserem Multithread-TCP Server? Wann würde es Sinn machen Threads zu verwenden? Netzwerkprogrammierung 66 Socket Programmierung public class _7_UDPClient { public class ClientThread extends Thread { public DatagramSocket clientSocket = null; public String target; public ClientThread(String Target) { target = Target; } public void run() { try { clientSocket = new DatagramSocket(); // ohne Port byte[] buf = new byte[256]; String sendtext = "Hallo Server :)"; buf = sendtext.getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length); InetAddress to = InetAddress.getByName(target); packet.setPort(1234); packet.setAddress(to); clientSocket.send(packet); clientSocket.receive(packet); String received = new String(packet.getData()); System.out.println("Empfangen: " + received); } catch (IOException ex) { System.out.println(ex); } } } public _7_UDPClient(String Target) { ClientThread ct = new ClientThread(Target); ct.start(); } public static void main(String[] args) { if (args.length < 1) { System.out.println("need Target IP as parameter");} else { _7_UDPClient udp = new _7_UDPClient(args[0]); } } } Netzwerkprogrammierung 67 Socket Programmierung Netzwerkprogrammierung 68 Socket Programmierung Verwendung von MulticastSocket An alle Rechner in einem bestimmten Netzwerk senden Einteilung in „multicast groups“ welche in Form einer IP Adresse angegeben werden: 224.0.0.0 bis 239.255.255.255, dabei ist 224.0.0.0 reserviert und sollte nicht verwendet werden. Ein Client kann sich einer Gruppe anschließen und verlassen Vergleich: IP Adresse ~ Frequenz am Radio Netzwerkprogrammierung 69 Socket Programmierung Multicast Packet in eine Gruppe senden (2 Möglichkeiten): String msg = "Hello"; String msg = "Hello"; InetAddress group = InetAddress.getByName("228.5.6.7"); InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(1234); DatagramSocket s = new DatagramSocket (); s.joinGroup(group); DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 1234); DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 1234); s.send(hi); s.send(hi); Netzwerkprogrammierung 70 Socket Programmierung Multicast Packet aus einer Gruppe empfangen: InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(1234); s.joinGroup(group); // Antwort empfangen byte[] buf = new byte[1000]; DatagramPacket recv = new DatagramPacket(buf, buf.length); // nur Buffer s.receive(recv); String received = new String(recv.getData(),0,recv.getLength()); System.out.println("Empfangen: " + received); s.leaveGroup(group); s.close(); Netzwerkprogrammierung 71 Socket Programmierung Beide Clients empfangen zeitgleich das Paket Netzwerkprogrammierung 72 Socket Programmierung Fragen: Ein Server möchte all seinen Clients eine Nachricht senden. Besitzt ein UDP-Multicast Vorteile gegenüber einer TCP Übertragung oder einem adressierten UDP Paket? Nennen Sie Beispiel für UDP-Anwendungen, wo eignet sich UDP besonders gut? Netzwerkprogrammierung 73 Socket Programmierung Zusammenfassung: Konzept von Sockets / Ports kennen gelernt ServerSocket und Socket für Server und Client Anwendungen verwendet Multithread-Server entwickelt HTTP Protokoll praktisch angewendet TCP und UDP verwendet Die verwendete Programmiersprache spielt dabei eine untergeordnete Rolle Netzwerkprogrammierung 74 Übungsaufgabe 2 Entwickeln Sie mit UDP MulticastSocket eine Chat-Anwendung Verwenden Sie 2 Threads (einen für Senden und einen für Empfangen) Gestalten Sie eine einfache GUI für die Anwendung Es ist kein Chat-Server nötig Netzwerkprogrammierung 75 Java Socket Programmierung Objekte über das Netzwerk versenden Java kann Objekte über einen ObjectOutputStream schreiben (anwendbar auf Dateien und Socketverbindungen) Objekte müssen java.io.Serializable implementieren Vorteil: Kein „parsen“ von Textübertragungen nötig, sondern ganze Objekte auf einmal Netzwerkprogrammierung 76 Java Socket Programmierung java.io.Serializable Serializable ist ein leeres Flag-Interface durch Implementierung wird eine Klasse serialisierbar standardmäßig werden alle Datenelemente, die nicht als static oder transient delariert sind, serialisiert Das gleiche gilt für alle Klassen, die von einer Klasse, die dieses Interface implementiert, abgeleitet sind. Serializieren kann man mit einem Foto des aktuellen Zustands vergleichen Viele Klasse innerhalb von Java sind bereits serialisierbar Netzwerkprogrammierung 77 Java Socket Programmierung public class Auto implements java.io.Serializable { String Farbe; int kmStand; AutoTyp Typ; } public class AutoTyp implements java.io.Serializable { String Hersteller; String Typenschluessel; } Netzwerkprogrammierung 78 Java Socket Programmierung Bisher: Farbe Server Textzeile KmStand Textzeile AutoTyp Textzeile Client Zeilen auslesen (parsen) und ein Objekt erzeugen. Jetzt: Auto1 Server Objekt Auto2 Objekt Auto3 Objekt Netzwerkprogrammierung Client Fertige Objekte kommen an. 79 Java Socket Programmierung public class ServerSocket { public static void main(String[] args){ ServerSocket server; try { server = new ServerSocket(1111); // maximal 65536 while (true){// wiederhole immer wieder! Socket client = server.accept(); OutputStream out = client.getOutputStream(); ObjectOutputStream objectOut = new ObjectOutputStream(out); InputStream in = client.getInputStream(); ObjectInputStream objectIn = new ObjectInputStream(in); Auto a1 = new Auto(); a1.Farbe = "blau"; a1.kmStand = 10000; a1.Typ = new AutoTyp(); a1.Typ.Hersteller = "XYZ"; objectOut.writeObject(a1); // schreiben eines Auto Objekts objectOut.flush(); Auto a2 = (Auto)objectOut.readObject(); // empfangen eines Auto System.out.println(a2.Farbe); // auf Serverseite Farbe ausgeben client.close(); } } catch (IOException ex){ System.out.println(ex); } } } 80 Netzwerkprogrammierung Java Socket Programmierung Fragen: Welche Nachteile hat dies gegenüber der alten Variante mit Textzeilen? Was passiert wenn wir ein Objekt an den Client senden, welches dieser nicht kennt (keine Java-Klasse vorhanden)? Netzwerkprogrammierung 81 Java Socket Programmierung Klassen über das Netzwerk versenden Mit Hilfe eines ClassLoaders können Klassen dynamisch geladen werden Ein Interface beschreibt die Funktionsweise der zu ladenden Klasse (damit der Client weiß, wie sie sich verhalten wird) Klasse wird als ByteArray übertragen (Byte Array selbst ist serialisierbar problemlos per ObjectStream zu versenden ) Netzwerkprogrammierung 82 Java Socket Programmierung Der Class Loader ist dafür verantwortlich, alle verschiedenen Teile eines Programmes (Java-Klassen) zusammenzubringen, damit es ausführbar wird: Class Loader Bytecode JVM Internet Netzwerkprogrammierung 83 Java Socket Programmierung Aufgaben: Laden,Trennen und Verwalten von Klassen Einteilung in sicher/unsicher Schutz der Java System-Klassen Anmerkungen: o Verhindern von Überschreibung vertrauenswürdiger JVM-Klassen o o durch gleichnamige Klassen von einem Webserver Erzeugung konkreter Klassen erst nach dem Verifikationsprozess Zugriffsrechte auf Elemente innerhalb der Systemklassen-Packages ( java.* ) müssen geschützt werden (Sichtbarkeitsbeschränkungen) Eigene Klassen dürfen deshalb nicht diesen Packages hinzugefügt werden. Netzwerkprogrammierung 84 Java Socket Programmierung 1 eingebauter Class Loader(Primordial Class Loader), der für das Laden der System-Klassen verantwortlich ist meist in C geschrieben volle Rechtevergabe an geladene Klassen es kann bel. viele zusätzliche Class Loader geben für Web-Browser z.B. gibt es den Applet Class Loader für jeden zusätzlichen ClassLoader kann es mehrere Instanzen geben – eine pro Codebase damit: eigene Namespaces keine Namenskollisionen keine Sichtbarkeit zwischen Namespaces Netzwerkprogrammierung 85 Java Socket Programmierung Class Loader Hierarchie: Bei der Suche nach Klassen wird eine Class Loader-Hierarchie durchlaufen: direkte Kommunikation zwischen Class Loadern Suchreihenfolge: System-Klassen lokale Klassen Abgeleitete Class Loader(Java2): Applikation Remote-Klassen Applet Primordial Class Loader java.lang.ClassLoader java.security.SecureClassLoader java.net.URLClassLoader AppletClassLoader System-Klassen Netzwerkprogrammierung 86 Java Socket Programmierung Der Class File Verifier prüft, ob das Programm nach den Regeln der JVM läuft das bedeutet nicht unbedingt, dass das Programm die Regeln von Java als Sprache befolgt Class Loader Regeln Bytecode JVM Class File Verifier Class Internet Netzwerkprogrammierung 87 Java Socket Programmierung Die 4 Phasen der Verifikation: Datei-Integrität überprüfen • Format(0xCAFEBABE), Länge Klassen-Integrität überprüfen • Superklasse(wenn vorhanden) nicht final • Name und Signatur von Methoden und referenzierten Klassen Bytecode-Integrität überprüfen • Datenfluß-Analyse • Stack-Checking • statische Typüberprüfung Laufzeit-Integrität überprüfen • dynamische Typüberprüfungen Netzwerkprogrammierung 88 Java Socket Programmierung Interface ICalculator ClassClient Interface beschreibt wie die Calculator Klasse arbeiten wird ClassServer Übertragung Calculator Netzwerkprogrammierung 89 Java Socket Programmierung Interface ICalculator ClassClient ClassServer verwenden Calculator Calculator (lokale Kopie) Netzwerkprogrammierung 90 Java Socket Programmierung Interface für Calculator: public interface ICalculator { public int add(int a, int b); public int sub(int a, int b); public long times(int a, int b) public double div(double a, double b); public double power(double basis, double exp); } Netzwerkprogrammierung 91 Java Socket Programmierung Die Klasse Calculator: public class Calculator implements java.io.Serializable, ICalculator { public Calculator() { } public int add(int a, int b) { return (a+b); } public int sub(int a, int b) { return (a-b); } public long times(int a, int b) { return (a*b); } public double div(double a, double b) { return (a/b); } public double power(double basis, double exp) { return(Math.pow(basis, exp)); } } Netzwerkprogrammierung 92 Java Socket Programmierung ClassServer: Stellt Java-Klassen zur Verfügung Erwartet den Namen der zu übertragenden Klasse Schickt dem Client die geforderte Klasse als ByteArray zurück Netzwerkprogrammierung 93 Java Socket Programmierung public class ClassServer { public void server() { try { ServerSocket ss = new ServerSocket(1234); // TCP Socket while(true) { System.out.println("Server at: " + ss.getLocalPort() + "."); Socket s = ss.accept(); // Verbindung annehmen OutputStream out = s.getOutputStream(); ObjectOutputStream objectOut = new ObjectOutputStream(out); InputStream in = s.getInputStream(); ObjectInputStream objectIn = new ObjectInputStream(in); System.out.print("Connected..."); String name = (String)objectIn.readObject(); RandomAccessFile file = new RandomAccessFile("classes/" + name + ".class", "r"); byte data[] = new byte[(int)file.length()]; file.readFully(data); objectOut.writeObject(data); objectOut.flush(); System.out.print("object transmitted..."); s.close(); } } catch(Exception e) { e.printStackTrace(); }} Netzwerkprogrammierung 94 Java Socket Programmierung NetClassLoader: Erbt von ClassLoader (eine fertige Java Klasse) Implementiert findClass (String name) Stellt die Verbindung zum ClassServer her und kommuniziert mit diesem ist der eigentliche Client unseres Programms Netzwerkprogrammierung 95 Java Socket Programmierung class NetClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData (String name) { try { Socket s = new Socket(host, port); System.out.print("Connection established..."); InputStream in = s.getInputStream(); ObjectInputStream objectIn = new ObjectInputStream(in); OutputStream out = s.getOutputStream(); ObjectOutputStream objectOut = new ObjectOutputStream(out); objectOut.writeObject(name); // Namen der Klasse die wollen objectOut.flush(); Object o = objectIn.readObject(); // Klasse als Byte Array System.out.print("object received..."); s.close(); System.out.println("connection closed."); return (byte[]) o; } catch (Exception e) { return null; }}} Netzwerkprogrammierung 96 Java Socket Programmierung ClassClient Beispielanwendung für NetClassLoader um eine Klasse zu beziehen Verwendet anschließend die dynamisch geladene Klasse Netzwerkprogrammierung 97 Java Socket Programmierung public class ClassClient { private NetClassLoader classload = new NetClassLoader(); public Object getObject(String objectName) throws Exception{ classload.port = 1234; classload.host = "localhost"; Class c = classload.findClass(objectName); Object o = c.newInstance(); return o; } public void performTask() { try { // get an instance (object) out of the class ICalculator calc = (ICalculator)getObject("Calculator"); System.out.println("6+7=" + calc.add(6, 7)); } catch(Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); } } public static void main(String args[]) { new ClassClient().performTask(); } } Netzwerkprogrammierung 98 Java Socket Programmierung Fragen: Welche Vorteile sehen Sie im dynamischen Laden von Klassen? Welche Nachteile können entstehen wenn die Bezugsquelle unbekannt ist? Netzwerkprogrammierung 99 Java Socket Programmierung Zusammenfassung: Java Klassen über das Netzwerk dynamisch übertragen ObjectInputStream und ObjectOutputStream kennen gelernt Kann aber nicht mit „nicht Java“ Programmen kombiniert werden Netzwerkprogrammierung 100 Übungsaufgabe 3 Entwickeln Sie eine Java-Anwendung die mit Hilfe von NetClassLoader eine Arbeiterklasse von einem Server holt, eine Instanz dieser Klasse abarbeitet und das Arbeitsergebnis zum Server zurücksendet. Ziel: Verteilte Aufgabenverarbeitung – wie zum Beispiel beim SETI Projekt Netzwerkprogrammierung 101 Übungsaufgabe 3 Beispiel für eine Arbeiterklasse: Durch das Sieb des Eratosthenes kann man schnell Primzahlen finden: Man füllt eine Liste mit Zahlen von 1 bis S (z.B. S=10000) n sei eine Variable man beginnt mit n=2 und sucht nun alle Vielfachen von n alle gefundenen Vielfachen werden aus der Liste gestrichen nun wird n auf die kleinste verbleibende Zahl gesetzt nach dem letzten n (im ersten Fall n=3) man sucht wieder alle Vielfachen von n und streicht dieser aus der Liste … ist n*n >= S kann der Algorithmus beendet werden Alle verbleibenden Zahlen in der Liste sind Primzahlen Netzwerkprogrammierung 102 RMI RMI (Remote Methode Invocation) Java-Technologie Objekte auf einem entfernten Rechner werden verwendet wie lokale Eignet sich auch zur IPC (Inter-Process Communication) von Anwendungen auf dem selben Rechner Netzwerkprogrammierung 103 RMI Lokaler Rechner (Client) Entfernter Rechner (Server) SampleServer remoteObject; int s; … s = remoteObject.sum (1,2); 1, 2 public int sum (int a, int b) { return a+b; } 3 System.out.println(s); Netzwerkprogrammierung 104 RMI Client Host Server Host RMIClient1 Client – Side Java VM Remote Server Object Client Host Server – Side Web Server und Java VM RMIClient2 Client – Side Java VM Netzwerkprogrammierung 105 RMI Wird vom Entwickler erstellt Wird von RMIC erzeugt Client.java Server.java verwendet verwendet IRMIServer.java (Interface) RMIServer.java (Implementation) Stubs RMIServer.java Skeletons RMIServer.java RemoteServerObject Remote Reference Layer (RRL) Wird von JVM bereitgestellt und verarbeitet Transport Layer (TCP) Transport Layer (TCP) Netzwerkprogrammierung 106 Client.java RMI verwendet IRMIServer.java (Interface) Lookup (nachschauen) Stubs RMIServer.java Aufruf return Skeletons RMIServer.java Server.java verwendet RMIServer.java (Implementation) Bind (anmelden) Netzwerkprogrammierung RMI - Registry RMI – Registry kennt alle Remote Server Objekte und ist Vermittler (Telefonbuch) 107 RMI verwenden 1. Interface für RemoteObject Klasse definieren 2. Implementation des RemoteObjects entsprechend des Interfaces 3. Server Programm, welches das RemoteObject an die RMI-Registry bindet 4. Client Programm entwickeln, welches das Interface verwendet und von der RMI-Registry des Serverechners das RemoteObject holt 5. rmiregistry auf dem Server starten, rmic auf die Serverklasse anwenden, Server starten Netzwerkprogrammierung 108 RMI verwenden Interface import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; } Client Server import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.UnicastRemoteObject; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class Client { private Client() {} public static void main(String[] args) { String host = (args.length < 1) ? null : args[0]; try { Registry registry = LocateRegistry.getRegistry(host); Hello stub = (Hello) registry.lookup("Hello"); String response = stub.sayHello(); System.out.println("response: " + response); } catch (Exception e) { System.err.println("Client exception: " + e.toString()); e.printStackTrace(); } } } public class Server implements Hello { public Server() {} public String sayHello() { return "Hello, world!"; } public static void main(String args[]) { try { Server obj = new Server(); Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); Registry registry = LocateRegistry.getRegistry(); registry.bind("Hello", stub); System.err.println("Server ready"); } catch (Exception e) { System.err.println("Server exception: " + e.toString()); e.printStackTrace(); } } } Netzwerkprogrammierung 109 RMI verwenden Server: Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); Registry registry = LocateRegistry.getRegistry(); // Registry registry = LocateRegistry.createRegistry(7777); registry.bind("Hello", stub); // registry.rebind(“Hello", stub); Client: Registry registry = LocateRegistry.getRegistry("127.0.0.1"); Hello stub = (Hello) registry.lookup("Hello"); // Hello stub = (Hello )Naming.lookup("//hostname:port/Hello"); Netzwerkprogrammierung 110 RMI verwenden Netzwerkprogrammierung 111 Beispiel: Internet Shopping Ein Shopping Portal mit Java Programm Das Beispiel wird mit Hilfe von zwei Server-Objekten implementiert: Ein zentrales Server-Objekt, das eingehende Verbindungen entgegennimmt und dafür zuständig ist, neue Sitzungen zu erzeugen. Ein Warenkorb-Objekt für die Clients. Die Daten im Warenkorb werden von Client-Seite hinzugefügt und auf dem Server im Warenkorb zwischengespeichert. Netzwerkprogrammierung 112 Beispiel: Internet Shopping Zunächst Interfaces anlegen Die Schnittstelle des zentralen Server-Objekts hat dabei folgenden Aufbau: import java.rmi.*; public interface ShopServer extends Remote { public Cart createCart() throws RemoteException; } Netzwerkprogrammierung 113 Beispiel: Internet Shopping Der Client ruft die Methode createCart() und bekommt ein Cart-Objekt zurück. Da der Inhalt des Warenkorbs auf dem Server gespeichert werden soll, bekommt er auch ein Interface: import java.rmi.*; public interface Cart extends Remote { public void addProduct(String name) throws RemoteException; public void removeProduct(String name) throws RemoteException; public String[] listContents() throws RemoteException; public void buy(String custID) throws RemoteException; } Netzwerkprogrammierung 114 Beispiel: Internet Shopping Man kann dem Warenkorb neue Produkte hinzufügen, Produkte entfernen, die vorhandenen Produkte auflisten und die Bestellung absenden. Zur Vereinfachung werden die Produkte hier nur durch ihren Namen identifiziert. (normalerweise eine eigene Klasse Produkt) Netzwerkprogrammierung 115 Beispiel: Internet Shopping Das zentrale Server-Objekt ist in ShopServerImpl implementiert. Besitzt eine main()-Methode, in der das Objekt beim Namensdienst registriert wird. import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class ShopServerImpl extends UnicastRemoteObject implements ShopServer { public ShopServerImpl() throws RemoteException { } public Cart createCart() throws RemoteException { System.out.println("create cart"); return new CartImpl(); } public static void main(String args[]) { try { Naming.rebind("shop-server", new ShopServerImpl()); } catch(Exception ex) { ex.printStackTrace(); } } } Netzwerkprogrammierung 116 Beispiel: Internet Shopping Beim Aufruf von createCart() wird ein neues Cart-Objekt zurückgegeben. Implementierung in CartImpl Jeder User bekommt einen eigenen Einkaufswagen Netzwerkprogrammierung 117 Beispiel: Internet Shopping import java.rmi.server.UnicastRemoteObject; import java.rmi.RemoteException; import java.util.*; public class CartImpl extends UnicastRemoteObject implements Cart { List products; boolean pending = false; public CartImpl() throws RemoteException { products = new ArrayList(); } public void addProduct(String name) { System.out.println("add product: "+name); products.add(name); } Netzwerkprogrammierung 118 Beispiel: Internet Shopping public void removeProduct(String name) { System.out.println("remove product: "+name); products.remove(name); } public String[] listContents() { System.out.println("list contents"); String[] contents = new String[products.size()]; products.toArray(contents); return contents; } public void buy(String custID) { System.out.println("buy products: "+custID); pending = false; // Hier Bestellung verschicken ... } } Netzwerkprogrammierung 119 Beispiel: Internet Shopping Wenn eine Server-Methode ein Objekt zurückgibt, das von UnicastRemoteObject erbt, wird nicht das Objekt serialisiert sondern es wird auf dem Server ein neues Remote-Objekt erzeugt wenn der Client Methoden von Cart aufruft, werden diese Methoden auf Serverseite ausgeführt. Netzwerkprogrammierung 120 Beispiel: Internet Shopping import java.rmi.Naming; public class ShopClient { public static void main(String args[]) { try { ShopServer server = (ShopServer)Naming.lookup("ShopServer"); Cart cart = server.createCart(); cart.addProduct("Visual Studio 2005"); cart.addProduct("Oracle Database"); String[] s = cart.listContents(); for(int i=0; i < s.length; i++) System.out.println(" - "+s[i]); cart.buy("Max Mustermann"); } catch(Exception ex) { ex.printStackTrace(); } } } Netzwerkprogrammierung 121 Beispiel: Internet Shopping Fragen: Warum bleibt der Einkaufskorb auf dem Server? Wie sieht die typische Datenanbindung einer solchen Anwendung aus? Netzwerkprogrammierung 122 RMI verwenden Vorteile gegenüber herkömmlicher Socketprogrammierung: Minimale (technische Netzwerk-) Kenntnisse nötig Transparent – als Entwickler sehen wir die gesamte Übertragung nicht (Abstraktion) Fernsteuerung eines Serverprogramms anstatt reines Austauschen von Daten Netzwerkprogrammierung 123 RMI verwenden Nachteile: RMI-Registry muss mitlaufen (eigener Prozess mit eigenem Port) Die Datenübertragung erzeugt mehr „Overhead“ RMI ist nur mit der Programmiersprache Java verwendbar Netzwerkprogrammierung 124 RMI verwenden Fragen: Man kann bei mehreren Server Programmen sowohl eine gemeinsame RMI-Registry verwenden, als auch jeweils eine eigene. Welche vorteile sehen Sie in beiden Lösungen? Netzwerkprogrammierung 125 RMI verwenden Zusammenfassung: RMI Architektur kennen gelernt RMI-Registry und RMIC verwendet Unterschied zwischen herkömmlicher Socketprogrammierung und RMI aufgezeigt Netzwerkprogrammierung 126 Übungsaufgabe 4 Ein kleines DBMS auf der Basis von RMI Folgende Punkte soll der Server berücksichtigen: Er implementiert einen ADT Person, mit den wichtigsten Eigenschaften, wie ID Name Vorname Geburtsdatum etc. Weiterhin implementiert er einen Vector, welcher mit n vielen Personen gefüllt ist. Der Vector soll den Namen personenVector tragen. personenVector soll serverseitig in eine binäre Datei serialisiert werden. Verwenden Sie hierfür ObjectOutputStream bzw. ObjectInputStream und java.io.Serializable. Netzwerkprogrammierung 127 Übungsaufgabe 4 Er soll in einer Klasse DBServer, folgende Methoden anbieten: Person getPerson(int id) Person[] getPersonByName(String name) Person[] getPersonByVorname(String vorname) void setPerson(Person p) void removePerson(Person p) Der Client soll sich ein Objekt vom Typ DBServer verwenden und aus diesem verschiedene Personen aufrufen/setzen/löschen können. Netzwerkprogrammierung 128 .NET Remoting .NET bietet im wesentlichen zwei Konzepte für Netzwerkprogrammierung: System.Runtime.Remoting High Level Sprachelemente für RPC / Remote Objects Wahlweise über BinaryTCP oder HTTP-SOAP (XML) System.Net.Sockets Low Level Sprachelemente Sockets wie wir schon mit Java hatten Netzwerkprogrammierung 129 .NET Remoting Ein Objekt wird vom Server für alle Clients zur Verfügung gestellt Clients können das Objekt „fernsteuern“ Direkt vergleichbar mit RMI Netzwerkprogrammierung 130 .NET Remoting Verwendung von 3 Projektmappen in VS 1 Server Programm 1 Client Programm 1 gemeinsam genutzte Klassen-Bibliothek Netzwerkprogrammierung 131 .NET Remoting public class MyServerObject : MarshalByRefObject { private int Usercount; public int GetUsercount() { return Usercount; } public void IncrementUsercount() { Usercount++; System.Console.WriteLi ne("Us ercount ist nun: " + Usercount); } public void DecrementUsercount() { Usercount--; System.Console.WriteLi ne("Us ercount ist nun: " + Usercount); } } Alle Klassen müssen von MarshalByRefObject erben um RemoteObjekte zu sein Netzwerkprogrammierung 132 .NET Remoting static void Main(string[] args) { HttpChannel channel = new HttpChannel(8880); // Port ChannelServices.RegisterChannel(channel, false); // Server über port 8880 ist hier offen RemoteObjects.MySer verObject server = new RemoteObjects.MySer verObject(); RemotingServices.Marshal(ser ver, "server"); System.Console.WriteLi ne("Ser ver gestartet..."); System.Console.ReadLi ne(); // warte auf Taste zum beenden ChannelServices.UnregisterChannel(c hannel) ; } Bibliotheken einbinden http Channel auf Port 8880 öffnen http Server wieder schließen Netzwerkprogrammierung 133 .NET Remoting static void Main(string[] args) { RemoteObjects.MySer verObject server = (RemoteObjects.MySer verObject) Activator.GetObject (typeof(RemoteObjects.M ySer verObject), "http://127.0.0.1:8880/server") ; // Zugriff auf das Server Objekt server.IncrementUsercount(); System.Console.WriteLi ne("Du bist der " + server.GetUsercount() + " User"); System.Console.ReadLi ne(); // warte auf Taste zum beenden server.DecrementUserc ount(); } Arbeiten wie lokales Objekt Netzwerkprogrammierung 134 .NET Remoting Netzwerkprogrammierung 135 .NET Remoting Methoden werden auf dem Server ausgeführt Über einen Channel können beliebig viele Objekte registriert werden (ähnlich der RMIRegistry) TcpChannel ist binär (weniger Overhead als SOAP) EventHandler für Kommunikation zwischen Klassenbibliothek und Programmen Netzwerkprogrammierung 136 .NET Remoting wenn Handler festgelegt wurde dann ausführen Netzwerkprogrammierung 137 .NET Remoting Netzwerkprogrammierung 138 .NET Remoting Vergleich .NET Remoting zu RMI Wenn das SOAP Protokoll verwendet wird, theoretisch auch mit Programmen anderer Programmiersprachen koppelbar „RMI-Registry“ hier prinzipiell kein extra Programm Bleibt vorwiegend auf Windows BS beschränkt Netzwerkprogrammierung 139 RMI und .NET Remoting Beide Konzepte sind sehr ähnlich Beide haben den Nachteil: Der Server kann selbständig keine Nachrichten zum Client senden! Client stößt Methode auf Server an und bekommt Ergebnis zurück Netzwerkprogrammierung 140 RMI und .NET Remoting RemoteObject wie lokales behandeln Server Host Client Host Anfrage RMIClient1 Remote Server Object Antwort Server – Side Web Server und Java VM Client – Side Java VM Netzwerkprogrammierung 141 RMI und .NET Remoting Client Host gedachtes Ergebnis: Remote Server Object RMIClient1 Client – Side Java VM Netzwerkprogrammierung 142 RMI und .NET Remoting Der so genannte „Callback“: Server kann zu einem beliebigen Zeitpunkt den Client über Ereignisse informieren Beispiel: Auktionshaus: Alle Clients können Gebote abgeben Clients sollen stets das höchstgebot angezeigt bekommen Netzwerkprogrammierung 143 RMI und .NET Remoting Client Host Client Host RMIClient1 RMIClient3 Teilt mit: Aktuelles Gebot bei 10€ Sendet ein Gebot Server Host von 10€ Client – Side Java VM Client – Side Java VM Remote Server Object Teilt mit: Aktuelles Gebot bei 10€ Client Host RMIClient2 Teilt mit: Aktuelles Gebot bei 10€ Client Host Server – Side Web Server und Java VM RMIClient4 Client – Side Java VM Client – Side Java VM Netzwerkprogrammierung 144 RMI und .NET Remoting Realisierung von Callbacks: Client wird selbst zu einem Server und stellt RemoteObject bereit Client meldet sich am Server an (wie immer) Client teilt Server mit wie man ihn „zurückrufen“ kann Server führt Liste über alle Clients Netzwerkprogrammierung 145 RMI und .NET Remoting Fragen: Welche Nachteile ergeben sich durch den Einsatz von Callbacks? (Bezug Firewalls, NATs) Netzwerkprogrammierung 146 Übungsaufgabe 5 Entwickeln Sie eine RMI oder .NET Remoting Anwendung mit Callbacks Auktionshaus mit n Teilnehmern und mehreren Artikeln Client sollte kleine GUI besitzen in der Gebote abgegeben werden können und Artikel angesehen/ausgewählt werden können Prüfung ob ein abgegebenes Gebot > aktuelles Höchstgebot ist Netzwerkprogrammierung 147 Problem In der realen Welt werden verschiedenste Technologien zusammen verwendet (Java, RMI, .NET …) Sockets arbeiten gut zusammen auch mit unterschiedlichen System aber sind schwer zu entwickeln (aufwendig). wir benötigen etwas unabhängiges und leistungsstarkes Netzwerkprogrammierung 148 WebServices Eine Lösung: WebServices Jeder Betreiber stellt Services bereit Clients greifen auf diese zu Beispiel: Google sucht für uns im Internet Verwenden von Google WebService um in einem eigenen Projekten Google-Suche anbieten zu könne. Netzwerkprogrammierung 149 WebServices Alternative zu RMI und .NET Remoting Plattformunabhängig Sprachunabhängig (Perl,Java,C++,.NET,PHP,…) Beispiele: Google, Amazon, .NET Passport Auf HTTP (Web-Server) aufgesetzt, damit kein zusätzlicher Port nötig, gut erreichbar auch hinter Firewalls Webservices sind in der Regel „zustandslos“ Netzwerkprogrammierung 150 WebServices Fragen: Welche Vorteile bietet WebServer als Träger noch? Kann es dadurch auch Nachteile/Probleme geben? Netzwerkprogrammierung 151 WebServices Ziel: Nachrichten zwischen Client und Server können von allen Plattformen und Programmiersprachen gelesen/geschrieben werden! Vision: Alle Server der Welt bieten Services an und wie in einem Telefonbuch können die Clients diese verwenden Netzwerkprogrammierung 152 WebServices WebService Consumer (Client) WebService Provider (Server) Application Logic Application Logic WS-Toolkit WS-Toolkit DB Message (SOAP) Netzwerkprogrammierung 153 WebServices WebService Consumer (Client) Application Logic WS-Toolkit Beschreibt WSDL Liest WebService Provider (Server) Application Logic DB WS-Toolkit Message (SOAP) Transport HTTP Netzwerk TCP/IP Netzwerkprogrammierung 154 WebService Woher weiß der Client wo ein Server steht und welche WebServices er anbietet? UDDI Dienst finden Dienst bekanntgeben Client Server Netzwerkprogrammierung 155 WebService Wie kann man nun die angebotenen Dienste beschreiben? public String[] doGoogleSearch (String s) { … } Wie soll dies ein Scheme Program verstehen? Netzwerkprogrammierung 156 WebService WSDL XML-Sprache zur Selbstbeschreibung von WebServices WSDL Beispiel: http://www.webservicex.net/globalweather.asmx?wsdl http://api.google.com/GoogleSearch.wsdl http://www.webservicex.net/CreditCard.asmx?wsdl CreditCard WS - was halten Sie davon? Netzwerkprogrammierung 157 WebService Mit WSDL wird der Aufbau von Methoden und deren Parametern beschrieben. Spezifische Angaben über Art, Menge … Primitive Datentypen wie String, Integer, Array … müssen vereinheitlicht werden ! Netzwerkprogrammierung 158 WebService SOAP (Simple Object Access Protocol) XML basierte Sprache um Nachrichten auszutauschen (Client Server) SOAP wird in der Regel durch WS-Kit erstellt und ausgewertet Ursprünglich von MS Entwickelt für XML-RPC .NET Remoting kann SOAP Netzwerkprogrammierung 159 WebServices Google Suchanfrage stellen mit SOAP Nachricht: <SOAP-ENV:Body> <ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <keyxsi:type="xsd:string">00000000000000000000000000000000</key> <q xsi:type="xsd:string">das hier sind die Schlüsselworte</q> <start xsi:type="xsd:int">0</start> <maxResults xsi:type="xsd:int">10</maxResults> <filter xsi:type="xsd:boolean">true</filter> <restrict xsi:type="xsd:string" /> <safeSearch xsi:type="xsd:boolean">false</safeSearch> <lr xsi:type="xsd:string" /> <ie xsi:type="xsd:string">latin1</ie> <oe xsi:type="xsd:string">latin1</oe> </ns1:doGoogleSearch> </SOAP-ENV:Body> Netzwerkprogrammierung 160 WebServices Aus einer WSDL Datei kann man sich automatisch eine Proxy-Klasse erzeugen lassen (.NET, Java). Auch Internetseiten können automatisch generiert werden (zum gerade entwickelten WS) Beispiel mit .NET Netzwerkprogrammierung 161 WebService Selbst einen WS entwickeln und anbieten: Eine eigene Klasse erbt von einer BasisWebservice Klasse (System.Web.Services.WebService in .NET) Diese Klasse = WS Klasse die wir im Client mit …WS w = new …WS(); instanziieren. Entwicklung von Methoden wie immer Kennzeichnen der Methoden die von außen verfügbar sein sollen ([WebMethod] in .NET) Netzwerkprogrammierung 162 WebService WebServices benötigen einen WebServer (in der Regel) Damit eher ungeeignet für IPC (Inter Process Communication) Entwicklung und Setup von WS ist ja nach Sprache und BS leicht unterschiedlich Netzwerkprogrammierung 163 WebServices Nachteile: Großer Daten Overhead XML Parsen verbraucht Zeit Es gibt derzeit kein einheitliches Modell zur Authentifizierung eines Clients Beispiele: Google-Key oder .htaccess (Beschränkung wie eine normale HTML Seite) Google hat am 6.12.2006 seinen WebService wieder eingestellt (es werden keine neuen Keys mehr vergeben) Netzwerkprogrammierung 164 WebServices Fragen: Welche Vorteile entstehen durch den Einsatz von Webservices im Internet? Kann man Callbacks verwenden? Welche Probleme kommen besonders zum tragen, wenn SOA (Service Oriented Architecture) eingesetzt wird (viele Webservices für unterschiedliche Aufgaben)? Netzwerkprogrammierung 165 WebServices Zusammenfassung: Sowohl WebServices, RMI und .NET Remoting besitzen einen sehr ähnlichen Grundkonzept Mit steigender Abstraktion entsteht mehr „Overhead“ langsamer, mehr unerwünschte Datenübertragung Netzwerkprogrammierung 166 Beleg - Projekte Entwickeln Sie eine Client-Server Projekt welches eines oder mehrere der vorgestellten Konzepte (Sockets, RMI, Remoting, WS,…) verwendet. Netzwerkprogrammierung 167 Beleg – Projekte Ideen Sockets: Email Client alla Outlook (vereinfacht) FTP Client oder Server Chat Applet & Server … RMI / .NET Remoting Schach Applikation Diverse Kartenspiele … Netzwerkprogrammierung 168 Beleg – Projekte Ideen WS: Warenhaus Artikelsuche (mit DB und vielleicht Hibernate, …) Einheiten-Umwandler-Service (€ $, m cm…) Verschlüsslungsservice (Text Crypted) ChartService (Wertliste Chart-Grafik) - Rückgabe ist ByteArray für JPEG Bild o.ä. … Netzwerkprogrammierung 169 Beleg – Projekte Ideen Stellen Sie mir ihr Projekt vor (welchen Inhalt soll es haben, wie wollen Sie es umsetzen) Diskussion Netzwerkprogrammierung 170 Java Applets Java Programme die nur in einer abgeschlossenen Laufzeitumgebung arbeiten (z.B.:Web-Browser, Appletviewer) Ein Applet wird häufig in eine Website eingebettet Programmcode wird aus dem Internet geladen und auf dem lokalen Rechner ausgeführt Netzwerkprogrammierung 171 Java Applets Sandbox-Prinzip in Analogie zu einem Kind, das in seinem Sandkasten keinen Schaden anrichten kann Der Zugriff auf die Umgebung wird durch ein spezielles Objekt, den Sicherheitsmanager, gesteuert Der Sicherheitsmanager, wird bei der Initialisierung der JVM festgelegt - Applet kann nichts ändern Verboten: Zugriffe auf das Dateisystem des lokalen Rechners Zugriff auf Daten des Benutzers (Nutzername, Zwischenablage etc.) Netzwerkverbindungen zu anderen Rechnern als dem Server, von dem das Applet geladen wurde Starten von Programmen Änderung der Sicherheitseinstellungen Netzwerkprogrammierung 172 Java Applets Applets besitzen keine „main“ Methode aber dafür: init() - wird genau einmal aufgerufen, wenn das Applet erstmals in den Browser geladen wird. start() - wird jedes Mal aufgerufen, wenn das Applet sichtbar wird. stop() - wird jedes Mal aufgerufen, wenn das Applet verdeckt wird, z. B. weil das Browser-Fenster von einem anderen Fenster überdeckt wird. (klappt aber nicht immer so wie soll!) destroy() - wird aufgerufen, wenn das Applet aus dem Hauptspeicher entladen wird. Netzwerkprogrammierung 173 Java Applets Seite verlassen Applet erstellen init () Seite angezeigt start () stop () Applet vernichten destroy () Zurück zur Seite Blau = einmalig Grün = kann mehrmals auftreten Netzwerkprogrammierung 174 Java Applets Wichtig: Applets werden in der Regel NIE zerstört solange der betreffende Browser läuft! stop() verwenden um Resourcen freizugeben Applets in HTML Seiten einbinden: <applet code="Applet.class" width=300 height=400> <param name="p1" value="param1"> </applet> Netzwerkprogrammierung 175 Java Applets SELFHTML Beispiel Netzwerkprogrammierung 176 Java Applets Applet kann neben „Grafikspielereinen“ aber auch „Frontend“ für eine echte Anwendung sein Oft liegt Datenbank auf dem Server und Kommunikation mit Applet ist notwendig RMI / Sockets können verwendet werden, um Applet mit einer Server-Applikation zu verbinden Netzwerkprogrammierung 177 Java Applets Hinweise zur Entwicklung von Applets: IDE wie NetBeans eignet sich gut zur Entwicklung Appletviewer (als Testwerkzeug) Browser Cache bei Applets beachten! Internet Explorer (Java-Konsole verwenden – „X“ für Cache leeren!) FireFox muss neu gestartet werden um Cache zu leeren. Netzwerkprogrammierung 178 Java Applets import java.applet.*; import java.awt.Graphics; import java.awt.Font; <APPLET CODE="HalloApplet.class" WIDTH="260" HEIGHT="40"> <PARAM name="Font" value="Arial"> </APPLET> public class HalloApplet extends Applet { Font f; public void init() { String Schriftart = getParameter("Font"); f = new Font(Schriftart, Font.BOLD, 18); System.out.println("Java-Konsole: init... !"); } public void paint(Graphics g) { g.setFont(f); g.drawString("Hallo Welt!", 50, 25); System.out.println("Java-Konsole: paint... !"); } public void stop() { System.out.println("Java-Konsole: stop... !"); } } Netzwerkprogrammierung 179 Java Applets Applets in JAR Archiven verpacken Mehrere Dateien können in ein Archive (wie ZIP) verpackt werden Im Web muss dann nur eine Datei heruntergeladen werden (wird auf dem Client entpackt) JAR Archive können „signiert“ werden Netzwerkprogrammierung 180 Java Applets JAR Archive erzeugen jar cvf AppletArchive.jar *.class Ein Archive erstellen und alle Class-Files im aktuellen Ordner einbinden Es können aber auch alle anderen Dateien (Bilder, HTML Dateien,…) eingebunden werden Netzwerkprogrammierung 181 Java Applets Applet in Webseite mit Archive einbinden: <APPLET ARCHIVE="Archiv.jar" CODE="HalloApplet.class" WIDTH="260" HEIGHT="40"> <PARAM name="Font" value="Arial"> </APPLET> Netzwerkprogrammierung 182 Java Applets Wichtige Informationen innerhalb des Applets abrufen: String p1 = getParameter ("param1"); liest einen Applet Parameter der über HTML übergeben wurde ein java.net.URL db = getDocumentBase(); Gibt die URL des HTML Dokuments zurück in dem das Applet eingebettet ist. Image whiteBoard = getImage (db, "White.jpg"); Ein Bild relativ zum HTML Dokument ins Applet laden Netzwerkprogrammierung 183 Java Applets Fragen: Macht es Sinn, große Anwendungen in Applets über den Browser zu verwenden? (bezüglich Dateigröße, Aktualität der Programmversion,…) Könnte unser NetClassLoader unter Umständen Problemen entgegenwirken? Netzwerkprogrammierung 184 Java Applets Zusammenfassung: Die meisten Java Anwendungen können mit wenig Aufwand in Applets umstrukturiert werden Inhalt der main() Methode dafür in die init() Signierte Applets bieten derzeit den größten Leistungsumfang (mehr als Flash) Netzwerkprogrammierung 185 Java Webstart Technologie um Java-Anwendungen direkt über das Internet zu installieren und auszuführen. Kern ist das JNLP (Java Network Launching Protocol) ~ „Intstallationsbeschreibungssprache“ Netzwerkprogrammierung 186 Java Webstart Vorteile von Webstart: Keine Konfiguration vom Anwender nötig Keine typische Installation mit „Zielverzeichnis“, „Full, Medium, Small“ oder ähnlichem Bei einer neuen Programmversion (auf dem Server) wird beim nächsten Programmstart (Anwender) automatisches Update durchgeführt Netzwerkprogrammierung 187 Java Webstart Unterschied zu Applets: Applet wird im Browser ausgeführt (WebStart Applikation wird heruntergeladen und bleibt auf Anwender-PC) Browser ist nur zum Auffinden Netzwerkprogrammierung 188 Java Webstart Voraussetzungen (Server): Web-Server (z.B.: Apache) MIME Type muss gesetzt sein Programm muss in JAR Dateien verpackt sein Voraussetzungen (Client): Java JRE muss installiert sein (1.3+) Internet Browser (IE, FireFox,…) Netzwerkprogrammierung 189 Java Webstart Schritt 1: Anwendung entwickeln Schritt 2: In JAR Datei Verpacken Schritt 3: MIME Type im WebServer setzen Schritt 4: JAR Dateien in HTDOCS (Web-Root) kopieren Schritt 5: JNLP Datei anlegen (XML) Netzwerkprogrammierung 190 Java Webstart Aufruf aus einer HTML Seite über: <a href="webstart.jnlp" >Anwendung Starten</a> Sandbox: Auch WebStart Applikationen laufen im Sandboxmodus – mit signed JARs auch volle Rechte möglich Netzwerkprogrammierung 191 Java Webstart Beispiel mit NetBeans und Apache: Einfache Fensteranwendung NetBeans anweisen eine JAR Datei für das Projekt anzulegen Apache Server konfigurieren: Apache/conf/mime.types editieren application/x-java-jnlp-file jnlp einfügen JNLP Datei erstellen und mit JARs zusammen in einen Ordner legen im Apache HTDOCS. Netzwerkprogrammierung 192 Java Webstart JNLP Datei Beispiel: <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+“ codebase="http://127.0.0.1/dist" href="webstart.jnlp"> <information> <title>Demo</title> <vendor>Wir</vendor> <description>Unser Demo Programm</description> <homepage href="http://www.hs-zigr.de"/> <offline-allowed/> <shortcut online="false"> <desktop/> <menu submenu="Superdemos"/> </shortcut> </information> … Netzwerkprogrammierung 193 Java Webstart JNLP Datei Beispiel: … <resources> <jar href="WebStart.jar"/> <jar href="lib/swing-layout-1.0.jar"/> <j2se version="1.4+" href="http://java.sun.com/products/autodl/j2se" /> </resources> <application-desc main-class="webstart.Form"/> </jnlp> Netzwerkprogrammierung 194 Java Webstart JNLP API Funktionen für OpenDialog, SaveDialog, PrintDialog,… auch in nicht signierten JAR‘s Wenn nur diese Funktionalität benötigt wird deutlich sicherer als signiertes JAR Benötigt jnlp.jar als Bibliothek (API Referenz) Netzwerkprogrammierung 195 Übungsaufgabe 6 Verwenden Sie das DBMS aus Übung 4 und entwickeln Sie ein Java-Applet als Client Der Server bleibt dabei unverändert Verwenden Sie das nachfolgende Tutorials um ihr JavaApplet in ein JAR zu verpacken und selbst zu signieren: http://www-personal.umich.edu/~lsiden/tutorials/signedapplet/signed-applet.html http://java.sun.com/developer/technicalArticles/Security/ Signed/ Netzwerkprogrammierung 196 .NET im Browser Früher ActiveX heute .NET Ermöglicht es genau wie bei Applets Anwendungen über Browser auszuführen Sandbox-Modus wie bei Applets Keine besondere „Appletklasse“ von der abgeleitet werden muss läuft nur im Internet Explorer und nur bei installiertem .NET Framework Netzwerkprogrammierung 197 .NET im Browser Netzwerkprogrammierung 198 .NET im Browser Netzwerkprogrammierung 199 .NET im Browser VS erzeugt eine DLL bei Kompilation Einbinden in HTML Seite über: <html> <body> <object id="simpleControl1" classid="http:./Control1.dll#Control1.UserControl1“ height="338" width="744" VIEWASTEXT> </object> </body> </html> Netzwerkprogrammierung 200 .NET im Browser Einbindung funktioniert leider nicht lokal DLL muss auf einen Webserver gelegt werden Vorzugsweise IIS, Apache kann auch dazu konfiguriert werden http://84.16.228.218/applet/run.html http://84.16.228.218/applet/cards.html Netzwerkprogrammierung 201 .NET im Browser Zusammenfassung: Konzept nahezu identisch mit Java-Applets Nicht plattformunabhängig (eventuell mit Mono unter Linux) Sprachunabhängig, sowohl J#, C#, VB# eignen sich zur Entwicklung Netzwerkprogrammierung 202 Serverseitige Programmierung Applets und .NET Browserprogramme werden auf dem Client ausgeführt Bestimmte Aufgaben kann der Client jedoch alleine nicht lösen (Datenbank, dynamische Generierung von Dokumenten, …) Wenn nur wenige Daten vom Server benötigt werden, dann Applet sinnvoll Wenn sehr viele Daten vom Server verarbeitet werden müssen, dann lieber gleich serverseitige Anwendung verwenden und „thin-Client“ Netzwerkprogrammierung 203 Serverseitige Programmierung Der Server Keine zusammenhängende Abarbeitung Requests müssten zugeordnet werden Speicherobjekte gehen ohne explizite Sicherung nach jedem Response verloren Vor jeder Requestverarbeitung müssen vorangehende Speicherobjekte wiederhergestellt werden Java Servlets Das Java Konzept für dynamische Webseitengenerierung auf Serverseite Servlet = Java Klasse in einem J2EE Webserver Servlet-Container (z.B.: Tomcat) läuft. Ein Servlet ist prinzipiell vergleichbar mit einem WebService nur ohne SOAP Methoden doGet(…) und doPost(…) werden aufgerufen wenn eine Anforderung eintrifft Netzwerkprogrammierung 205 Quelle: Wikipedia Netzwerkprogrammierung 206 Rückblick auf HTTP und Webserver mit Sockets Request Header Welche Datei soll vom Server abgerufen werden Cookies im Header Browsertyp … Response Header Status Code (200,404,403…) Content-Type (text/html, image/jpeg,…) Daten (HTML Seite, Bild…) Netzwerkprogrammierung 207 2 Web-Server (www.google.de) 3 GET / HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/ vnd.ms-powerpoint, application/msword, application/x-icq, */* Accept-Language: de UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Host: 127.0.0.1:81 Connection: Keep-Alive HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html Set-Cookie: PREF=ID=5d5b86a54ea78fff:TM=1172152002:LM=1172152002:S=yRZ ldpnO3qqV9 FoT; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com Server: GWS/2.1 Transfer-Encoding: chunked Date: Thu, 22 Feb 2007 13:46:42 GMT 1 4 Client <html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859 -1"><title>Google</title><style><!-body,td,a,p,.h{font-family:arial,sans-serif} .h{font-size:20px} .h{color:#3366cc} .q{color:#00c} --></style> <script> <!-function sf(){document.f.q.focus();} …………… Netzwerkprogrammierung 208 Java Servlet Beispiel public class NewServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Servlet NewServlet</title></head>"); out.println("<body>"); out.println("<h1>Servlet NewServlet at " + request.getContextPath () + "</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } Netzwerkprogrammierung 209 Java Servlet Beispiel public class ImageCreator extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("image/jpeg"); ServletOutputStream out = response.getOutputStream(); // JPEG Bild erzeugen BufferedImage bi = new BufferedImage(300, 150, BufferedImage.TYPE_INT_RGB); Graphics2D big = bi.createGraphics(); big.drawString("Generarted Image",10,20); big.drawString((new Date()).toString(),10,50); ByteArrayOutputStream o = new ByteArrayOutputStream(); try { JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(o); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi); param.setQuality(1.0f, false); encoder.setJPEGEncodeParam(param); encoder.encode(bi); } catch (Exception ex) { ex.printStackTrace(); } out.write(o.toByteArray()); out.close(); } Netzwerkprogrammierung 210 Java Server Pages Einige Servlets erzeugen pure HTML Ausgabe und haben nur kleine Code Elemente eingebettet. Hierfür eignet sich JSP (Java Server Page) Netzwerkprogrammierung 211 Java Server Pages Arbeitsweise für den Entwickler wie PHP Programmcode wird in eine HTML Seite eingebettet (Endung .jsp) <title> <% int v1 = 0; out.println("Der Wert der Variable: " + v1); %> </title> JSP wird im Hintergrund in ein Servlet übersetzt welches mit println() die HTML Teile ausgibt. Netzwerkprogrammierung 212 Servlet / JSP Entwicklung mit NetBeans Netzwerkprogrammierung 213 Servlet / JSP Entwicklung mit NetBeans Netzwerkprogrammierung 214 Servlet / JSP Entwicklung mit NetBeans Netzwerkprogrammierung 215 Servlet / JSP Entwicklung mit NetBeans Bei Ausführung startet ein Browser: Netzwerkprogrammierung 216 Servlet / JSP Entwicklung mit NetBeans Netzwerkprogrammierung 217 Servlet / JSP Entwicklung mit NetBeans Netzwerkprogrammierung 218 Servlet / JSP Entwicklung mit NetBeans Netzwerkprogrammierung 219 Servlet / JSP Entwicklung mit NetBeans Netzwerkprogrammierung 220 Servlet / JSP Entwicklung mit NetBeans Fragen: Welche Vorteile besitzt eine serverseitige Lösung gegenüber einer clientseitigen, bezüglich der Datensicherheit? (z.B.: Applet verbindet sich direkt mit Datenbank auf dem Server) Welche Anforderungen haben serverseitige Lösungen an den Client? Welchen Nachteile haben serverseitige Programme? Netzwerkprogrammierung 221 Servlet / JSP Sessionmanagement wie WebServices sind Servlets von Haus aus „zustandslos“ In Webapplikationen ist es aber fast immer nötig zu wissen, welcher Client gerade eine Anfrage sendet (zum Beispiel Internet-Shopping) Session-Management nötig ! Netzwerkprogrammierung 222 Servlet / JSP Sessionmanagement public class LoginServlet extends HttpServlet { protected void processRequest(…) throws … { String user = request.getParameter("user"); String pass = request.getParameter("pass"); // Passwort & Benutzernamen überprüfen würde hier passieren HttpSession s = request.getSession(true); s.setAttribute("username",user); response.sendRedirect("index.jsp"); } Netzwerkprogrammierung 223 Übungsaufgabe 7 Verwenden Sie NetBeans IDE und erstellen Sie eine dynamische Webseite mit JSP Dabei soll auch ein Formular vorhanden sein (mit Eingabefeldern) Erstellen Sie ein Servlet, welches die Eingegebenen Werte des Formulars verarbeitet Servlet soll ein Ergebnis seiner Verarbeitung zurückliefern Hinweis: Sie benötigen im Servlet: request.getParameter("EingabefeldName"); Netzwerkprogrammierung 224 Übungsaufgabe 7 Ein Beispiel: Netzwerkprogrammierung 225 ASP .NET .NET Variante von Java Servlets/JSP Teilung von HTML (ASP Seite) und Quelltext (Code-Behind) in einer .NET Sprache wie C# Seitenelemente sind Objekte (Textfelder, Buttons,…) – keine einfachen HTML Elemente mehr Java hat dieses Konzept wieder kopiert und nennt es „Java Server Faces“ Framework Netzwerkprogrammierung 226 ASP .NET Request und Response Objekte genau wie in Java Sessionkonzept ist nahezu identisch umgesetzt wie in Java Vorteile von .NET wie Schnelles einbinden von WebServices XML DOM … Nachteile Nur IIS (Windows WebServer) Netzwerkprogrammierung 227 ASP .NET - Beispiel Login Seite geschützte Seite die Login erfordert Netzwerkprogrammierung 228 Zusammenfassung Auch auf Serverseite sind die Konzepte zwischen Java und .NET sehr ähnlich. In der Realität werden alle besprochenen Technologien sehr heterogen eingesetzt. Webapplikationen bieten viel Potential doch auch herkömmliche Client/Server Anwendungen werden relevant bleiben. Aber auch „low-Level“ Netzwerkprogrammierung bleibt wichtig! Sie sollten mit allen Technologien vertraut sein Netzwerkprogrammierung 229