Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, 11.02.2014- 1 - Client-Server Kommunikation Die Socket Schnittstelle.

Ähnliche Präsentationen


Präsentation zum Thema: "Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, 11.02.2014- 1 - Client-Server Kommunikation Die Socket Schnittstelle."—  Präsentation transkript:

1 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Client-Server Kommunikation Die Socket Schnittstelle

2 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Kommunikation über Socket API Rechner kommunizieren heutzutage hauptsächlich über TCP/IP Netze (Inter-/Intranets) Die in C geschriebene Socket-API ist die (unterste) Betriebssystemschnittstelle zur Kommunikation über TCP/IP Netze Sockets sind in Analogie zum Umgang mit Dateidatenströmen realisiert

3 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Wichtige Funktionen der Socket API socket- Erzeugen eines Sockets bind- Binden einer Adresse an einen Socket accept-Verbindungswunsch akzeptieren connect-Verbindung anfordern read-Lesen vom Socket write-Schreiben auf Socket

4 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Server-Client Kommunikation Server (passiv) Client (aktiv) s=socket(...); bind(/* address */); listen(s,length); for (;;) { new_sock=accept(/*...*/); if (fork() == 0) handle(new_sock); } s=socket(...); /* no bind */ connect(s, /* address */); talk_with_server(s);

5 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Funktionsweise von accept() ServerrechnerClientrechner ServerprozessClientprozess Netzwerkschnittstelle LAN acceptnach accept Sockets Socket

6 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Eigenschaften der Socket Schnittstelle Unterste Schnittstelle zum Betriebssystem Synchronisation der Kommunikation liegt voll beim Anwender Fehlerbehandlung liegt ebenfalls beim Anwender Nicht binär transparente Datenübertragung Nicht objekt-orientiert

7 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, SMTP Protokoll $telnet mailhost.iai.fzk.de 25 Trying Connected to mailhost.iai.fzk.de Escape character is '^]'. 220 mailhost.iai.fzk.de sendmail version 10.1 ready at Wed, 6 May :52: HELO uisun7.iai.fzk.de 250 mailhost.iai.fzk.de Hello uisun7.iai.fzk.de MAIL From: 250 Sender OK (verified) RCPT To: 250 Receiver OK (verified) DATA 354 Start mail input; end with. Subject: Dann wollen wir mal SMTP testen Hier beginnt die eigentliche Nachricht der Mail Dann können auch noch weitere Zeilen folgen, die allerdings mit einem Punkt auf einer einzelnen Zeile enden müssen OK QUIT

8 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, HTTP Protokoll - Ablauf ClientServer GET /index.html HTTP/1.0 If-Modified-Since: Saturday, 12-Dec-98, 12:34:56 GMT Anfrage HTTP/ OK MIME-Version: 1.0 Content-type: text/html Content-length: 123 Last-Modified: Saturday, 12-Dec-98 12:34:56 GMT Hier beginnt die eigentliche HTML Datei... Antwort

9 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Einige HTTP Clientkommandos GET Liefert ein Datei vom Server HEADLiefert nur Dateiinformationen POSTSendet Daten (CGI) an den Server PUTSendet komplette Dateien an Server DELETELöschte Datei vom Server

10 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Beispiele für HTTP Requests GET / HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/2.0 (Win95; I) Host: merlin Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* POST /cgi/4848 HTTP/1.0 Referer: Connection: Keep-Alive User-Agent: Mozilla/3.01 (X11; I; SunOS 5.4 sun4m) Host: tecfa.unige.ch:7778 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* Content-type: application/x-www-form-urlencoded Content-length: 42 name=Ulli&nachname=Ullenboom

11 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, HTTP Server Statuscodes 1xx: Informierend, 2xx: Erfolgreich 3xx: Rückfrage, 4xx: Fehler beim Client 5xx: Fehler beim Server 200OK201Created 202 Accepted204No Content 300 Multiple Choices301 Moved Permantly 302 Moved Temporarily304Not Modified 400 Bad Request401Unauthorized 403 Forbidden404Not Found 500Internal Server E.501Not Implemented 502Bad Gateway503Service Unavailable

12 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Java Socket API

13 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, InetAddress Klasse InetAddress static IntetAddress getByName() // erzeuge Adressobjekt static InetAddress getLocalHost() // erzeuge Adressobjekt … Byte[] getAddress() … String getHostName() // gebe mir Hostname String getHostAddress() // gebe mir Adresse …

14 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Beispiel Nutzung von InetAddress public class WhoAmI { public static void main(String args[]) throws Exception { InetAddress myAddress=InetAddress.getLocalHost(); System.out.println("Hostname: " + myAddress.getHostName()); System.out.println("IP Adresse: " + myAddress.getHostAddress()); }

15 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, InetSocketAddress Klasse InetSocketAddress (extends SocketAddress) InetSocketAddress(String hostname, int port) InetSocketAddress(InetAddress address, int port) … InetAddress getAddress()// Hostteil als InetAdress getHostName(): String // gebe mir Hostname getPort(): String// gebe mir Portnummer …

16 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Client-Server Socketverbindungen in Java Client Anwendung Socket Objekt Server Applikation ServerSocket Objekt Socket Objekt new accept() return new connect() Datenaustausch über das Netz ServerSocket blockiert in accept() bis Client einen Verbindungsaufbau durchgeführt hat Die beiden Sockets sind nun verbunden

17 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Socket Klasse Socket Socket() Socket(String host, int port) Socket(InetAddress host, int port)... void close() void connect(SocketAddress endpoint) Void connect(SocketAddress endpoint, int timeout) … int getPort() InetAddress getInetAddress() … InputStream getInputStream() OutputStream getOutputStream()

18 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, ServerSocket Klasse ServerSocket ServerSocket() ServerSocket(int port) ServerSocket(int port, int backlog)... void bind(SocketAddress endpoint) Void bind(SocketAddress endpoint, int backlog Socket accept() void close() … int getLocalPort() InetAddress getInetAddress() …

19 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Beispiel TCP Serverapplikation public class MultServer { public static void main(String args[]) throws Exception { ServerSocket server=new ServerSocket(3141); while (true) { Socket client=server.accept(); InputStream in =client.getInputStream(); OutputStream out=client.getOutputStream(); int firstNumber=in.read(); int secondNumber=in.read(); out.write(firstNumber * secondNumber); } }

20 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Beispiel TCP Clientapplikation public class MultClient { public static void main(String args[]) { try { Socket server = new Socket("Hostname", 3141); InputStream in = server.getInputStream(); OutputStream out = server.getOutputStream(); out.write(4);out.write(5); int result=in.read(); System.out.println("4 * 5 = " +result); } catch (IOException e) { System.out.println("Fehler bei Kommunikation"); } }

21 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Gepufferte Ein-/Ausgabe über Sockets Socket t = new Socket(...);.... BufferedReader in = new BufferedReader( new InputStreamReader(t.getInputStream())); PrintStream os = new PrintStream(t.getOutputStream());... in.readLine();... os.println("Irgendwelche Strings + Objekte mit toString() ausgeben";...

22 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Client mit zeilenorientierter Kommunikation public class PingClient { public static void main(String args[]) throws Exception { Socket t = new Socket(args[0], 7); BufferedReader in = new BufferedReader( new InputStreamReader(t.getInputStream())); PrintStream out = new PrintStream(t.getOutputStream()); String test= "Hallo aus Karlsruhe, vom " + new Date(); out.println(test); String antwort=in.readLine(); if (antwort.equals(test)) System.out.println("Server lebt"); else System.out.println("Server ist nicht erreichbar"); }

23 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Kommunikation über UDP Applikation DatagramSocket Objekt DatagramPacket Objekt (dp) new send/receive(dp) dp Paket enthält neben Daten auch Ziel-IP und Zielportnummer

24 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, DatagramSocket Klasse DatagramSocket DatagramSocket() DatagrammSocket(int port) DatagrmSocket(int port, InetAddress laddr)... void bind(SocketAddress laddress) void close() void receive(DatagramPacket p) void send(DatagramPacket p) … int getLocalPort() InetAddress getLocalAddress() …

25 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, DatagramPacket Klasse DatagramPacket DatagramPacket(byte[] buf, int length) DatagrammSocket(byte[] buf, int length, InetAddress addr, int port)... InetAddress getAddress() void getPort() byte[] getData() void setData(byte[] buf) int getLength() …

26 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Beispiel UDPClient public class UDPClient { public static void main(String args[]) throws Exception { DatagramPacket packet; DatagramSocket dSocket = new DatagramSocket(); InetAddress serverAddress=InetAddress.getByName("ServerName"); while (true) { String s = new Date().toString(); packet = new DatagramPacket(s.getBytes(), s.length(), serverAddress, 4711); dSocket.send(packet); System.out.println("Paket " + packet + " abgeschickt"); Thread.sleep(1000); }

27 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Beispiel UDPServer public class UDPServer { public static void main(String args[]) throws Exception { byte data[] = new byte[1024]; DatagramPacket packet; DatagramSocket socket = new DatagramSocket(4711); while (true) { packet=new DatagramPacket(data, data.length); socket.receive(packet); InetAddress address = packet.getAddress(); int port = packet.getPort(); System.out.println("Paket von " + packet.getAddress() + "am Port " + packet.getPort() + " erhalten"); insertIntoDatabase(packet.getData()); } }}

28 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Vorteile Low-Level Client Server effizient bzgl. Laufzeit überall verfügbar standardisiertes Interface für interne und externe Kommunikation verfügbar

29 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Nachteile Low-Level Kommunikation zu komplex bzgl. der Kommunikationsdetails Synchronisation/Fehlerbehandlung liegt voll beim Anwendungsprogrammierer nicht binär-transparent ohne Arbeit Clients müssen wissen, wo Server sind Mix von Applikationslogik + Netzwerktransportlogik

30 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Client-Server Zugriff auf Datenbanken (am Beispiel von JDBC)

31 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Was ist die JDBC API eigentlich Produktname, aber oft übersetzt als Java Database Connectivity API API zum Zugriff auf Datenquellen, die eine tabellen- artige Struktur haben Beispiele für Datenquellen sind: –relationale Datenbanken –Dateien mit tabellenartiger Struktur –ODBC Datenquellen unter Windows

32 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Typisches Nutzungsschema Treiber für spezielle Datenquelle laden Verbindung mit Datenquelle herstellen Abfrage machen oder Update Operation durchführen Resultate der Abfrage bearbeiten Connection con = DriverManager.getConnection( "jdbc:myDriver:wombat", "myLogin", "myPassword"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); }

33 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Typen von JDBC Treibern JDBC-ODBC Bridge Treiber –nutzt die ODBC API, um auf ODBC Datenquellen zuzugreifen Native-API Java Treiber –ruft von Java aus Native Datenbank API auf Netz-Protokoll All-Java Treiber –benutzt Netz-Protokoll, um auf Middleware Server zuzugreifen, der seinerseits auf Datenbank zugreift Native Protocol All-Java Treiber –direkter Aufruf des Datenbankservers über DBMS Netzprotokoll

34 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, JDBC-ODBC Datenquelle try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (Exception e) { System.out.println("Konnte JDBC-ODBC Bridge Treiber nicht laden"); return; } Connection con = DriverManager.getConnection( "jdbc:odbc:myDatabase", "myLogin", "myPassword"); Treiber lassen sich mit Class.forName laden Oben wird im JDK enthaltener JDBC-OBDC Bridge Treiber geladen ODBC Datenquellen werden mit jdbc:odbc:Name-der-Datenquelle referenziert

35 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, JDBC-MSQL Datenquelle try { Class.forName("com.imaginary.sql.msql.MsqlDriver"); } catch (Exception e) { System.out.println("Konnte JDBC Treiber nicht laden"); return; } Connection con = DriverManager.getConnection( "jdbc:msql://machine-name:port#/database-name", "myLogin", "myPassword"); Treiber lassen sich mit Class.forName laden Oben Treiber für mSQL Datenbank geladen Datenquellen werden allgemeiner durch URL's der Form jdbc:subprotocol:subname referenziert

36 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, DriverManager Klasse DriverManager static Connection getConnection(String url) static Connection getConnection(String url, Properties info) static Connection getConnection(String url, String user, String password) // verschiedene Arten Verbindung aufzubauen... static void registerDriver(Driver driver) // wird von Treibern zum Registrieren verwendet... static void setLogWriter(PrintWriter out) // Loggen von Informationen über JDBC Protokollverkehr stativ void println(String message) // Ausgabe von Messagestrings auf Logging Ausgang …

37 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Verschiedene Statement-Objekte Statement Objekt erzeugen Statement stmnt = con.createStatement() PreparedStatement Objekt erzeugen PreparedStatement pstmnt = con.prepareStatement("...") CallableStatement Objekt erzeugen CallableStatement cstmnt = con.prepareCall("...")

38 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Verwendung der verschiedenen Statement Objektklassen Statement für einfache Operationen PreparedStatement Objekte verwenden, wenn SQL Abfragen öfters wiederholt werden CallableStatement Objekte nutzen, um StoredProcedures auszuführen

39 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Datenbankabfrage über Statement Objekt durchführen try { // Statement Objekt über Connection Objekt erzeugen Statement stmt = con.createStatement(); // SQL Abfrage als String definieren String query = "SELECT cityName, Population, Temperature" + " FROM cityTable"; // Abfrage durch Aufruf von Methode executeQuery() durchführen ResultSet rs = stmt.executeQuery(query); // hier nun Ergebnisse durch Auswertung von ResultSet // verarbeiten

40 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, ResultSet abarbeiten try {... // Abfrage durch Aufruf von Methode executeQuery() durchführen ResultSet rs = stmt.executeQuery(query); while (rs.next()) { System.out.println("Stadt: " + rs.getString("cityName")); System.out.println("Anzahl Einwohner: " + rs.getLong("Population")); System.out.println("Durchschnittstemperatur: " + rs.getInt("Temperature")); } } catch...

41 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Zugriffsmethoden und SQL Datentypen getInt()INTEGER getLong()BIG INT getFloat()REAL getDouble()FLOAT getBignum()DECIMAL getBigDecimal()NUMBER getBoolean()BIT getString()VARCHAR getString()CHAR getAsciiStream()LANGVARCHAR getDate()DATE getTime()TIME getTimestamp()TIME STAMP getObject()jeder Typ

42 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Daten in Datenbank einfügen try { // Statement Objekt über Connection Objekt erzeugen Statement stmt = con.createStatement(); // SQL Statement zum Einfügen von Daten definieren String sqlstring = "INSERT INTO cityTable " + "(cityName, Population, Temperature) " + "VALUES (Karlsruhe, , 15)"; // Einfügen mit Aufruf der Methode executeUpdate() durchführen int affectedRows = stmt.executeUpdate(sqlstring);

43 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Client-Server Architekturformen Präsentationslogik Anwendungslogik Datenbanklogik Server Client Verteilte Präsentation Entfernte Präsentation Verteilte Anw.logik Entfernte Datenbank Verteilte Datenbank Datenbanklogik

44 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Tier Applikation mit JDBC Datenzugriff Java Applikation JDBC DBMS Client Maschine Rechner mit Datenbank proprietäres Protokoll zu Datenbank

45 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Multitier Architekturen Bei Multitier Architekturen ist die Software eines Gesamtsystems in mehrere Schichten zerlegt Typisch ist eine 3-Tier Architektur mit den Schichten Datenbanklogik, Anwendungslogik und Präsentationslogik Die einzelnen Schichten sind durch Interfaces voneinander getrennt und gegebenenfalls durch verteilte Objekttechnologie auf verschiedene Rechner verteilt

46 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Klassische Multitier Architektur Präsentationsschicht Applikationslogik Datenlogik

47 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Klassische 3-Tier Architektur mit JDBC Applikationsserver JDBC DBMS Client Maschine Rechner mit Datenbank proprietäres Protokoll zu Datenbank Client z.B. Browser HTTP, RMI, CORBA Server mit Middle-Tier (Applikationslogik)

48 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Tier Architektur mit JDBC Applikationsserver JDBC DBMS Client Maschine Rechner mit Datenbank proprietäres Protokoll zu Datenbank Client z.B. Browser RMI, CORBA Server mit (Applikationslogik) Webserver Servlet HTTP

49 Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, Middleware Mittelschicht zwischen Teilen einer Verteilten Applikation verdeckt Low-Level Schnittstellen – insbesondere untere Kommunikationsschicht vereinfacht das Schreiben verteilter Systeme mit Mehrschicht-Architektur erlaubt es Anwendungen, sich auf die Applikationsdetails zu konzentrieren


Herunterladen ppt "Forschungszentrum Karlsruhe Technik und Umwelt Clemens Düpmeier, 11.02.2014- 1 - Client-Server Kommunikation Die Socket Schnittstelle."

Ähnliche Präsentationen


Google-Anzeigen