Clemens Düpmeier, 04/11/23 - 1 -
Forschungszentrum KarlsruheTechnik und Umwelt
Client-Server Kommunikation
Die Socket Schnittstelle
Clemens Düpmeier, 04/11/23 - 2 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 3 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 4 -
Forschungszentrum KarlsruheTechnik und Umwelt
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);
Clemens Düpmeier, 04/11/23 - 5 -
Forschungszentrum KarlsruheTechnik und Umwelt
Funktionsweise von accept()
Serverrechner Clientrechner
Serverprozess Clientprozess
Netzwerkschnittstelle Netzwerkschnittstelle
LAN
accept nach accept
Sockets
80 50167
Socket
Clemens Düpmeier, 04/11/23 - 6 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 7 -
Forschungszentrum KarlsruheTechnik und Umwelt
SMTP Protokoll$telnet mailhost.iai.fzk.de 25Trying 141.52.44.1...Connected to mailhost.iai.fzk.deEscape character is '^]'.220 mailhost.iai.fzk.de sendmail version 10.1 ready
at Wed, 6 May 2002 22:52:47 +0200HELO uisun7.iai.fzk.de250 mailhost.iai.fzk.de Hello uisun7.iai.fzk.deMAIL From: <[email protected]>250 Sender OK (verified)RCPT To: <duepmeier>250 Receiver OK (verified)DATA354 Start mail input; end with <CRLF>.<CRLF>Subject: Dann wollen wir mal SMTP testenHier beginnt die eigentliche Nachricht der MailDann können auch noch weitere Zeilen folgen,die allerdings mit einem Punkt auf einer einzelnen Zeile enden müssen..250 OKQUIT
Clemens Düpmeier, 04/11/23 - 8 -
Forschungszentrum KarlsruheTechnik und Umwelt
HTTP Protokoll - Ablauf
Client Server
GET /index.html HTTP/1.0If-Modified-Since: Saturday, 12-Dec-98, 12:34:56 GMT
Anfrage
HTTP/1.0 200 OKMIME-Version: 1.0Content-type: text/htmlContent-length: 123Last-Modified: Saturday, 12-Dec-98 12:34:56 GMT
<HTML>Hier beginnt die eigentliche HTML Datei...
Antwort
Clemens Düpmeier, 04/11/23 - 9 -
Forschungszentrum KarlsruheTechnik und Umwelt
Einige HTTP Clientkommandos
• GET Liefert ein Datei vom Server
• HEAD Liefert nur Dateiinformationen
• POST Sendet Daten (CGI) an den Server
• PUT Sendet komplette Dateien an
Server
• DELETE Löschte Datei vom Server
Clemens Düpmeier, 04/11/23 - 10 -
Forschungszentrum KarlsruheTechnik und Umwelt
Beispiele für HTTP Requests
GET / HTTP/1.0Connection: Keep-AliveUser-Agent: Mozilla/2.0 (Win95; I)Host: merlinAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
POST /cgi/4848 HTTP/1.0Referer: http://tecfa.unige.ch:7778/4848Connection: Keep-AliveUser-Agent: Mozilla/3.01 (X11; I; SunOS 5.4 sun4m)Host: tecfa.unige.ch:7778Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*Content-type: application/x-www-form-urlencodedContent-length: 42
name=Ulli&nachname=Ullenboom
Clemens Düpmeier, 04/11/23 - 11 -
Forschungszentrum KarlsruheTechnik und Umwelt
HTTP Server Statuscodes
• 1xx: Informierend, 2xx: Erfolgreich
• 3xx: Rückfrage, 4xx: Fehler beim Client
• 5xx: Fehler beim Server
• 200 OK 201 Created202 Accepted 204 No Content
• 300 Multiple Choices 301 Moved Permantly302 Moved Temporarily 304 Not Modified
• 400 Bad Request 401 Unauthorized403 Forbidden 404 Not Found
• 500 Internal Server E. 501 Not Implemented502 Bad Gateway 503 Service Unavailable
Clemens Düpmeier, 04/11/23 - 12 -
Forschungszentrum KarlsruheTechnik und Umwelt
Java Socket API
Clemens Düpmeier, 04/11/23 - 13 -
Forschungszentrum KarlsruheTechnik und Umwelt
InetAddress Klasse
InetAddress
static IntetAddress getByName() // erzeuge Adressobjektstatic InetAddress getLocalHost() // erzeuge Adressobjekt…Byte[] getAddress()…String getHostName() // gebe mir HostnameString getHostAddress() // gebe mir Adresse…
Clemens Düpmeier, 04/11/23 - 14 -
Forschungszentrum KarlsruheTechnik und Umwelt
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());
}}
Clemens Düpmeier, 04/11/23 - 15 -
Forschungszentrum KarlsruheTechnik und Umwelt
InetSocketAddress Klasse
InetSocketAddress (extends SocketAddress)
InetSocketAddress(String hostname, int port)InetSocketAddress(InetAddress address, int port)…InetAddress getAddress() // Hostteil als InetAdressgetHostName(): String // gebe mir HostnamegetPort(): String // gebe mir Portnummer…
Clemens Düpmeier, 04/11/23 - 16 -
Forschungszentrum KarlsruheTechnik und Umwelt
Client-Server Socketverbindungen in Java
ClientAnwendung
SocketObjekt
ServerApplikation
ServerSocketObjekt
SocketObjekt
new
accept()
return
new
connect()
Datenaustausch über das Netz
ServerSocketblockiert in accept()bis Client einenVerbindungsaufbaudurchgeführt hat
Die beiden Socketssind nun verbunden
Clemens Düpmeier, 04/11/23 - 17 -
Forschungszentrum KarlsruheTechnik und Umwelt
Socket KlasseSocket
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()
Clemens Düpmeier, 04/11/23 - 18 -
Forschungszentrum KarlsruheTechnik und Umwelt
ServerSocket Klasse
ServerSocket
ServerSocket()ServerSocket(int port)ServerSocket(int port, int backlog)...void bind(SocketAddress endpoint)Void bind(SocketAddress endpoint, int backlogSocket accept()void close()…int getLocalPort()InetAddress getInetAddress()…
Clemens Düpmeier, 04/11/23 - 19 -
Forschungszentrum KarlsruheTechnik und Umwelt
Beispiel TCP Serverapplikationpublic 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);}
}}
Clemens Düpmeier, 04/11/23 - 20 -
Forschungszentrum KarlsruheTechnik und Umwelt
Beispiel TCP Clientapplikationpublic 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");
} }}
Clemens Düpmeier, 04/11/23 - 21 -
Forschungszentrum KarlsruheTechnik und Umwelt
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";
...
Clemens Düpmeier, 04/11/23 - 22 -
Forschungszentrum KarlsruheTechnik und Umwelt
Client mit zeilenorientierter Kommunikationpublic 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"); }}
Clemens Düpmeier, 04/11/23 - 23 -
Forschungszentrum KarlsruheTechnik und Umwelt
Kommunikation über UDP
Applikation
DatagramSocketObjekt
DatagramPacket Objekt
(dp)
new
new
send/receive(dp)
dp Paket enthält neben Daten auch Ziel-IPund Zielportnummer
Clemens Düpmeier, 04/11/23 - 24 -
Forschungszentrum KarlsruheTechnik und Umwelt
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()…
Clemens Düpmeier, 04/11/23 - 25 -
Forschungszentrum KarlsruheTechnik und Umwelt
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()…
Clemens Düpmeier, 04/11/23 - 26 -
Forschungszentrum KarlsruheTechnik und Umwelt
Beispiel UDPClientpublic 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);
} }}
Clemens Düpmeier, 04/11/23 - 27 -
Forschungszentrum KarlsruheTechnik und Umwelt
Beispiel UDPServerpublic 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());}
}}
Clemens Düpmeier, 04/11/23 - 28 -
Forschungszentrum KarlsruheTechnik und Umwelt
Vorteile Low-Level Client Server
• effizient bzgl. Laufzeit
• überall verfügbar
• standardisiertes Interface
• für interne und externe Kommunikation verfügbar
Clemens Düpmeier, 04/11/23 - 29 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 30 -
Forschungszentrum KarlsruheTechnik und Umwelt
Client-Server Zugriff auf Datenbanken
(am Beispiel von JDBC)
Clemens Düpmeier, 04/11/23 - 31 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 32 -
Forschungszentrum KarlsruheTechnik und Umwelt
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");
}
Clemens Düpmeier, 04/11/23 - 33 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 34 -
Forschungszentrum KarlsruheTechnik und Umwelt
JDBC-ODBC Datenquelletry {
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
Clemens Düpmeier, 04/11/23 - 35 -
Forschungszentrum KarlsruheTechnik und Umwelt
JDBC-MSQL Datenquelletry {
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 Formjdbc:subprotocol:subname referenziert
Clemens Düpmeier, 04/11/23 - 36 -
Forschungszentrum KarlsruheTechnik und Umwelt
DriverManager KlasseDriverManager
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 Protokollverkehrstativ void println(String message)// Ausgabe von Messagestrings auf Logging Ausgang…
Clemens Düpmeier, 04/11/23 - 37 -
Forschungszentrum KarlsruheTechnik und Umwelt
Verschiedene Statement-Objekte
• Statement Objekt erzeugen
Statement stmnt = con.createStatement()
• PreparedStatement Objekt erzeugen
PreparedStatement pstmnt = con.prepareStatement("...")
• CallableStatement Objekt erzeugen
CallableStatement cstmnt = con.prepareCall("...")
Clemens Düpmeier, 04/11/23 - 38 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 39 -
Forschungszentrum KarlsruheTechnik und Umwelt
Datenbankabfrage über Statement Objekt durchführen
try {// Statement Objekt über Connection Objekt erzeugenStatement stmt = con.createStatement();
// SQL Abfrage als String definierenString query = "SELECT cityName, Population, Temperature" +
" FROM cityTable";
// Abfrage durch Aufruf von Methode executeQuery() durchführenResultSet rs = stmt.executeQuery(query);
// hier nun Ergebnisse durch Auswertung von ResultSet // verarbeiten
Clemens Düpmeier, 04/11/23 - 40 -
Forschungszentrum KarlsruheTechnik und Umwelt
ResultSet abarbeiten
try {...
// Abfrage durch Aufruf von Methode executeQuery() durchführenResultSet 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 ...
Clemens Düpmeier, 04/11/23 - 41 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 42 -
Forschungszentrum KarlsruheTechnik und Umwelt
Daten in Datenbank einfügen
try {// Statement Objekt über Connection Objekt erzeugenStatement stmt = con.createStatement();
// SQL Statement zum Einfügen von Daten definierenString sqlstring = "INSERT INTO cityTable " +
"(cityName, Population, Temperature) " +"VALUES (Karlsruhe, 275000, 15)";
// Einfügen mit Aufruf der Methode executeUpdate() durchführenint affectedRows = stmt.executeUpdate(sqlstring);
Clemens Düpmeier, 04/11/23 - 43 -
Forschungszentrum KarlsruheTechnik und Umwelt
Client-Server Architekturformen
Präsentationslogik Präsentationslogik Präsentationslogik Präsentationslogik Präsentationslogik
Präsentationslogik
Anwendungslogik
Anwendungslogik
Anwendungslogik
Anwendungslogik
Anwendungslogik
Anwendungslogik
Datenbanklogik
Datenbanklogik
Datenbanklogik
Datenbanklogik
Datenbanklogik
Server
Client
VerteiltePräsentation
EntferntePräsentation
VerteilteAnw.logik
EntfernteDatenbank
VerteilteDatenbank
Datenbanklogik
Clemens Düpmeier, 04/11/23 - 44 -
Forschungszentrum KarlsruheTechnik und Umwelt
2-Tier Applikation mit JDBC Datenzugriff
Java Applikation
JDBC
DBMS
Client Maschine
Rechner mit Datenbank
proprietäres Protokoll zu Datenbank
Clemens Düpmeier, 04/11/23 - 45 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Clemens Düpmeier, 04/11/23 - 46 -
Forschungszentrum KarlsruheTechnik und Umwelt
Klassische Multitier Architektur
Präsentationsschicht
Applikationslogik
Datenlogik Datenlogik
Clemens Düpmeier, 04/11/23 - 47 -
Forschungszentrum KarlsruheTechnik und Umwelt
Klassische 3-Tier Architektur mit JDBC
Applikationsserver
JDBC
DBMS
Client Maschine
Rechner mit Datenbank
proprietäres Protokoll zu Datenbank
Clientz.B. Browser
HTTP, RMI, CORBA
Server mit Middle-Tier(Applikationslogik)
Clemens Düpmeier, 04/11/23 - 48 -
Forschungszentrum KarlsruheTechnik und Umwelt
4-Tier Architektur mit JDBC
Applikationsserver
JDBC
DBMS
Client Maschine
Rechner mit Datenbank
proprietäres Protokoll zu Datenbank
Clientz.B. Browser
RMI, CORBA
Server mit (Applikationslogik)
WebserverServlet
HTTP
Clemens Düpmeier, 04/11/23 - 49 -
Forschungszentrum KarlsruheTechnik und Umwelt
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
Top Related