Client/Server-Programmierung



Ähnliche Dokumente
Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung. CORBA: Schritt-für-Schritt Anleitung (Mini HOWTO)

Client/Server-Programmierung

Verteilte Systeme. SoSe Universität Siegen Tel.: 0271/ , Büro: H-B Stand: 11.

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql

Client/Server-Programmierung

CORBA-Konzept. Ziele. Common Object Request Broker Architecture CORBA. Plattformunabhängige Kommunikation Transparente Verteilung von Objekten

Parallele und Verteilte Systeme

Mobile und Verteilte Datenbanken

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

Java RMI Remote Method Invocation

Rechnernetze II WS 2012/2013. Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/ , Büro: H-B 8404

CORBA. Beispiel einer Middleware-Plattform. Christian Fass WS 2013/14 Software Engineering: Basistechnologien

Modul Software Komponenten 10 Komponentenarchitektur

Java-Programmierung. Remote Method Invocation - RMI

COMMON OBJECT REQUEST BROKER ARCHITECTURE. Dmytro Pyvovar Otto-von-Guericke Universität Magdeburg

CORBA. Systemprogrammierung WS

Rechnernetze I. Rechnernetze I. 0 Organisation SS Universität Siegen rolanda.dwismuellera@duni-siegena.de Tel.: 0271/ , Büro: H-B 8404

Verteilte Systeme. Verteilte Objektorientierte Systeme II. Prof. Dr. Oliver Haase

CORBA. Eine kurze Einführung. Common Object Request Broker Architecture. Ying Lu

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Client/Server-Programmierung

Client/Server-Programmierung

Client/Server-Programmierung

3. Stored Procedures und PL/SQL

Remote Method Invocation

Web Services stellen eine Integrationsarchitektur dar, die die Kommunikation zwischen verschiedenen Anwendungen

Übungen zu Softwaretechnik

Themen. Web Service - Clients. Kommunikation zw. Web Services

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Einführung: Verteilte Systeme - Remote Method Invocation -

Hello World from CORBA

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

6.9 Java Server Pages

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Szenario 3: Service mit erweiterter Schnittstelle

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel

VS Praktikum 03 Konzept

ObjectBridge Java Edition

Datenbank und Informationssysteme

Oracle: Abstrakte Datentypen:

Der lokale und verteilte Fall

Programmieren II. Beispiele für RDBMS. Relationale Datenbanken. Datenbanken SQL. Dr. Klaus Höppner JDBC. Hochschule Darmstadt SS 2008

Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn

3.2 Der CORBA-Standard Common Object Request Broker Architecture

SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter

Webbasierte Informationssysteme

Webservices. 1 Einführung 2 Verwendete Standards 3 Web Services mit Java 4 Zusammenfassung. Hauptseminar Internet Dienste

Technische Beschreibung: EPOD Server

Wiederholung: Beginn

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Client/Server-Systeme

Verteidigung gegen SQL Injection Attacks

-Testen verteilter Anwendungen

2. Datenbank-Programmierung

Beispiel: DB-Mock (1/7)

Java Database Connectivity-API (JDBC)

explizite, orthogonale Interaktion Verteilte Anwendungen und Middleware uniforme / nicht-uniforme Interaktion implizite, nicht-orthogonale Interaktion

11.1 Indirektes Binden (3) 11.1 Indirektes Binden (4) Objektadapterkonfiguration. Unmittelbarer Vorteil des indirekten Bindens

Java Database Connectivity-API (JDBC)

Gesicherte Prozeduren

Java und Datenbanksysteme Datenbankanbindung mit JDBC

JDBC. Allgemeines ODBC. java.sql. Beispiele

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Datenbankentwurf & Datenbankzugriff mit JDBC. Georg Köster Sven Wagner-Boysen

Kapitel 10. JDBC und SQLJ. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Internetanwendungstechnik (Übung)

Zustandsgebundene Webservices

7 Praktische Aspekte (Wie mache ich...)

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Remote Method Invocation

Rechnernetze Praktikum

Einführung in die Programmierung

7.1.5 Java RMI Remote Method Invocation ( (

Mobile und Verteilte Datenbanken

Datenmanagement in Android-Apps. 16. Mai 2013

SQL (Structured Query Language) Schemata Datentypen

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

Universität Stuttgart Abteilung Anwendersoftware Steht für Embedded SQL in Java. - Java-Methoden als SQL Stored-Procedures

Transkript:

Client/Server-Programmierung WS 2014/2015 Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) i Inhaltsverzeichnis 0 Organisation 2 1 Grundlagen: Wiederholung 20 1.1 Architekturmodelle.................... 22 1.2 Zeit und Zustand in verteilten Systemen......... 28 1.3 Middleware........................ 33 1.3.1 Kommunikationsorientierte Middleware...... 35 1.3.2 Anwendungsorientierte Middleware........ 42 1.4 Java RMI......................... 45 1.4.1 Hello World mit Java RMI............. 46 1-1

1.4.2 Parameterübergabe................ 59 2 Java Database Connectivity (JDBC) 62 2.1 Überblick......................... 63 2.2 Relationale Datenbanken und SQL............ 64 2.3 Architektur von JDBC................... 67 2.4 Ein Beispiel........................ 72 2.5 Details zu JDBC..................... 75 2.6 Zusammenfassung.................... 84 3 CORBA 85 3.1 Einführung........................ 88 3.2 CORBA Architektur.................... 89 1-2 3.2.1 Object Management Architecture (OMA)..... 89 3.2.2 Common Object Request Broker Architecture (COR- BA)........................ 93 3.2.3 CORBA-Dienste.................. 100 3.3 Hello World mit CORBA................. 103 3.4 CORBA im Detail..................... 120 3.4.1 OMG IDL und Java-Mapping........... 120 3.4.2 Name Service................... 142 3.4.3 Factories..................... 146 3.4.4 Delegation und Tie-Klassen............ 150 3.4.5 Statische und dynamische Aufrufe......... 155 3.4.6 Portable Object Adapter (POA).......... 158 1-3

3.4.7 GIOP, IIOP und IOR................ 167 3.4.8 Implementation Repository (IMR)......... 172 3.4.9 Interface Repository (IR)............. 176 3.4.10 Sicherheit.................... 179 3.5 Zusammenfassung.................... 180 4 RMI / IIOP 181 5 Java Komponenten-Modelle 191 5.1 Komponenten-Modelle.................. 193 5.2 Komponentenmodelle in Java EE............. 199 5.3 JavaBeans........................ 201 5.3.1 Ereignisse..................... 210 1-4 5.3.2 Properties..................... 217 5.3.3 Persistenz..................... 221 5.3.4 Introspektion................... 222 5.3.5 Zusammenfassung................ 225 5.4 Enterprise Java Beans (EJB 3.0)............. 226 5.4.1 Arten von EJBs.................. 231 5.4.2 Anatomie einer EJB-Anwendung......... 233 5.4.3 Einschub: Java Annotationen........... 236 5.4.4 Beispiel Hello World................ 240 5.4.5 Einschub: OpenEJB................ 245 5.4.6 Dienste des EJB-Containers........... 252 5.4.7 Der Deployment-Deskriptor ejb-jar.xml..... 255 1-5

5.4.8 Session Beans: Details.............. 262 5.4.9 Entities: Details.................. 276 5.4.10 Transaktionen.................. 296 5.4.11 Zusammenfassung................ 304 6 Servlets und JSP 305 6.1 Servlets......................... 307 6.1.1 Grundlagen.................... 308 6.1.2 Einschub: Web-Server im Labor.......... 311 6.1.3 Beispiel: Hello-World Servlet........... 313 6.1.4 Lebenszyklus eines Servlets........... 319 6.1.5 Wichtige Klassen und Methoden......... 320 1-6 6.1.6 Sitzungs-Management.............. 321 6.2 Java Server Pages (JSP)................. 325 6.2.1 Spezielle Tags für JSP.............. 326 6.2.2 Vordefinierte Variablen.............. 329 6.2.3 Beispiele..................... 330 6.2.4 JSP Direktiven.................. 333 6.2.5 JSP und Java Beans............... 334 6.3 Zusammenfassung.................... 335 7 Web Services 336 7.1 Einführung........................ 339 7.2 Web-Service-Standards................. 342 1-7

7.2.1 XML (Extensible Markup Language)........ 343 7.2.2 SOAP....................... 353 7.2.3 WSDL....................... 366 7.2.4 Nutzung von SOAP und WSDL.......... 381 7.3 Web-Services und EJB.................. 383 7.4 Web Services mit Axis2................. 384 7.4.1 Technisches zu Axis2............... 385 7.4.2 Beispiel: Hello-World mit Axis2.......... 387 7.4.3 Details zu den Axis2-Werkzeugen......... 392 7.4.4 Sitzungs-Management mit Axis2......... 402 7.4.5 Axis2 Module................... 410 7.5 Web Services und Sicherheit............... 418 1-8 7.5.1 Nutzung von Tomcat6 mit TLS/SSL........ 419 7.5.2 Passwort-Authentifizierung mit Tomcat6 und Axis2 421 7.5.3 Nutzung der WS Security Paradigmen...... 423 7.6 Zusammenfassung.................... 430 8 Weitere Client/Server-Technologien 431 8.1 Technologien zur Netzwerkprogrammierung....... 432 8.2 Technologien für dynamische WWW-Seiten....... 434 8.3 Microsoft.Net und DCOM................ 436 1-9

Client/Server-Programmierung WS 2014/2015 0 Organisation Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 2 Zu meiner Person Studium der Informatik an der Techn. Univ. München dort 1994 promoviert, 2001 habilitiert Seit Apr. 2004 Prof. für Betriebssysteme und verteilte Systeme an der Univ. Siegen Forschung: Beobachtung, Analyse und Steuerung paralleler und verteilter Systeme Mentor für die Bachelor-/Master-Studiengänge Informatik mit Nebenfach/Vertiefung Mathematik e-mail: rolanda.dwismuellera@duni-siegena.de Tel.: 0271/740-4050 Büro: H-B 8404 Sprechstunde: Mo., 14:15-15:15 Uhr Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 3

Zur Fachgruppe Betriebssysteme / verteilte Systeme Andreas Hoffmann andreas.hoffmann@uni siegen.de 0271/740 4047 H B 8405 Elektronische Prüfungs und Übungssysteme an Hochschulen IT Sicherheit Webtechnologien Mobile Anwendungen Julia Dauwe julia.dauwe@uni siegen.de 0271/740 2967 H B 8405 Context Aware Systems Bring Your Own Device (BYOD) Mobile Anwendungen und Datenschutz Adrian Kacso adrian.kacso@uni siegen.de 0271/740 3966 H B 8406 Kommunikationsprotokolle für drahtlose Sensornetze Kommunikation und Koordination in verteilten Systemen Betriebssysteme (RT, Embedded) Alexander Kordes alexander.kordes@uni siegen.de 0271/740 4011 H B 8407 Automotive Electronics Fahrzeugnetzwerke Robustheit, Fehleranalyse, Fehlerdetektion Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 4 Lehrangebot Vorlesungen/Praktika Rechnernetze I, 5 LP (jedes SS) Rechnernetze Praktikum, 5 LP (jedes WS) Rechnernetze II, 5 LP (jedes SS) Betriebssysteme I, 5 LP (jedes WS) Parallelverarbeitung, 5 LP (jedes WS) Verteilte Systeme, 5 LP (jedes SS) (wird auch als Betriebssysteme II anerkannt) Client/Server-Programmierung, 5 LP (jedes WS) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 5

Lehrangebot... Projektgruppen z.b. Werkzeug zur Algorithmen-Visualisierung z.b. Infrastruktur zum Analysieren des Android Market Abschlussarbeiten (Bachelor, Master, Diplom) Themengebiete: Mobile Plattformen (ios, Android), Sensornetze, Parallelverarbeitung, Monitoring,... z.b. Statische Analyse des Informationsflusses in Android Apps Seminare Themengebiete: Webtechnologien, Sensornetze, Android,... Ablauf: Blockseminare 30 Min. Vortrag, 5000 Worte Ausarbeitung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 6 Zur Vorlesung Vorlesung mit Praktikum: 2+2 SWS, 5 LP (4 bzw. 8 LP möglich) Termine: Fr., 12:30-14:00, H-F 116 (Vorl.) bzw. H-A 4111 (Prakt.) Mo., 16:00-17:30, H-B 8409/10 (Vorl.) bzw. H-A 4111 (Prakt.) Information, Folien und Ankündigungen: http://www.bs.informatik.uni-siegen.de/lehre/ ws1415/csp Folienskript vollständig verfügbar Folien werden ggf. leicht aktualisiert und i.d.r. spätestens am Tag vor der Vorlesung bereitgestellt (als PDF) Codebeispiele finden Sie lokal auf den Laborrechnern unter /home/wismueller/csp Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 7

Lernziele Wissen um die Grundlagen, Techniken, Methoden und Werkzeuge der verteilten Programmierung insbesondere objektorientierte und serviceorientierte Middleware, sowie Komponenten Praktische Erfahrungen in der Programmierung von Client/Server-Anwendungen Praktische Erfahrungen im Umgang mit unterschiedlicher Middleware Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 8 Methodik Vorlesung: Grundlagen theoretisches Wissen zur verteilten Systemen, Middleware und Komponenten Code-Beispiele und Tutorials Praktikum: praktische Anwendung Nachvollziehen der Tutorials eigenständige Programmierarbeit praktische Erfahrung, auch: Aufwerfen von Fragen Realisierung einer kleinen Börsenanwendung mit RMI, CORBA, EJB und Web Services zusätzlich kleinere einführende und weiterführende Aufgaben Programmierung ausschließlich in Java Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 9

Prüfung Mündliche Prüfung Dauer ca. 40 min. Stoff: Vorlesung und Praktikum! Prüfung erstreckt sich auch auf die praktischen Arbeiten aktive Teilnahme am Praktikum ist Zulassungs-Voraussetzung! Anmeldung: Terminabsprache im Sekretariat bei Fr. Baule per Email (andreaa.dbaulea@duni-siegena.de) oder persönlich (H-B 8403, nachmittags) Anmeldung beim Prüfungsamt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 10 Organisatorisches zum Praktikum Benutzerordnung und Kartenschlüsselantrag: http://www.bs.informatik.uni-siegen.de/lehre/ ws1415/csp Abgabe bis bis 24.10. bei Fr. Baule, H-B 8403 (nachmittags) oder in der Vorlesung Praktikumsbeginn: nächste Woche Einführung in die Rechner-Umgebung (Linux) Ausgabe der Kennungen Benutzungsvereinbarung im WWW beachten! Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 11

Rechnerumgebung im Labor H-A 4111 Linux-PCs, privates IP-Netz, beschränkter Internet-Zugang Fachgruppennetz (bs.informatik.uni siegen.de) / Internet Server Cluster bvsclk01 bvsclk02 bvsclk03 bvsclk04 (je 2 x XEON, je 2 Cores, 2,66 GHz, 4 GB) http bsclk01 bsclk02 bsclk03 bsclk04 ftp https (lab.bvs) Proxy 00 11 00 11 ssh (nur pubkey) Labornetz 1 Gbit/s 13 Arbeitsplätze (Intel, 2 Cores mit HT, 6 Arbeitsplätze (Intel, 4 Cores, 3,3 GHz, 4 GB) 3,2 GHz, 4 GB) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 12... 00 11 00 11 bslab01 06,11 12,14 18 00 11 00 11 File Server... 00 11 00 11 bslab07 10,13,19 Inhalt der Vorlesung Grundlagen: Wiederholung Architekturmodelle Zeit und Zustand in verteilten Systemen Middleware Java RMI Java Datenbank-Schnittstelle JDBC CORBA Architektur, Dienste, IDL,... Java Komponenten-Modelle Einführung Java Beans Enterprise Java Beans Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 13

Inhalt der Vorlesung... Servlets und JSP Web Services XML, SOAP, WSDL,... Axis2 Weitere Client/Server-Technologien u.a..net, DCOM Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 14 Zeitplan der Vorlesung (vorläufig!) Datum Montags-Termin Datum Freitags-Termin 06.10. 10.10. V: Grundlagen, Wdh. 13.10. V: Grundlagen, Wdh. 17.10. V: JDBC 20.10. P: RMI 24.10. V: CORBA 27.10. V:CORBA 31.10. V: CORBA 03.11. P: RMI 07.11. V: Java Beans 10.11. P: RMI 14.11. V: EJB 17.11. P: CORBA 21.11. V: EJB 24.11. P: CORBA 28.11. V: EJB 01.12. P: CORBA 05.12. V: Servlets, JSP 08.12. P: CORBA 12.12. V: Web Services 15.12. P: EJB 19.12. V: (ggf. P: EJB) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 15

Zeitplan der Vorlesung (vorläufig!)... Datum Montags-Termin Datum Freitags-Termin 05.01. P: EJB 09.01. V: Web Services 12.01. P: EJB 16.01. V: Web Services 19.01. P: Web Services 23.01. V: Weitere Technologien 26.01. P: Web Services 30.01. P: Web Services 02.02. P: Web Services 06.02. Ersatztermin Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 16 Literatur Allgemeinere Literatur Ulrike Hammerschall, Verteilte Systeme und Anwendungen. Pearson Studium, 2005. Robert Orfali, Dan Harkey, Client/Server-Programming with Java and Corba. John Wiley & Sons, 1998. Verteilte Systeme George Coulouris, Jean Dollimore, Tim Kindberg. Verteilte Systeme Konzepte und Design, 3. Auflage. Pearson Studium, 2002. Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 17

Literatur... Verteilte Programmierung mit Java Cay S. Horstmann, Gary Cornell. Core Java 2, Band 2 Expertenwissen. Sun Microsystems Press / Addison Wesley, 2008. Torsten Langner. Verteilte Anwendungen mit Java. Markt+Technik, 2002. Jim Farley, William Crawford, David Flanagan. Java Enterprise in a Nutshell, 3rd Edition. O Reilly, 2005. CORBA und COM Johann Hofmann, Fritz Jobst, Roland Schabenberger. Programmieren mit COM und CORBA, Hanser, 2001. Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 18 Literatur... Enterprise JavaBeans Rima P. Sriganesh, Gerald Brose, Micah Silverman. Mastering Enterprise JavaBeans 3.0. Wiley, 2006. Bill Burke, Richard Monson-Haefel. Enterprise JavaBeans 3.0, 5th Edition. O Reilly, 2006. Servlets Jason Hunter, William Crawford. Java Servlet Programmierung. O Reilly, 2002. Web Services Manfred Hein, Henner Zeller. Java Web Services, Addison-Wesley, 2003. Torsten Langner. Web Services mit Java, Markt+Technik, 2003. Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 19

Client/Server-Programmierung WS 2014/2015 1 Grundlagen: Wiederholung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 20 1 Grundlagen: Wiederholung... Inhalt Architekturmodelle Zeit und Zustand in verteilten Systemen Middleware Java RMI Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 21

1.1 Architekturmodelle Client/Server-Modell Asymmetrisches Modell: Server stellen Dienste bereit, die von (mehreren) Clients genutzt werden können Server verwalten i.a. Ressourcen (zentralisiert) Client Aufruf Aufruf Server Ergebnis Server Ergebnis Client Server kann selbst wieder als Client agieren Prozeß Rechner Häufigstes Modell für verteilte Anwendungen (ca. 80 %) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 22 1.1 Architekturmodelle... Client/Server-Modell... I.A. nebenläufige Anfragen mehrerer Client-Prozesse an den Server-Prozeß Start Client Ende Anfrage (request) Antwort (reply) Zeit Server Client Beispiele: Dateiserver, WWW-Server, DB-Server, DNS-Server,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 23

1.1 Architekturmodelle... n-tier-architekturen Verfeinerungen der Client/Server-Architektur Modelle zur Verteilung einer Anwendung auf die Knoten einer verteilten Systems Vor allem bei Informationssystemen verwendet Tier (engl. Schicht / Stufe) kennzeichnet einen unabhängigen Prozeßraum innerhalb einer verteilten Anwendung Prozeßraum kann, muß aber nicht physischem Rechner entsprechen mehrere Prozeßräume auf einem Rechner möglich Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 24 1.1 Architekturmodelle... 2-Tier-Architektur Client- und Server-Tier Keine eigene Tier für die Anwendungslogik Client Tier Server Tier Präsentation Anwendungslogik (Verteilung auf Client und Server Tier variiert) Datenhaltung Vorteil: einfach, performant Nachteil: schwer wartbar, schlecht skalierbar Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 25

1.1 Architekturmodelle... 3-Tier-Architektur Client Tier Präsentation Middle Tier Anwendungslogik Server Tier Datenhaltung Standard-Verteilungsmodell für einfache Web-Anwendungen: Client-Tier: Web-Browser zur Anzeige Middle-Tier: Web-Server mit Servlets / JSP / ASP Server-Tier: Datenbank-Server Vorteile: Anwendungslogik zentral administrierbar, skalierbar Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 26 1.1 Architekturmodelle... (Animierte Folie) Beispiel: typische Internet-Anwendung DMZ Intranet Web Client 01 Web Client Internet Firewall 01 10 10 00 11 00 11 00 11 00 11 000 111 000 111 000 111 000 111 Web Server Firewall 00 11 00 11 00 11 00 11 000 111 000 111 000 111 000 111 01 10 10 Web Server 00 11 00 11 00 11 00 11 000 111 000 111 000 111 000 111 Anwen dungs Server 00 11 00 11 00 11 00 11 000 111 000 111 000 111 000 111 Daten bank Server Tier 1 Tier 2 Tier 3 Tier 4 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 27

1.2 Zeit und Zustand in verteilten Systemen Was ist der Unterschied zwischen einem verteilten System und einem Ein-/Mehrprozessorsystem? Ein- bzw. Mehrprozessorsystem: nebenläufige Prozesse: pseudo-parallel durch time sharing bzw. echt parallel globale Zeit: alle Ereignisse in den Prozessen lassen sich zeitlich eindeutig ordnen globaler Zustand: zur jeder Zeit kann ein eindeutiger Zustand des Systems angegeben werden Verteiltes System echte Parallelität keine globale Zeit kein eindeutiger globaler Zustand Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 28 1.2 Zeit und Zustand in verteilten Systemen... Globale Zeit Auf Ein-/Mehrprozessorsystem jedem Ereignis kann (zumindest theoretisch) ein eindeutiger Zeitstempel derselben lokalen Uhr zugeordnet werden bei Mehrprozessorsystemen: Synchronisation am gemeinsamen Speicher In verteilten Systemen: viele lokale Uhren (eine pro Knoten) exakte Synchronisation der Uhren (prinzipiell!) nicht möglich Reihenfolge von Ereignissen auf verschiedenen Knoten nicht (immer) eindeutig zu ermitteln (vgl. spezielle Relativitätstheorie) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 29

1.2 Zeit und Zustand in verteilten Systemen... Eine Auswirkung der Verteiltheit Szenario: zwei Prozesse beobachten zwei andere Prozesse x y z Beobachter A x y Prozess 1 Prozess 2 Beobachter B z z x y Die Beobachter sehen die Ereignisse ggf. in unterschiedlicher Reihenfolge! Problem z.b., falls die Beobachter replizierte Datenbanken und die Ereignisse Datenbank-Updates sind Replikate sind nicht mehr konsistent! Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 30 1.2 Zeit und Zustand in verteilten Systemen... Globaler Zustand: Ein Beispiel zur Motivation Szenario: Peer-to-Peer-Anwendung, Prozesse senden sich gegenseitig Aufträge Frage: wann kann die Anwendung terminieren? Falsche Antwort: wenn kein Prozeß mehr einen Auftrag bearbeitet Grund: Aufträge können noch in Nachrichten unterwegs sein! Prozeß 1 Prozeß 2 Auftrag idle idle Weitere Anwendungen: verteilte Garbage-Collection, verteilte Deadlock-Erkennung,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 31

1.2 Zeit und Zustand in verteilten Systemen... Wie bestimmt sich der Gesamtzustand eines verteilten Prozeßsystems? naiv: Summe der Zustände aller Prozesse (falsch!) Zwei Aspekte müssen beachtet werden: Nachrichten, die noch in Übertragung sind müssen mit in den Zustand aufgenommen werden Fehlen einer globalen Zeit ein Globalzustand zur Zeit t kann nicht definiert werden! Zustände der Prozesse beziehen sich immer auf lokale (und damit unterschiedliche) Zeiten Frage: Bedingung an die lokalen Zeiten? konsistente Schnitte Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 32 1.3 Middleware Verteilte Anwendung (VA) VA Komponente VS Knoten Netz VA Komponente VS Knoten Verteiltes System (VS) Verteilte Anwendung (VA) VA Komponente Middleware VS Knoten Netz VA Komponente Middleware VS Knoten Verteiltes System (VS) VA nutzt VS für Kommunikation zwischen ihren Komponenten VSe bieten i.a. nur einfache Kommunikationsdienste an direkte Nutzung: Netzwerkprogrammierung Middleware bietet intelligentere Schnittstellen verbirgt Details der Netzwerkprogrammierung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 33

1.3 Middleware... Middleware ist Schnittstelle zwischen verteilter Anwendung und verteiltem System Ziel: Verbergen der Verteilungsaspekte vor der Anwendung u.a. Zugriffs- und Orts-Transparenz Middleware kann auch Zusatzdienste für Anwendungen bieten starke Unterschiede bei existierender Middleware Unterscheidung: kommunikationsorientierte Middleware (nur) Abstraktion von der Netzwerkprogrammierung anwendungsorientierte Middleware neben Kommunikation steht Unterstützung verteilter Anwendungen im Mittelpunkt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 34 1.3.1 Kommunikationsorientierte Middleware Fokus: Bereitstellung einer Kommunikationsinfrastruktur für verteilte Anwendungen Aufgaben: Kommunikation Behandlung der Heterogenität Fehlerbehandlung Anwendung Kommunikationsorientierte Middleware Betriebssystem / verteiltes System Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 35

1.3.1 Kommunikationsorientierte Middleware... Entfernter Prozeduraufruf (RPC, Remote Procedure Call) Ermöglicht einem Client den Aufruf einer Prozedur in einem entfernten Server-Prozeß Client Prozeß y = P(x); Eingabeparameter Resultate P(a) {... return b; Server Prozeß Kommunikation nach Anfrage / Antwort-Prinzip Entfernter Methodenaufruf (RMI, Remote Method Invocation) Ermöglicht einem Objekt, Methoden eines entfernten Objekts aufzurufen Prinzipiell sehr ähnlich zu RPC Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 36 1.3.1 Kommunikationsorientierte Middleware... Gemeinsame Grundkonzepte entfernter Aufrufe Client und Server werden durch Schnittstellendefinition entkoppelt legt Namen der Aufrufe, Parameter und Rückgabewerte fest Einführung von Client-Stubs und Server-Stubs (Skeletons) als Zugriffsschnittstelle werden automatisch aus Schnittstellendefinition generiert IDL-Compiler, Interface Definition Language sind verantwortlich für Marshalling / Unmarshalling sowie für die eigentliche Kommunikation realisieren Zugriffs- und Ortstransparenz Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 37

1.3.1 Kommunikationsorientierte Middleware... Funktionsweise der Client- und Server-Stubs (RPC) y=p(x) Client Prozeß P(a) { Client Stub return b; Server Skeleton while (true) { Argumente a in receive(m1); Nachricht m1 packen client=sender(m1); send(server, m1); Argumente x aus Nach richt m1 auspacken receive(server, m2) ; y = P(x) ; Ergebnis b aus Nach richt m2 auspacken Server Prozeß Ergebnis y in Nach richt m2 packen send(client, m2); P(a) {... return b; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 38 1.3.1 Kommunikationsorientierte Middleware... Basis von RMI: Das Proxy-Pattern Client arbeitet mit Stellvertreterobjekt (Proxy) des eigentlichen Serverobjekts Proxy und Serverobjekt implementieren dieselbe Schnittstelle Client kennt / nutzt lediglich diese Schnittstelle <<interface>> Schnittstelle Client Proxy Objekt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 39

1.3.1 Kommunikationsorientierte Middleware... Ablauf eines entfernten Methodenaufrufs Client Rechner Server Rechner Client ruft eine Methode auf Client Proxy Client BS Selbe Schnitt stelle wie beim Objekt Skeleton ruft dieselbe Methode für das Objekt auf Server Skeleton Server BS Objekt Status Methode Schnitt stelle Netzwerk Verpackter Aufruf wird über das Netzwerk weitergegeben (Objekt ID, Methodenname, Parameter) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 40 1.3.1 Kommunikationsorientierte Middleware... Erstellung eines Client/Server-Programms Server Prozeduren Compiler Server Server Skel. Schnittstellen beschreibung IDL Compiler Client Stubs RPC/RMI Laufzeit Bibliothek Client Programm Compiler Client Gilt prinzipiell für alle Realisierungen entfernten Aufrufe Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 41

1.3.2 Anwendungsorientierte Middleware Setzt auf kommunikationsorientierter Middleware auf Erweitert diese um: Laufzeitumgebung Dienste Komponentenmodell Anwendungs komponente Dienste Anwendungs komponente Komponentenmodell Laufzeitumgebung Anwendungs komponente Kommunikationsinfrastruktur Betriebssystem / verteiltes System Dienste Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 42 1.3.2 Anwendungsorientierte Middleware... Laufzeitumgebung Ressourcenverwaltung Pooling von Prozessen, Threads, Verbindungen Steuerung der Nebenläufigkeit Verbindungsverwaltung Verbesserung der Verfügbarkeit Replikation, Clustering Sicherheitsmechanismen Authentifizierung und Autorisierung Vertraulichkeit und Integrität Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 43

1.3.2 Anwendungsorientierte Middleware... Dienste Namensdienst (Verzeichnisdienst) Zuordnung von Namen zu Referenzen (Adressen) Sitzungsverwaltung Transaktionsverwaltung Persistenzdienst z.b. objektrelationaler Mapper (OR-Mapper) Komponentenmodell Komponentenbegriff, Schnittstellenverträge, Laufzeitumgebung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 44 Client/Server-Programmierung WS 2014/2015 13.10.2014 Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) ii

1.4 Java RMI Java RMI ist fester Bestandteil von Java erlaubt Nutzung entfernter Objekte Wichtige elemente von Java RMI (im Paket java.rmi): entfernte Objektimplementierungen Client-Schnittstellen (Stubs) zu entfernten Objekten Namensdienst, um Objekte im Netz ausfindig zu machen Stub- und Skeleton-Klassen werden automatisch aus Schnittstellendefinition (Java Interface) generiert ab JDK 1.5 dynamisch zur Laufzeit Namensdienst: RMI Registry Verteilte Garbage-Collection Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 45 1.4 Java RMI... 1.4.1 Hello World mit Java RMI Client JVM Interface interface Hello { String sayhello(); Server JVM Client Klasse class HelloClient {... Hello h;... s = h.sayhello();... Server Klasse class HelloServer implements Hello { String sayhello() { return "Hello World";... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 46

1.4.1 Hello World mit Java RMI... Ablauf der Entwicklung: 1. Entwurf der Schnittstelle für das Server-Objekt 2. Implementierung der Server-Klasse 3. Entwicklung der Server-Anwendung zur Aufnahme des Server-Objekts 4. Entwicklung der Client-Anwendung mit Aufrufen des Server-Objekts 5. Übersetzen und Starten des Systems Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 47 1.4.1 Hello World mit Java RMI... Entwurf der Schnittstelle für das Server-Objekt Wird als normale Java-Schnittstelle spezifiziert Muß von java.rmi.remote abgeleitet werden kein Erben von Operationen, nur Markierung als Remote-Interface Jede Methode muß die Ausnahme java.rmi.remoteexception (oder eine Basisklasse davon) auslösen können Basisklasse für alle möglicherweise auftretenden Fehler im Client, bei der Übertragung, im Server Keine Einschränkungen gegenüber lokalen Schnittstellen aber: semantische Unterschiede (Parameterübergabe!) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 48

1.4.1 Hello World mit Java RMI... Hello-World Interface import java.rmi.remote; import java.rmi.remoteexception; public interface Hello extends Remote { String sayhello() throws RemoteException; Marker Schnittstelle, enthält keine Methoden, markiert Interface als RMI Schnittstelle RemoteException zeigt Fehler im entfernten Objekt bzw. bei Kommu nikation an Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 49 1.4.1 Hello World mit Java RMI... Implementierung der Server-Klasse Eine Klasse, die remote nutzbar sein soll, muß: ein festgelegtes Remote-Interface implementieren i.d.r. von java.rmi.server.unicastremoteobject abgeleitet werden definiert Aufrufsemantik: Punkt-zu-Punkt einen Konstruktor besitzen, der RemoteException werfen kann Erzeugung des Objekts muß in try-catch-block stehen Methoden brauchen throws RemoteException nicht nochmals anzugeben ist bereits im Interface definiert Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 50

1.4.1 Hello World mit Java RMI... Hello-World Server (1) import java.rmi.*; import java.rmi.server.unicastremoteobject; public class HelloServer extends UnicastRemoteObject implements Hello { public HelloServer() throws RemoteException { super(); public String sayhello() { return "Hello World!"; Remote Methode Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 51 1.4.1 Hello World mit Java RMI... Entwicklung der Server-Anwendung zur Aufnahme des Server-Objekts Aufgaben: Erzeugen eines Server-Objekts Registrieren des Objekts beim Namensdienst unter einem festgelegten, öffentlichen Namen Typischerweise keine neue Klasse, sondern main-methode der Server-Klasse Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 52

1.4.1 Hello World mit Java RMI... Hello-World Server (2) public static void main(string args[]) { try { HelloServer obj = new HelloServer(); catch (Exception e) { Naming.rebind("rmi://localhost/Hello Server", obj); System.out.println("Error: " + e.getmessage()); e.printstacktrace(); Erzeugen des Server Objekts Registrieren des Server Objekts unter dem Namen "Hello Server" beim Name Server (RMI Registry, lokaler Rechner, Port 1099) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 53 1.4.1 Hello World mit Java RMI... Entwicklung der Client-Anwendung mit Aufrufen des Server-Objekts Client muß sich zunächst beim Namensdienst über den Namen eine Referenz auf das Server-Objekt holen Type cast auf den korrekten Typ erforderlich Dann: beliebige Methodenaufrufe möglich syntaktisch kein Unterschied zu lokalen Aufrufen Anmerkung: Client kann Remote-Referenzen auch auf anderen Wegen erhalten z.b. als Rückgabewert einer Remote-Methode Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 54

1.4.1 Hello World mit Java RMI... Hello-World Client import java.rmi.*; public class HelloClient { public static void main(string args[]) { Objektreferenz vom try { Name Server holen Hello obj = (Hello)Naming.lookup("rmi://bspc02/Hello Server"); String message = obj.sayhello(); System.out.println(message); catch (Exception e) {... Aufruf der Methode des entfernten Objekts Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 55 1.4.1 Hello World mit Java RMI... Übersetzen und Starten des Systems Übersetzen der Java-Quellen Quelldateien: Hello.java, HelloServer.java, HelloClient.java Aufruf: javac *.java erzeugt: Hello.class, HelloServer.class, HelloClient.class Erzeugen des Client-Stubs (Proxy-Objekt) für Clients bis JDK 1.4: Aufruf: rmic -v1.2 HelloServer erzeugt HelloServer Stub.class ab JDK 1.5: Client erzeugt Proxy-Klasse zur Laufzeit durch java.lang.reflect.proxy Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 56

1.4.1 Hello World mit Java RMI... Übersetzen und Starten des Systems... HelloClient.java Hello.java HelloServer.java javac javac HelloClient.class Hello.class Hello.class HelloServer.class Client Seite bis JDK 1.4 rmic Server Seite HelloServer_Stub.class Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 57 1.4.1 Hello World mit Java RMI... Übersetzen und Starten des Systems... Starten des Namensdienstes Aufruf: rmiregistry [port] erlaubt aus Sicherheitsgründen nur die Registrierung von Objekten auf dem lokalen Host d.h. RMI-Registry muß auf Server-Rechner laufen Standard-Port: 1099 Starten des Servers Aufruf: java HelloServer Starten des Clients Aufruf: java HelloClient Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 58

Anmerkungen zu Folie 58: Im Beispiel wird angenommen, daß die Klasse Hello.class (und ggf. auch HelloServer Stub.class) im lokalen Classpath liegt: beim Starten von rmiregistry beim Starten von HelloServer beim Übersetzen und Starten von HelloClient 58-1 1.4 Java RMI... 1.4.2 Parameterübergabe Übergabe von Parametern an Remote-Methoden erfolgt entweder über call-by-value für Werttypen und serialisierbare Objekte oder über call-by-reference für Objekte, die Remote implementieren Entscheidung wird z.t. erst zur Laufzeit getroffen! Rückgabe des Ergebnisses folgt selben Regeln wie Parameterübergabe Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 59

1.4.2 Parameterübergabe... Übergabe eines serialisierbaren Objekts Original Client Objekt param Stub Objekt Skele ton Server Objekt op(param) param serialisieren Netz verbindung unabhängige Kopie param deserialisieren <<create>> op(param) param m() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 60 1.4.2 Parameterübergabe... Übergabe eines Remote-Objekts Client Objekt param param Stub Stub Objekt Skele ton Server Objekt op(param) tostub(param) paramstub paramstub serialisieren Netz verbindung paramstub deserialisieren <<create>> op(paramstub) param Stub m() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 61

Client/Server-Programmierung WS 2014/2015 17.10.2014 Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) iii Client/Server-Programmierung WS 2014/2015 2 Java Database Connectivity (JDBC) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 62

2 Java Database Connectivity (JDBC)... 2.1 Überblick Java-API zum portablen Zugriff auf relationale Datenbank- Systeme Unabhängig von konkreter Datenbank-Implementierung Funktionen: Verbindung zur Datenbank herstellen Ausführung von SQL-Anweisungen Zugriff auf Abfrage-Ergebnisse Vergleichbar mit ODBC, aber einfachere Schnittstelle Anschluß zur Datenbank über herstellerspezifische Treiber Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 63 2 Java Database Connectivity (JDBC)... 2.2 Relationale Datenbanken und SQL Relationale Datenbank = Menge von Tabellen jede Spalte hat Namen und Datentyp jede Zeile enthält i.a. ein Feld, dessen Wert die Zeile eindeutig identifiziert (Primärschlüssel) Aufbau festgelegt in Datenbank-Schema Beispiel: ag_name AG_ID AG_NAME 1 2 3 BMW Siemens Thyssen ag_data ID AG_ID DAY VALUE 7 3 9 1 12 2 9 9 8 102.30 99.10 30.45 Primär schlüssel Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 64

2.2 Relationale Datenbanken und SQL... SQL Standardisierte Abfragesprache für relationale Datenbanken Erlaubt u.a.: Abfrage von Daten (SELECT) Erzeugung neuer Tabellen (CREATE TABLE) Einfügen von Datensätzen (Zeilen) (INSERT) Löschen von Datensätzen (DELETE) Ändern von Datensätzen (UPDATE) Auswahl der Datensätze i.d.r. über deren Inhalt häufig über Primärschlüssel Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 65 2.2 Relationale Datenbanken und SQL... Beispiele für SQL-Anfragen SELECT AG_ID, AG_NAME FROM ag_name WHERE AG_NAME = Siemens liefert die Zeile für Siemens aus der ag name-tabelle SELECT ag_name.ag_name, ag_data.value FROM ag_name, ag_data WHERE VALUE > 90 AND ag_name.ag_id = ag_data.ag_id liefert Name und Kurs aller Aktien mit Kurs über 90 gibt Information aus zwei Tabellen zurück Verbindung der Einträge über den Primärschlüssel (Natural Join) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 66

2 Java Database Connectivity (JDBC)... 2.3 Architektur von JDBC Java Anwendung JDCB Treiber Manager JDBC/ODBC Brücke ODBC Treiber Treiber für mysql Treiber für Oracle MS mysql Oracle SQL Server Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 67 2.3 Architektur von JDBC... Klassen des JDBC-Kerns java.sql <<interface>> Driver <<interface>> Connection <<interface>> Statement <<interface>> ResultSet DriverManager <<interface>> PreparedStatement <<interface>> ResultSetMetaData DriverPropertyInfo <<interface>> CallableStatement Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 68

2.3 Architektur von JDBC... Klassen des JDBC-Kerns... Interface Driver Schnittstelle, die alle JDBC-Treiber implementieren müssen neu geladener Treiber registriert sich bei DriverManager Klasse DriverManager verwaltet Driver-Objekte erzeugt Datenbank-Verbindungen (Connection) Klasse DriverPropertyInfo erlaubt Definition spezieller Parameter beim Aufbau der Datenbank-Verbindung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 69 2.3 Architektur von JDBC... Klassen des JDBC-Kerns... Interface Connection repräsentiert Sitzung mit ausgewählter Datenbank erlaubt Erzeugung von Statement-Objekten verwaltet Informationen zum Zustand der Datenbank erlaubt Abfrage von Metadaten der Datenbank (Methode getmetadata(), Resultat: DatabaseMetaData) z.b. unterstützte SQL-Versionen, Limitierungen des Datenbank-Systems,... Interface Statement zur Ausführung einer SQL-Anfrage verwaltet auch Ergebnis der Anfrage (ResultSet) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 70

2.3 Architektur von JDBC... Klassen des JDBC-Kerns... Interface PreparedStatement zur Ausführung einer vorkompilierten SQL-Anfrage effizienter bei wiederholter Ausführung Interface CallableStatement erlaubt Aufruf von Stored Procedures SQL-Prozeduren, die in Datenbank selbst abgelegt sind Interface ResultSet Ergebnis-Relation einer Datenbank-Anfrage Interface ResultSetMetaData Metadaten zu den Spalten der Ergebnis-Relation z.b. Name, Typ, vorzeichenbehaftet,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 71 2 Java Database Connectivity (JDBC)... 2.4 Ein Beispiel import java.sql.*; import java.lang.*; public class Beispiel { public static void main(string[] args) { try { // Laden des JDBC Treibers Class.forName("com.mysql.jdbc.Driver"); catch (ClassNotFoundException e) { System.out.println("Treiber nicht ladbar:" + e); return; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 72

2.4 Ein Beispiel... try { // Verbindung zur Datenbank Connection con = DriverManager.getConnection( "jdbc:mysql://bslabserv01.lab.bvs/cspdb","",""); // Erzeuge SQL Anweisung und führe sie aus Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery( "SELECT AG_ID, AG_NAME FROM ag_name"); // Ausgabe des Ergebnisses while (rs.next()) { System.out.println("" + rs.getint("ag_id") + ", " + rs.getstring("ag_name")); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 73 2.4 Ein Beispiel... // Alles schließen rs.close(); stmt.close(); con.close(); catch (SQLException e) { System.out.println("SQL Exception: " + e.getmessage()); e.printstacktrace(system.out); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 74

2 Java Database Connectivity (JDBC)... 2.5 Details zu JDBC Laden der Treiber Vor Verwendung von JDBC müssen die Treiber geladen werden: try { Class.forName("com.mysql.jdbc.Driver"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); catch (ClassNotFoundException e) {... Alternativ: Setzen der jdbc.drivers Property java -Djdbc.drivers=com.mysql.jdbc.Driver:sun.jdbc. odbc.jdbcodbcdriver... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 75 2.5 Details zu JDBC... Verbindung zur Datenbank herstellen Verbindung wird durch Connection-Objekt repräsentiert Mehrere Datenbank-Verbindungen pro Anwendung möglich Erzeugung über Connection con = DriverManager.getConnection( "url", "user", "password"); Variante von getconnection() erlaubt Definition von Properties für die Datenbank-Verbindung Wenn Verbindung nicht mehr benötigt wird: explizites Schließen mit Methode con.close() Freigabe von Netzwerk- und Speicherressourcen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 76

2.5 Details zu JDBC... Ausführung einer SQL-Anweisung Erzeugung eines Statement-Objekts Statement stmt = con.createstatement(); Ausführung der SQL-Anweisung ResultSet rs = stmt.executequery("select..."); Methoden executeupdate() für Anfragen ohne Ergebnis, bzw. execute(), falls unbekannt, ob Ergebnis geliefert wird execute() liefert true, falls Ergebnis vorhanden Statement-Objekt repräsentiert eine einzige SQL-Anfrage ResultSet wird bei erneuter Anfrage über selbes Statement-Objekt ungültig für simultane Anfragen: mehrere Statement-Objekte! Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 77 2.5 Details zu JDBC... Zugriff auf die Resultate Ergebnis einer SQL-Anfrage (SELECT) ist eine Tabelle Struktur gekapselt in ResultSet-Objekt Methoden u.a.: next(): setzt Lesezeiger auf nächste Zeile zu Begin steht Zeiger vor der ersten Zeile Ergebnis false, falls keine Zeile mehr vorhanden get...(string name) / get...(int nr): liefert Inhalt des Feldes mit Spaltenname name bzw. Spaltennummer nr mehrere Methoden für die verschiedenen Datentypen getstring() liefert immer String-Repräsentation close(): Ressourcenfreigabe Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 78

2.5 Details zu JDBC... SQL-Datentypen und Zugriffsmethoden (Auswahl) SQL Typ(en) Java Typ Methode CHAR, VARCHAR String getstring() NUMERIC, DECIMAL java.math.bigdecimal getbigdecimal() BIT boolean getboolean() TINYINT byte getbyte() SMALLINT short getshort() INTEGER int getint() BIGINT long getlong() REAL float getfloat() FLOAT, DOUBLE double getdouble() BINARY, VARBINARY byte[] getbytes() DATE java.sql.date getdate() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 79 2.5 Details zu JDBC... Ausführung vorkompilierter SQL-Anfragen Für wiederkehrende, ähnliche Aufgaben sind vorkompilierte SQL-Anfragen (PreparedStatement) effizienter die Anfragen sind auch parametrisierbar Auch Sicherheitsvorteil gegen SQL Injection Erzeugung eines PreparedStatement-Objekts PreparedStatement stmt = con.preparestatement( "INSERT INTO Employees (Name, Phone) (?,?)");? als Platzhalter für Parameter Ausführung der Anfrage mit konkreten Parametern stmt.clearparameters(); stmt.setstring(1, "Jimmy Dean"); // erster Param. stmt.setstring(2, "201 555-7685"); // zweiter Param. stmt.executeupdate(); // kein Ergebnis Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 80

2.5 Details zu JDBC... Ausführung von Stored Procedures Oracle PL/SQL Prozedur (Im Datenbanksystem gespeichert) CREATE OR REPLACE PROCEDURE sp_interest (id IN INTEGER bal IN OUT FLOAT) is BEGIN SELECT balance INTO bal FROM accounts WHERE account_id = id; bal = bal + bal * 0.03; UPDATE accounts SET balance = bal WHERE account_id = id; END; Aufruf der Prozedur über JDBC CallableStatement stmt = con.preparecall( "{call sp_interest(?,?)"); stmt.registeroutparameter(2, Types.FLOAT); stmt.setint(1, accountid); stmt.setfloat(2, 2343.23); stmt.execute(); out.println("new Balance: " + stmt.getfloat(2)); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 81 2.5 Details zu JDBC... Transaktionen Verantwortlich für Transaktionen: Connection-Objekt Methoden zur Steuerung von Transaktionen: setautocommit() - automatisches Festschreiben? Voreinstellung: jede SQL-Anweisung wird als individuelle Transaktion ausgeführt commit() - Festschreiben der Transaktion rollback() - Abbruch der Transaktion settransactionisolation() - Isolationsebene festlegen TRANSACTION NONE, sowie die vier Isolations-Ebenen nach ANSI/ISO-SQL99 ( VS, 7.4): read uncommitted, read commited, repeatable read, serializable Voreinstellung ist vom Treiber abhängig Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 82

2.5 Details zu JDBC... Transaktionen... try { // Höchste Isolationsebene con.settransactionisolation(transaction_serializable); // Transaktionen mit mehreren SQL Anweisungen zulassen con.setautocommit(false); // SQL Anweisungen stmt.executeupdate("update inv SET onhand = 10 WHERE id = 5"); stmt.executeupdate("insert INTO shipping (qty) VALUES (5)"); // Commit aller Aktionen seit letztem Commit/Rollback con.commit(); catch (SQLException e) { // Rückgängigmachen aller Änderungen con.rollback(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 83 2 Java Database Connectivity (JDBC)... 2.6 Zusammenfassung JDBC erlaubt portablen Zugriff auf relationale Datenbanken Abfragen über SQL Grundsätzlicher Ablauf: Laden des Treibers (Class.forName()) Verbindung zur Datenbank herstellen (Connection) SQL-Anweisung erzeugen (Statement) SQL-Anweisung ausführen, Ergebnis auslesen (ResultSet) Daneben: Unterstützung für vorkompilierte SQL-Anweisungen und Stored Procedures Transaktionen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 84

Client/Server-Programmierung WS 2014/2015 3 CORBA Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 85 3 CORBA... Inhalt CORBA-Architektur CORBA-Dienste Beispielprogramm CORBA im Detail IDL und IDL-Java-Mapping Namensdienst POA GIOP, IIOP und IOR Implementation- und Interface-Repository Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 86

3 CORBA... Literatur CORBA-Spezifikationen der OMG http://www.omg.org/technology/documents/ corba spec catalog.htm Farley / Crawford / Flanagan, Kap. 14 Orfali / Harkey, Kap. 1, 4, 7-9, 17-22 Hofmann / Jobst / Schabenberger, Kap. 2.2, 5, 6 Michi Henning, Steve Vinoski: Advanced CORBA Programming with C++. Addison-Wesley, 1999. Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 87 3.1 Einführung CORBA: Common Object Request Broker Architecture Ziel: Entwicklung und Integration verteilter objektorientierter Anwendungen in heterogenen Umgebungen CORBA ist plattform- und sprachunabhängig Informeller Standard, definiert durch die OMG (Object Management Group) 1989 gegründet, Ziel: Förderung objektorientierter Techniken heute über 700 Mitglieder (größtes IT-Industriekonsortium) CORBA ist nur eine Spezifikation verschiedenste Implementierungen, z.b. Orbix, ORBACUS, Java IDL (Teil des JDK), JacORB, ORBit (GNOME!)... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 88

3.2 CORBA Architektur 3.2.1 Object Management Architecture (OMA) Definiert Objekt- und Referenzmodell Objektmodell unterstützt Kapselung, (Mehrfach-)Vererbung, Polymorphie Objekte bieten Dienste mit definierter Schnittstelle an Client nutzt Dienste (lokal oder entfernt) über Schnittstelle, ist vollständig von Server-Implementierung unabhängig Objektimplementierung mit beliebiger Programmiersprache Referenzmodell Interaktion zw. Objekten und dazu notwendige Komponenten Herzstück: Object Request Broker (ORB) Software-Bus für Kommunikation zw. Client und Server Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 89 3.2.1 Object Management Architecture (OMA)... Das OMA Referenzmodell Application Vertical CORBA Horizontal CORBA Objects Facilities Facilities Client Server Object Request Broker Naming Event... LifeCycle Transactions CORBA Services Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 90

3.2.1 Object Management Architecture (OMA)... Bestandteile des OMA Referenzmodells Object Request Broker (ORB) stellt Dienstanfragen an verteilte Objekte zu realisiert Ortstransparenz für die Client-Objekte CORBA Services (Object Services) domänenunabhängige (horizontale) Schnittstellen zu wichtigen Basisdiensten, z.b. Namensdienst betriebssystem-ähnliche Funktion Horizontal CORBA Facilities (Common Facilities) Schnittstellen zu anwendungsorientierten, domänenübergreifenden Diensten z.b. Drucken, verteilte Dokumente,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 91 3.2.1 Object Management Architecture (OMA)... Bestandteile des OMA Referenzmodells... Vertical CORBA Facilities (Domain Interfaces) Schnittstellen zu anwendungsorientierten Diensten für bestimmte Anwendungsdomänen z.b. Finanzwesen, Medizin, Telekommunikation,... Application Objects anwendungsspezifische Schnittstellen im Ggs. zu Services und Facilities nicht von der OMG standardisiert OMG spezifiziert nur die Schnittstellen, nicht die Implementierungen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 92

3.2 CORBA Architektur... 3.2.2 Common Object Request Broker Architecture (CORBA) Zentrale Idee: transparente Kommunikation zwischen Client und Server-Objekten über ORB ORB bietet Client eine lokale (Proxy-)Schnittstelle Vorteile beim Einsatz eines ORB: Zugriffs- und Ortstransparenz Transparenz der Implementierungssprache Transparenz der Objektaktivierung ORB übernimmt ggf. Aktivierung des Objekts Transparenz der Kommunikationstechnik Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 93 3.2.2 Common Object Request Broker Arch.... Objektreferenzen Zugriff auf Objekte erfolgt über Objektreferenzen Objektreferenzen identifizieren genau ein Objekt aber: verschiedene Referenzen für ein Objekt möglich können null sein, d.h. auf kein Objekt zeigen können hängen, wenn Objekt nicht mehr existiert können persistent sein sind typsicher unterstützen spätes Binden (Polymorphismus) sind interoperabel, d.h. Aufbau ist standardisiert sind opak, d.h. Client darf Inhalt nicht betrachten Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 94

3.2.2 Common Object Request Broker Arch.... OMG Interface Definition Language (OMG IDL) OMG IDL erlaubt formale Beschreibung der Objekt-Schnittstellen unabhängig von Implementierung der Objekte (z.b. Programmiersprache) Objekte können z.b. durch C++- oder Java-Objekte, aber auch durch eigene Programme oder OO-Datenbanken implementiert werden OMG definiert, wie IDL in verschiedene Sprachen abgebildet wird (Language Mapping) derzeit für C, C++, Java, Smalltalk, Ada, Lisp, Phyton, Cobol, PL/1, Ruby Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 95 Client/Server-Programmierung WS 2014/2015 24.10.2014 Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) iv

3.2.2 Common Object Request Broker Arch.... Modell des Object Request Brokers Client Object Implementation 0000 1111 0000 00000 11111 000000000 111111111 Stub Dynamic Invocation Interface 1111 00000 11111 0000 1111 ORB Interface ORB Core Skeleton Dynamic Skeleton Interface Object Adapter Interface Repository Implementation Repository 000 111 000 111 0000 1111 000 111 Identische Schnittstelle für alle ORB Implementierungen Eine Schnittstelle pro Objekt Typ Mehrere (unterschiedliche) Objekt Adapter möglich ORB spezifische Schnittstelle mögliche Rechnergrenze Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 96 3.2.2 Common Object Request Broker Arch.... Komponenten des ORB ORB Core stellt Basisfunktionalität zur Verfügung Objekt-Repräsentation, Kommunikationsmechanismen ist i.d.r. verteilt implementiert Stub und Skeleton für entfernten Methodenaufruf vom IDL-Compiler aus Schnittstellendefinition erzeugt Dynamic Invocation Interface und Dynamic Skeleton Interface erlauben dynamische Methodenaufrufe/-implementierungen d.h. Schnittstelle muß zur Übersetzungszeit des Clients bzw. Servers noch nicht festgelegt sein Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 97

3.2.2 Common Object Request Broker Arch.... Komponenten des ORB... Object Adapter stellt Objektimplementierung Dienste des ORB zur Verfügung Funktionen u.a.: Methodenaufrufe (über Skeletons) Abbildung von Referenzen auf Impementierungen Registrierung von Implementierungen Generierung und Interpretation von Objektreferenzen Objektaktivierung und -deaktivierung unterschiedliche Objektadapter möglich ab CORBA 2.2: Portable Object Adapter (POA) als Standard-Schnittstelle zum Objektadapter Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 98 3.2.2 Common Object Request Broker Arch.... Komponenten des ORB... ORB Interface Schnittstelle für Dienste, die der ORB dem Client und allen Objektimplementierungen zur Verfügung stellt Interface Repository Dienst, der zur Laufzeit persistente Information zu den registrierten Objektschnittstellen zur Verfügung stellt Nutzung ggf. durch ORB und / oder Clients allgemein: jegliche Information zu Objekt-Schnittstellen Implementation Repository enthält Information, die es dem ORB erlaubt, Objekte zu lokalisieren und zu aktivieren allgemein: jegliche Information zu Objekt-Implementierungen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 99

3.2 CORBA Architektur... 3.2.3 CORBA-Dienste Von der OMG spezifiziert, erweitern ORB-Funktionalität realisiert durch CORBA-Objekte mit IDL-Schnittstelle Anbieter von ORB und Diensten können unterschiedlich sein Collection Service Container-Objekte, z.b. Map, Set, Queue Concurrency Control Service realisiert Sperren für wechselseitigen Ausschluß Event Service verteilt Ereignisse an interessierte Objekte Externalization Service (De-)Serialisierung von Objekten Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 100 3.2.3 CORBA-Dienste... Licensing Service erfaßt Nutzung von Objekten für Abrechnung Life Cycle Service Erzeugen, Löschen, Kopieren und Verschieben von Objekten Naming Service Zuordnung von Namen zu Objektreferenzen Notification Service Event Service-Erweiterung: beliebige Daten als Ereignisse Persistent Object Service persistentes Speichern von Objekten in Datenbanken Property Service Verwaltet Name/Wert-Paare Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 101

3.2.3 CORBA-Dienste... Query Service Anfrageoperationen an verteilte Objekte (SQL-Obermenge) Relationship Service Erzeugung / Traversierung von Assoziationen zw. Objekten Security Service Authentifizierung, Zugriffskontroll-Listen, Rechteweitergabe Time Service Zeit-Synchronisation Trading Service erlaubt CORBA-Objekte anhand ihrer Fähigkeiten zu finden Object Transaction Service flache und verschachtelte verteilte Transaktionen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 102 3.3 Hello World mit CORBA Vorbemerkungen In der Vorlesung und Übung: Verwendung zweier CORBA-Implementierungen Java IDL Seit JDK 1.2 fester Bestandteil der Java Entwicklungsumgebung wenig Dienste (nur Namensdienst) JacORB 2.3.1 frei verfügbarer ORB, in Java implementiert mehr Dienste (u.a. Naming, Event, Notification, Transaction, Trading), sowie Interface- und Implementation Repository Wegen POA: Anwendungs-Quellcode ist für alle Implementierungen gleich Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 103

3.3 Hello World mit CORBA... Vorgehen zur Erstellung der Anwendung 5 Java Interfaces IDL zu Java Compiler Client Stubs Client Hilfs Klassen Server Java Interfaces IDL zu Java Compiler 6 javac 7 4 Client javac Objekt 3 Code Compiler Compiler Impl.code Client Anwendung Stub Schnittstellen definitionen in IDL Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 104 1 Object Request Broker Objekt Skeletons POA Objekt Implementierung Skeleton POA 2 Hilfs Klassen 3.3 Hello World mit CORBA... IDL-Beschreibung der Schnittstelle module HelloWorld Paketname { interface Hello Schnittstelle { string sayhello(in string name); ; ; Eingabeparameter Methode CORBA definiert eigene, C++/Java-ähnliche Sprache IDL-Compiler erzeugt Schnittstellen für jeweilige Implementierungssprache kann für Client und Server verschieden sein Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 105

3.3 Hello World mit CORBA... Vom IDL-Compiler generierte Dateien Hello.idl Client _HelloStub.java Client Stub Schnittstelle Hilfsfunktionen für Client/Server idlj idl (Java IDL) (JacOrb) Hello.java HelloOperations.java HelloHelper.java HelloHolder.java HelloPOA.java Server POA (Basisklasse) HelloPOATie.java POA (Tie Klasse) Hilfsklasse für Ausgabeparameter Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 106 3.3 Hello World mit CORBA... Aufruf des IDL-Compilers Java IDL: idlj -fall erzeugt alle Dateien idlj -fclient erzeugt Dateien für Client idlj -fserver erzeugt Dateien für Server ohne Helper-Klassen! idlj -falltie erzeugt alle Dateien incl. Tie-Klassen JacORB: idl erzeugt alle Dateien incl. Tie-Klassen idl -noskel erzeugt Dateien nur für Client idl -nostub erzeugt Dateien nur für Server Weiteres Argument: Name der IDL-Datei Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 107

3.3 Hello World mit CORBA... Vom IDL-Compiler erzeugte Java-Schnittstelle HelloWorld/Hello.java: package HelloWorld; public interface Hello extends HelloOperations, org.omg.corba.object, org.omg.corba.portable.idlentity { HelloWorld/HelloOperations.java: package HelloWorld; public interface HelloOperations { String sayhello (String name); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 108 3.3 Hello World mit CORBA... Objektimplementierung // vom IDL Compiler erzeuges Paket mit POA/Skeleton etc. import HelloWorld.*; public class HelloImpl extends HelloPOA { public String sayhello(string name) { return "The world says HELLO to " + name; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 109

3.3 Hello World mit CORBA... Server-Programm // vom IDL Compiler erzeuges Paket mit Hilfsklassen import HelloWorld.*; // CORBA Namensdienst import org.omg.cosnaming.*; // Für Exceptions, die Namensdienst werfen kann import org.omg.cosnaming.namingcontextpackage.*; // Alle CORBA Server benötigen diese Klassen import org.omg.corba.*; import org.omg.portableserver.*; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 110 3.3 Hello World mit CORBA... public class HelloServer { public static void main(string args[]) { try { // Erzeuge und Initialisiere den ORB ORB orb = ORB.init(args, null); // Erzeuge das Servant Objekt HelloImpl helloref = new HelloImpl(); // Aktivierung des POA POA rootpoa = POAHelper.narrow( orb.resolve_initial_references("rootpoa")); rootpoa.the_poamanager().activate(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 111

3.3 Hello World mit CORBA... // Registriere Servant und erzeuge (CORBA) Objektreferenz org.omg.corba.object ref = rootpoa.servant_to_reference(helloref); // Konvertierung in Java Objektreferenz Hello href = HelloHelper.narrow(ref); // Registriere Objektreferenz beim Namensdienst org.omg.corba.object objref = orb.resolve_initial_references("nameservice"); NamingContextExt ncref = NamingContextExtHelper.narrow(objRef); NameComponent path[] = ncref.to_name("helloworld"); ncref.rebind(path, href); System.out.println("HelloServer is running..."); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 112 3.3 Hello World mit CORBA... // Starte ORB orb.run(); catch(exception e) { System.err.println("ERROR: " + e); e.printstacktrace(system.out); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 113

3.3 Hello World mit CORBA... Client-Programm import HelloWorld.*; // Client Stubs import org.omg.cosnaming.*; // Namensdienst import org.omg.corba.*; // CORBA Klassen public class HelloClient { public static void main(string args[]) { try { // Erzeuge und Initialisiere den ORB ORB orb = ORB.init(args, null); // Aufsuchen des Objekts beim Namensdienst org.omg.corba.object objref = orb.resolve_initial_references("nameservice"); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 114 3.3 Hello World mit CORBA... NamingContextExt ncref = NamingContextExtHelper.narrow(objRef); NameComponent path[] = ncref.to_name("helloworld"); Hello helloref = HelloHelper.narrow(ncRef.resolve(path)); // Aufruf der Methode des CORBA Objekts System.out.println(helloRef.sayHello("Peter")); catch(exception e) { System.out.println("ERROR : " + e); e.printstacktrace(system.out); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 115

3.3 Hello World mit CORBA... Anmerkungen zum Code resolve initial references() dient der initialen Auflösung von Namen, insbesondere: RootPOA: der Wurzel-POA des Servers ( 3.4.6) NameService: der Namensdienst Ergebnis ist org.omg.corba.object CORBA Objektreferenz narrow() dient zum Umwandeln einer CORBA-Objektreferenz in eine Java Objektreferenz (des Stubs) to name() wandelt String in strukturierten Namen für Namensdienst um (s. später) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 116 3.3 Hello World mit CORBA... Starten der Anwendung (Java IDL) Starten des ORB-Daemons (Namensdienst) orbd -ORBInitialPort 12345 [ -port <port> ] startet Daemon auf Port 12345 (-port legt Port für Objektaktivierung fest) Achtung: ~/orb.properties von JacORB darf nicht existieren! Starten des Servers java HelloServer -ORBInitialPort 12345 [ -ORBInitialHost <addr> ] Angabe von Host und Port des ORB-Daemons Starten des Clients java HelloClient -ORBInitialPort 12345 [ -ORBInitialHost <addr> ] Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 117

3.3 Hello World mit CORBA... Zur Nutzung von JacORB im Labor H-A 4111 Umgebungsvariablen setzen (ggf. in $HOME/.profile): export JACORB_HOME=/opt/dist/JacORB export PATH=$JACORB_HOME/bin:$PATH Konfigurationsdatei einrichten: cp $JACORB_HOME/etc/jacorb_properties.template $HOME/orb.properties in $HOME/orb.properties alle cspxxx durch eigenes Login ersetzen JacORB verwendet bei uns eine Datei unter $HOME zum Auflösen der initialen Referenzen setzt Netzwerk-Dateisystem (NFS) voraus auch möglich: Nutzung eines WWW-Servers Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 118 Anmerkungen zu Folie 118: Für die Benutzung von Java IDL muss ggf. der Pfad zum JDK gesetzt werden. Auf den PCs im Labor H-A 4111 ist dieser Pfad: /usr/lib64/jvm/java-1.7.0-openjdk/bin/ 118-1

3.3 Hello World mit CORBA... Starten der Anwendung (JacORB) Starten des Namensdienstes ns startet auf beliebigem freiem Port schreibt eigene Objektreferenz in Datei $HOME/.jaco_ns Starten des Servers jaco HelloServer jaco ist ein Hilfsskript von JacORB startet JVM mit nötigen Properties und Classpath Starten des Clients jaco HelloClient Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 119 3.4 CORBA im Detail 3.4.1 OMG IDL und Java-Mapping Struktur einer IDL-Datei: module Identifikator { Typ-Deklarationen; Konstanten-Deklarationen; Exception-Deklarationen; interface Identifikator [:Vererbung ] { Typ-Deklarationen; Konstanten-Deklarationen; Exception-Deklarationen; Attribut-Deklarationen; Methoden-Deklarationen; ;... ; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 120

3.4.1 OMG IDL und Java-Mapping... module und interface module definiert einen neuen Namensraum ähnlich wie C++ Namespaces bzw. Java Packages verschachtelte Namensräume möglich interface definiert neue Schnittstelle ähnlich wie Java-Schnittstellen Schnittstelle kann Methoden und Attribute enthalten Attribute werden über automatisch generierte Deklarationen von Get- und Set-Methoden realisiert Vererbung ist möglich, auch Mehrfachvererbung vererbt werden nur Schnittstellen, keine Implementierungen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 121 3.4.1 OMG IDL und Java-Mapping... Methoden-Deklarationen Syntax: [ oneway ] Typ Identifikator ( Parameterliste ) [ raises ( Exceptions ) ] [ Kontext ] Parameterliste: Liste von Parameterdeklarationen: { in out inout Typ Identifikator Klassifikation nach Ein- und Ausgabeparametern Kontext: Liste von Kontextvariablen ähnlich UNIX Umgebungsvariablen, werden an Server übergeben oneway: asynchroner Methodenaufruf ohne Ergebnis / Ausgabeparameter Überladen von Methoden ist nicht erlaubt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 122

3.4.1 OMG IDL und Java-Mapping... Wichtige Basis-Datentypen und ihre Java-Entsprechungen IDL Datentyp Beschreibung Java Datentyp [unsigned] short Ganzzahl, 16 Bit short [unsigned] long Ganzzahl, 32 Bit int [unsigned] long long Ganzzahl, 64 Bit long float Gleitkomma, 32 Bit float double Gleitkomma, 64 Bit double char Zeichen, 8 Bit char string Zeichenkette String boolean (TRUE, FALSE) Boole scher Wert boolean (true, false) octet Byte byte any beliebiger Typ org.omg.corba.any Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 123 Client/Server-Programmierung WS 2014/2015 27.10.2014 Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) v

3.4.1 OMG IDL und Java-Mapping... Beispiel module Beispiel { interface Test1 { void setname(in string name); double getxy(out double y); long encrypt(in string key, inout string msg); ; interface Test2 { string chartostring(in char c1, in char c2); ; ; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 124 3.4.1 OMG IDL und Java-Mapping... Vom IDL-Compiler erzeugte Klassen und Interfaces Beispiel <<interface>> Test1Operations setname() getxy() encrypt() <<interface>> Test1 Test1Helper narrow() insert() extract() Test1Holder _Test1Stub <<interface>> Test2Operations chartostring() <<interface>> Test2 Test2Helper narrow() insert() extract() Test2Holder _Test2Stub Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 125

3.4.1 OMG IDL und Java-Mapping... Erzeugte Java-Schnittstellen Beispiel/Test1Operations.java: package Beispiel; public interface Test1Operations { void setname (String name); double getxy (org.omg.corba.doubleholder y); int encrypt (String key, org.omg.corba.stringholder msg); Beispiel/Test2Operations.java: package Beispiel; public interface Test2Operations { String chartostring (char c1, char c2); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 126 3.4.1 OMG IDL und Java-Mapping... Holder-Klassen Java unterstützt keine Ausgabeparameter daher: Übergabe eines Objekts (per Referenz!), das den Parameter enthält (Holder-Klasse) Z.B. Code für DoubleHolder: public final class DoubleHolder... { public double value; public DoubleHolder() { public DoubleHolder(double initialvalue) value = initialvalue;... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 127

3.4.1 OMG IDL und Java-Mapping... Helper-Klassen Hilfsmethoden für CORBA-Objekte Ausschließlich static-methoden: narrow(): Typumwandlung (Down cast), wandelt u.a. CORBA Objektreferenz in Java Objektreferenz um insert(): packt Objekt in Datentyp org.omg.corba.any extract(): extrahiert Objekt aus org.omg.corba.any id(): Schnittstellen-ID für Interface-Repository read(): Lesen eines Objekts aus einem Eingabestrom write(): Schreiben eines Objekts in einen Ausgabestrom Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 128 3.4.1 OMG IDL und Java-Mapping... Abgeleitete Datentypen OMG IDL erlaubt Definition abgeleiteter Datentypen Interfaces (Objekte) Sequenzen und Arrays Strukturen (Struct) Aufzählungen (Enum) Vereinigungen (Union) Daneben: Typdefinitionen (Typedefs) Syntax / Semantik stark an C/C++ angelehnt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 129

3.4.1 OMG IDL und Java-Mapping... Typdefinitionen (Typedefs) IDL erlaubt es, neue Namen für existierende Typen zu definieren auf allen Ebenen (global, Modul, Schnittstelle) Beispiele: typedef short Temperatur; // neuer Typname: Temperatur typedef Test2 MyTest; CORBA legt nicht fest, ob neuer Typname nur Alias für existierenden Typ ist, oder ob neuer Typ erzeugt wird Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 130 3.4.1 OMG IDL und Java-Mapping... Sequenzen Vektoren (eindimensionale Felder) variabler Länge beliebige IDL-Elementtypen Länge kann begrenzt oder unbegrenzt sein Beispiel: IDL typedef sequence<dog> MySeq; typedef sequence<dog, 60> MyBoundedSeq; void seqtest(in MySeq par1, in MyBoundedSeq par2, out MySeq par3); Umsetzung in Java: void seqtest(beispiel.dog[] par1, Beispiel.Dog[] par2, Beispiel.Test2Package.MySeqHolder par3); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 131

3.4.1 OMG IDL und Java-Mapping... Arrays Ein- oder mehrdimensionale Felder fester Länge Beispiel: IDL typedef Dog MyArray[60]; typedef Dog My2DArray[60][10]; void arraytest(in MyArray par1, in My2DArray par2, out MyArray par3); Umsetzung in Java: void arraytest(beispiel.dog[] par1, Beispiel.Dog[][] par2, Beispiel.Test2Package.MyArrayHolder par3); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 132 3.4.1 OMG IDL und Java-Mapping... Strukturen (Structs) Zusammenfassung von mehrerer Variablen entspricht Klasse mit public-attributen ohne Methoden Beispiel: IDL struct MyStruct { short age; string name; ; Umsetzung in Java: public final class MyStruct { public short age = (short)0; public String name = null; public MyStruct() { public MyStruct(short _age, String _name) { age = _age; name = _name; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 133

3.4.1 OMG IDL und Java-Mapping... Aufzählungen (Enums) Neuer Typ mit explizit aufgezählten Werten Beispiel: IDL enum Color { red, green, blue ; Umsetzung in Java: Klasse Color mit static final-attributen für die Werte als int-wert (z.b. red) und als Color-Objekt (z.b. red) Methode value(), liefert int-wert zurück static-methode from int() als Factory Verwendung z.b.: Color mycol = Color.red; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 134 3.4.1 OMG IDL und Java-Mapping... Vereinigungen (Unions) Beschreibt Daten, die verschiedene Typen haben können Typ wird durch Diskriminator zur Laufzeit festgelegt Beispiel: IDL union Animal switch (short) { case 1: Dog dog; case 2: Cat cat; default: Mouse mouse; ; Umsetzung in Java: Klasse Animal mit Methode discriminator() für Diskriminator Get- und Set-Methoden für die Felder des Union prüfen bzw. setzen auch Diskriminator-Wert Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 135

3.4.1 OMG IDL und Java-Mapping... Attribute In einem Interface können auch Attribute definiert werden: attribute string name; readonly attribute long age; deklariert werden damit letztendlich nur Zugriffsmethoden zum Lesen und ggf. auch zum Schreiben Erzeugte Java-Schnittstelle im Beispiel: String name (); void name (String newname); int age (); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 136 3.4.1 OMG IDL und Java-Mapping... Konstanten Konstanten können auf globaler, auf Modul- oder auf Interface-Ebene definiert werden unterschiedlicher Gültigkeitsbereich Beispiel zur Syntax: interface Test2 { const short maxitems = 40; const string myname = "Roland";... Abbildung nach Java: public interface Test2 extends Test2Operations... { public static final short maxitems = (short)(40); public static final String myname = "Roland"; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 137

3.4.1 OMG IDL und Java-Mapping... Exceptions IDL erlaubt Definition eigener Exceptions daneben: jede Methode kann (implizit) eine Reihe von System-Exceptions werfen, z.b. Marshaling-Fehler Beispiel: exception SyntaxError { unsigned short position; ; void parse(in string command) raises (SyntaxError); Umsetzung in Java: void parse (String command) throws Beispiel.Test2Package.SyntaxError; plus Exception-Klasse SyntaxError, analog zu Struct Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 138 3.4.1 OMG IDL und Java-Mapping... Vererbung Methoden und Attribute von Schnittstellen können vererbt werden auch Mehrfachvererbung möglich kein Überladen / Überschreiben von Methoden erlaubt Beispiel: interface Animal { attribute short age; void eat(in string what); ; interface Dog : Animal { string bark(); ; Umsetzung in Java: AnimalOperations short age() void age(short) void eat(string) Animal DogOperations String bark() Dog Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 139

3.4.1 OMG IDL und Java-Mapping... Vererbung... Methoden der Basisklasse org.omg.corba.object (Java Bindings): _is_a(): implementiert Objekt gegebenes Interface? _non_existent(): zugehöriges Server-Objekt zerstört? _is_equivalent(): verweisen zwei Referenzen auf dasselbe Objekt? (soweit ORB das einfach bestimmen kann) _hash(): Hashwert der Objektreferenz _duplicate() / _release(): Kopie bzw. Freigabe einer Objektreferenz (i.a. keine Garbage Collection im ORB) _get_interface_def(): liefert Schnittstellenbeschreibung aus Interface Repository _create_request(): erzeugt Request für DII Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 140 3.4.1 OMG IDL und Java-Mapping... Parameterübergabe-Semantik Alle Parametertypen außer Interfaces: call-by-value Methoden dürfen in-parameter jedoch nicht verändern Verhalten ist sonst undefiniert IDL unterstützt spezielle Typdeklarationen (valuetype), um Objekte zu definieren, die per Wert übergeben werden analog zu interface, aber mit Angabe echter Attribute (State Variables) Interfaces: call-by-reference übergeben wird die Objektreferenz (kein narrow() nötig) IDL unterstützt auch abstrakte Interfaces können von valuetype und interface geerbt werden damit: Übergabesemantik erst zur Laufzeit festgelegt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 141

3.4 CORBA im Detail... 3.4.2 Name Service Der CORBA Namensdienst definiert einen hierarchischen Namensraum Resorts Mexico Greece Hawaii Hyatt Ixtapa Cancun Club Med Playa Blanca Naming Context Object Name Aufbau eines Namens: Resorts Context Name Mexico Club Med Context Name Context Name Cancun Simple Name Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 142 3.4.2 Name Service... Darstellung von Namen (in IDL): struct NameComponent { string id; // Eigentlicher Name string kind; // Typ (analog zu Dateiendungen) ; typedef sequence<namecomponent> Name; Wichtige Methoden des Namensdienstes (NamingContext) bind() / rebind() : Binden von Objektnamen bind_context() / rebind_context() : Binden eines Naming Context unter einem (Kontext-)Namen new_context() : Erzeugen eines Naming Context unbind() : Namen entfernen list() : Ausgabe aller Namen resolve() : Namen in Objekt auflösen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 143

3.4.2 Name Service... Erweiterte Schnittstelle NamingContextExt von NamingContext abgeleitet erlaubt u.a. Verwendung von Pfadnamen in Stringform id z.b.: a /.c /d.e kind NameComponent wichtige Methoden: to_name() : wandelt Namen in Stringform in eine Sequenz von NameComponents um resolve_str() : entspricht resolve(to_name("name")) (Java-)Referenz auf Wurzel-Naming Context: NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references("nameservice")) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 144 3.4.2 Name Service... Beispiel Registrierung eines Objekts in einem neuen Kontext: NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references("nameservice"); // Erzeugen und Binden des Naming Contexts nc.rebind_context(nc.to_name("hello"), nc.new_context()); // Binden der Objektreferenz an hierarchischen Namen nc.rebind(nc.to_name("hello/helloworld"), objref); Auflösen des Namens (ohne NamingContextExt): NameComponent path[] = { new NameComponent("Hello",""), new NameComponent("HelloWorld", "") ; Hello obj = HelloHelper.narrow(nc.resolve(path)); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 145

3.4 CORBA im Detail... 3.4.3 Factories Eine Factory kann auch eine Referenz auf ein neues CORBA-Objekt zurückliefern, das durch einen eigenen Servant implementiert wird Die Factory-Methode muß dazu: einen neuen Servant erzeugen diesen mit servant to reference() beim POA registrieren die CORBA-Referenz mit narrow() in eine Java-Referenz umwandeln und als Ergebnis zurückliefern Eine Referenz auf den POA kann man u.a. über die von der Klasse org.omg.portableserver.servant geerbten Methoden default POA() oder poa() erhalten Beispiel: siehe WWW Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 146 3.4.3 Factories... Beispiel: IDL-Datei module HelloWorld { // Schnittstelle der Objekte, werden vom Client über Factory erzeugt interface Hello { string sayhello(); ; // Schnittstelle des Factory Objekts interface HelloFactory { Hello createhello(in string name); ; ; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 147

3.4.3 Factories... Beispiel: Client (Ausschnitt) // Resolve the object reference in naming NameComponent path[] = ncref.to_name("helloworld"); HelloFactory fact = HelloFactoryHelper.narrow( ncref.resolve(path)); // Erzeuge Objekte über Factory Hello helloref = fact.createhello("klaus"); Hello helloref2 = fact.createhello("uwe"); // Rufe Methode für jedes Objekt auf System.out.println(helloRef.sayHello()); System.out.println(helloRef2.sayHello()); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 148 3.4.3 Factories... Beispiel: Factory-Implementierung im Server class HelloFactoryServant extends HelloFactoryPOA { public HelloFactoryServant() { public Hello createhello(string name) { try { HelloServant helloref = new HelloServant(name); org.omg.corba.object ref = _poa().servant_to_reference(helloref); return HelloHelper.narrow(ref); catch(...) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 149

Client/Server-Programmierung WS 2014/2015 31.10.2014 Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) vi 3.4 CORBA im Detail... 3.4.4 Delegation und Tie-Klassen In der Regel: Objekt-Implementierung erweitert die vom IDL-Compiler erzeugte POA-Klasse, z.b.: public class HelloImpl extends HelloPOA { public String sayhello(string Name) {... Falls dies nicht möglich ist: IDL-Compiler kann Tie-Klasse erzeugen, die Aufrufe delegiert Objekt-Implementierung muß nur noch die Schnittstelle implementieren, z.b.: public class HelloImpl implements HelloOperations { public String sayhello(string Name) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 150

3.4.4 Delegation und Tie-Klassen... Aufbau der Tie-Klasse public class HelloPOATie extends HelloPOA { private HelloOperations _delegate; public HelloPOATie(HelloOperations delegate) { _delegate = delegate; // this() registriert den Servant auch beim RootPOA public HelloWorld.Hello _this() { return HelloWorld.HelloHelper.narrow(_this_object());... public java.lang.string sayhello(java.lang.string Name) { return _delegate.sayhello(name); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 151 3.4.4 Delegation und Tie-Klassen... Server-Programm mit Tie-Klasse ORB orb = ORB.init(args, null); HelloImpl helloimpl = new HelloImpl(); HelloPOATie hellotie = new HelloPOATie(helloImpl); Hello href = hellotie._this(); POA rootpoa = POAHelper.narrow( orb.resolve_initial_references("rootpoa")); rootpoa.the_poamanager().activate(); NamingContextExt ncref = NamingContextExtHelper.narrow( orb.resolve_initial_references("nameservice")); ncref.rebind(ncref.to_name("helloworld"), href); orb.run(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 152

3.4.4 Delegation und Tie-Klassen... Beispiel: Vererbung der Implementierung IDL-Schnittstelle: module HelloWorld { interface Hello { string myname(); string sayhello(in string Name); ; interface HelloToo : Hello { string sayhellotoo(); ; ; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 153 3.4.4 Delegation und Tie-Klassen... Beispiel: Vererbung der Implementierung... Klassendiagramm der Implementierung: HelloOperations String myname() String sayhello(string) HelloTooOperations String sayhellotoo() HelloPOA Hello HelloToo HelloTooPOA HelloPOATie HelloImpl _delegate HelloTooImpl _delegate HelloTooPOATie Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 154

3.4 CORBA im Detail... 3.4.5 Statische und dynamische Aufrufe Statische Aufrufe: schnittstellenspezifische Stubs und Skeletons werden zur Übersetzungszeit aus IDL generiert Dynamic Invocation Interface (DII): erlaubt dem Client Methoden aufzurufen, ohne daß Schnittstelle zur Übersetzungszeit bekannt sein muß für generische Clients, z.b. Property-Editor, graphische Entwicklungsumgebung Information zur Schnittstelle kann zur Laufzeit z.b. über Interface Repository gewonnen werden Client muß Request explizit erzeugen und absenden auch asynchrone Aufrufe möglich Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 155 3.4.5 Statische und dynamische Aufrufe... Dynamic Skeleton Interface (DSI): ermöglicht Objekt-Implementierungen, die zur Übersetzungszeit die Schnittstelle nicht kennen, z.b.: Interpreter, Debugger, dynamisch getypte Sprachen wie Lisp generische CORBA-Schnittstelle für Objekte einer objektorientierten Datenbank generische Proxies (in Verbindung mit DII) Objektadapter reicht alle Aufrufe an dieselbe Methode invoke() der Objektimplementierung weiter Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 156

3.4.5 Statische und dynamische Aufrufe... Beispiel für dynamischen Methodenaufruf über DII NVList arglist = orb.create_list(1); // Argumentliste aufbauen Any arg = orb.create_any(); arg.insert_string("roland"); NamedValue nv = arglist.add_value("name", arg, ARG_IN.value); Any res = orb.create_any(); // Ergebnisobjekt erzeugen res.insert_string(""); NamedValue resv = orb.create_named_value("result", res, ARG_OUT.value); // Request erzeugen: result = sayhello(name) Request req = helloref._create_request(null, "sayhello", arglist, resv); req.invoke(); // Request ausführen // Alternativ: req.send deferred();...; req.get response(); String s = res.extract_string(); // Ergebnis extrahieren Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 157 3.4 CORBA im Detail... 3.4.6 Portable Object Adapter (POA) Komponenten des POA-Modells: Servant: laufende Instanz einer Objektimplementierung Lebenszeit von Servant und Objekt entkoppelt, Objekt ggf. nacheinander durch mehrere Servants realisiert Servant kann mehrere Objekte implementieren Objekt-ID: im Bereich eines POA eindeutige ID zur Zuordnung von Anfragen an Servants Objektreferenz: enthält eindeutige ID des POA und Objekt-ID zusätzlich ggf. Ort des Servers / POAs,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 158

3.4.6 Portable Object Adapter (POA)... Komponenten des POA-Modells:... POA: Namensraum für Objekt-IDs bildet Objekt-IDs auf Servants ab bestimmt über POA Policies das Verhalten der von ihm verwalteten Servants Active Object Map: Abbildung von Objekt-IDs auf Servants aktives Objekt: Objekt-ID steht in Active Object Map aktiver Servant: ist in Active Object Map eingetragen Default Servant: bearbeitet Anfragen für inaktive Objekte muß bei Bedarf von der Anwendung registriert werden Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 159 3.4.6 Portable Object Adapter (POA)... Komponenten des POA-Modells:... Servant Manager: kann bei Bedarf von der Anwendung registriert werden übernimmt bei Anfragen an inaktive Objekte ggf.: Aktivierung eines neuen Servants Zuordnung der Objekt-ID zu vorhandenem Servant POA Manager: kapselt Zustand von POAs kann POA aktivieren oder veranlassen, daß Anfragen (temporär) zwischengespeichert oder verworfen werden Adapter Activator: aktiviert (Kind-)POA, wenn Server Anfrage an nichtexistierenden POA erhält Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 160

3.4.6 Portable Object Adapter (POA)... POA-Architektur Root Servant POA Active Object Map Object ID POA Manager Adapter Activator Objektreferenz Servant Zeiger POA A Default Servant Object ID Object ID Object ID POA B Servant Manager Object ID Object ID Adapter Activator POA C Object ID Default Servant Servant Servant Servant Manager Servant Servant Servant Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 161 3.4.6 Portable Object Adapter (POA)... POA Policies Thread Policy: Multithreading im Server? SINGLE THREAD MODEL: POA ruft Methoden eines Servants sequentiell auf ORB CRTL MODEL: implementierungsspezifisch, mehrere Threads erlaubt Lifespan Policy: Lebensdauer der Objekte TRANSIENT: Objekte leben nur so lange wie POA PERSISTENT: Objekte können länger leben wie POA POA mit gegebenem Namen; bei Server-Neustart: Server muß wieder ursprünglichen Port benutzen Server muß POA gleichen Namens erzeugen (nicht: Objektzustand wird persistent gespeichert) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 162

3.4.6 Portable Object Adapter (POA)... POA Policies... Object ID Uniqueness Policy UNIQUE ID: nur eine Objekt-ID pro Servant MULTIPLE ID: mehrere Objekt-IDs pro Servant erlaubt ID Assignment Policy: wer erzeugt Objekt-IDs? USER ID: Anwendung, SYSTEM ID: POA Request Processing Policy USE ACTIVE OBJECT MAP ONLY: Objekt-IDs werden nur über Active Object Map (AOM) auf Servants umgesetzt USE DEFAULT SERVANT: Wenn Objekt-ID nicht in AOM ist: Anfrage an registrierten Default Servant leiten USE SERVANT MANAGER: Wenn Objekt-ID nicht in AOM ist: über registrierten Servant Manager neuen Servant erzeugen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 163 3.4.6 Portable Object Adapter (POA)... POA Policies... Servant Retention Policy [NON ]RETAIN: Servants werden [nicht] in AOM aufgenommen Implicit Activation Policy IMPLICIT ACTIVATION: implizite Aktivierung von Servants durch POA, z.b. bei POA.servant to reference(), POA.servant to id() ggf. Typkonvertierung von Servant nach Objektreferenz NO IMPLICIT ACTIVATION: Servant muß explizit aktiviert werden POA.activate object(): POA generiert Objekt-ID POA.activate object with id(): Anwendung generiert Objekt-ID Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 164

3.4.6 Portable Object Adapter (POA)... Standard-Policy des Root-POA Thread Policy: ORB CRTL MODEL Lifespan Policy: TRANSIENT Object ID Uniqueness Policy: UNIQUE ID ID Assignment Policy: SYSTEM ID Request Processing Policy: USE ACTIVE OBJECT MAP ONLY Servant Retention Policy: RETAIN Implicit Activation Policy: IMPLICIT ACTIVATION Policy kann nicht geändert werden, ggf. muß neuer POA erzeugt werden Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 165 3.4.6 Portable Object Adapter (POA)... Beispiel: Leichtgewichtige Objekte... Objekte mit kleinem Zustand Attribute können in Objekt-ID eincodiert werden Alle Objekte werden durch einen einzigen (Default-)Servant realisiert Vorteil: Skalierbarkeit geringer Ressourcenverbrauch beim Server Anmerkung: mit DSI kann ein einziger Servant sogar Objekte unterschiedlicher Klassen implementieren... Vollständiger Code: siehe WWW Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 166

3.4 CORBA im Detail... 3.4.7 GIOP, IIOP und IOR Seit CORBA 2.0: Kommunikationsprotokoll zwischen Objekten bzw. ORBs ist standardisiert GIOP: General Inter-ORB Protocol Spezifikation, wie Protokolle auszusehen haben IIOP: Internet Inter-ORB Protocol konkretes Protokoll auf Basis von TCP/IP Damit: Interoperabilität zwischen verschiedenen ORB-Implementierungen IOR: Interoperable Object Reference Aufbau von Objektreferenzen ist ebenfalls standardisiert Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 167 3.4.7 GIOP, IIOP und IOR... GIOP Spezifiziert unter anderem: Annahmen über Transportschicht verbindungsorientiert, duplex, zuverlässig, stromorientiert binäres Übertragungsformat für IDL-Datentypen CDR: Common Data Representation unterstützt Little-Endian und Big-Endian über Tag, Empfänger konvertiert bei Bedarf keine Typ-Tags, d.h. Empfänger muß Datentyp kennen (Problem ggf. bei dynamischen Aufrufen) acht Nachrichtenformate Request, Reply, CloseConnection,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 168

3.4.7 GIOP, IIOP und IOR... IIOP und IOR Implementierung des GIOP auf Basis von TCP/IP Hauptaufgabe: Festlegung des konkreten Aufbaus von IORs Genereller Aufbau einer IOR: Repository ID (standardisiert) Verbindungsendpunkt (standardisiert) Object Key (proprietär) Verb. Obj.Key... Object-Key enthält Objekt-ID und POA-Namen mehrere Einträge für Verbindungsendpunkt / Object-Key möglich, damit z.b. Objekt über verschiedene GIOP-Protokolle erreichbar Objekt mehrfach vorhanden (Lastausgleich, Fehlertoleranz) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 169 3.4.7 GIOP, IIOP und IOR... IIOP und IOR... Verbindungsendpunkt bei IIOP: Host / IP-Adresse und Port Beispiel für Inhalt einer IOR TypeId : IDL:omg.org/CosNaming/NamingContextExt:1.0 TAG_INTERNET_IOP Profiles: Profile Id: 0 IIOP Version : 1.2 Host: 141.99.179.102 Port: 33523 Object key (URL): StandardNS/NameServer POA/_root Object key (hex): 0x53 74 61 6E 64 61 72 64 4E 53 2F 4E 61 6D 65 53 65 72 76 65 72 2D 50 4F 41 2F 5F 72 6F 6F 74 Formatiert mit dem dior-tool des JacORB Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 170

3.4.7 GIOP, IIOP und IOR... Nutzung von IORs IORs in String-Form können beliebig zwischen Objekten ausgetauscht werden, z.b. als Methoden-Parameter oder -Ergebnis über Dateien, WWW,... Damit: Objekte können auch ohne Name Service bekanntgegeben werden Relevante Methoden (in Klasse ORB): object_to_string() : Erzeugt String-Form einer CORBA- Objektreferenz string_to_object() : Wandelt String wieder in CORBA- Objektreferenz um Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 171 3.4 CORBA im Detail... 3.4.8 Implementation Repository (IMR) ORBs unterstützen typischerweise zwei Methoden, wie IORs an Servants gebunden werden: direktes Binden: IOR enthält Host/Port des Servers, in dem Servant läuft indirektes Binden: IOR enthält Host/Port eines externen Brokers, d.h. des IMR IMR kennt Ort (Host/Port) des Servers IMR unterstützt u.a.: automatischer Server-Startup Migration von Servern bzw. Objekten automatischer Lastausgleich Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 172

3.4.8 Implementation Repository (IMR)... CORBA Spezifikation standardisiert nur Interaktion zwischen Clients und IMR ausreichend um Interoperabilität zu sichern Realisierung und Funktionsumfang des IMR sowie Schnittstelle zu Servern ist ORB-spezifisch Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 173 3.4.8 Implementation Repository (IMR)... Beispiel: Automatischer Server-Start Client Objektreferenz IDL:HelloWorld/Hello:1.0 frodo:2133 mypoa:hello1 4 LOCATION_FORWARD [bilbo:1799] 1 sayhello() [mypoa:hello1] 5 7 sayhello() [mypoa:hello1] Reply von sayhello() 2 rsh bilbo java HelloServer Implementation Repository (frodo:2133) Server Tabelle HelloWorld Test mypoa rsh bilbo java HelloServer Print Server (bilbo: 1799) mypoa hello1 6 3 ready [mypoa, bilbo: 1799] bilbo:1799 gandalf: 1234 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 174

3.4.8 Implementation Repository (IMR)... Beispiel: Automatischer Server-Start... 1. Client ruft Methode über IOR auf, Anfrage wird an IMR geleitet 2. IMR sieht in Server-Tabelle nach, ob POA existiert. Falls nicht, wird Server (mit POA) gestartet 3. Server sendet Fertig-Meldung an IMR, mit Host/Port. IMR trägt Information in Server-Tabelle ein 4. IMR konstruiert neue IOR, die Host/Port des Servers enthält und sendet LOCATION FORWARD-Nachricht an Client 5. Client sendet Anfrage zum zweiten Mal, diesmal an Server 6. Server findet POA über POA-Namen. POA findet passenden Servant über Objekt-ID und ruft Methode auf 7. Ergebnis wird an Client zurückgegeben Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 175 3.4 CORBA im Detail... 3.4.9 Interface Repository (IR) Online Datenbank mit Schnittstellenbeschreibungen CORBA spezifiziert nur Zugriffsmethoden (lesen / schreiben) Implementierung ist ORB-spezifisch ebenso, wie IDL-Spezifikationen in das IR kommen IR nützlich u.a. für: Typprüfung der Parameter durch den ORB (auch bei DII) Verbindung mehrerer ORBs Metadaten für Clients und Server (für DII, DSI) z.b. Klassenbrowser, Anwendungsgeneratoren,... selbstbeschreibende Objekte (Introspection) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 176

3.4.9 Interface Repository (IR)... Wichtige Klassen und Methoden IR definiert Klassen (genauer: Schnittstellen) für alle IDL-Konstrukte, z.b.: ModuleDef, InterfaceDef, OperationDef, ParameterDef,... Objekte der Klassen enthalten einander, entsprechend der Verschachtelung in der IDL Basisklassen Container und Contained InterfaceDef enthält mehrere OperationDefs,... Von Contained erbt jede Klasse die Methode describe() liefert Beschreibung des IDL-Konstrukts als Struct z.b. struct OperationDescription enthält Name, Repository-ID, Ergebnistyp, Parameterliste, Exceptions,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 177 3.4.9 Interface Repository (IR)... Startpunkte für die IR-Information Methode _get_interface_def() liefert InterfaceDef eines Objekts: Hello helloref = HelloHelper.narrow(ncRef.resolve(path)); org.omg.corba.object c = helloref._get_interface_def(); org.omg.corba.interfacedef id = org.omg.corba.interfacedefhelper.narrow(c); Methode lookup_id() des IR liefert IR-Objekt zu einer Repository-ID Repository-ID beschreibt IDL-Element eindeutig, z.b. im Hello-World-Beispiel: IDL:HelloWorld/Hello:1.0 für Interface Hello IDL:HelloWorld/Hello/sayHello:1.0 für Operation Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 178

Client/Server-Programmierung WS 2014/2015 07.11.2014 Betriebssysteme / verteilte Systeme rolanda.dwismuellera@duni-siegena.de Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) vii 3.4 CORBA im Detail... 3.4.10 Sicherheit CORBA-Spezifikation enthält Security Attribute Service Basis ist GIOP über (z.b.) SSL/TLS sichert Vertraulichkeit/Integrität der Nachrichten sichert Authentifizierung des Servers Security Attribute Service realisiert zusätzlich: Authentifizierung des Clients u.a. über Benutzername und Paßwort Weitergabe von Sicherheitsattributen (z.b. Identität, Privilegien) des Clients an den Server damit: Delegation von Rechten möglich, d.h. Server kann für Benutzer agieren Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 179

3 CORBA... 3.5 Zusammenfassung CORBA definiert ein verteiltes, sprach- und plattform-unabhängiges Objektmodell standardisiertes Protokoll (GIOP, IIOP) stellt Interoperabilität sicher Zentral: Schnittstellenbeschreibung über OMG IDL automatische Erzeugung von Stubs und Skeletons Keine 1-zu-1 Beziehung zwischen Objekten und Objektimplementierungen (Servants) POA kann unterschiedliche Policies realisieren CORBA spezifiziert Schnittstellen zu etlichen Diensten Namensdienst, Ereignisdienst, Lebenszyklus,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 180 Client/Server-Programmierung WS 2014/2015 4 RMI / IIOP Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 181

4 RMI / IIOP... Inhalt RMI über IIOP Farley, Crawford, Flanagan: S. 88ff, Kap. 7 http://java.sun.com/j2se/1.5.0/docs/guide/rmi-iiop Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 182 4 RMI / IIOP... RMI über IIOP Ziel: Verbindung von Java-RMI Objekten mit nicht-java (CORBA) Objekten Vorgehensweise: RMI nutzt CORBA IIOP-Protokoll zur Kommunikation zwischen Objekten Damit: Java-Client kann CORBA Objekt über RMI nutzen CORBA-Client kann RMI-Objekt über CORBA nutzen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 183

4 RMI / IIOP... Vorgehen zur Nutzung von RMI/IIOP Basisklasse: Remote-Objekte müssen von javax.rmi.portableremoteobject erben statt von java.rmi.server.unicastremoteobject RMI Compiler: Stubs und Skeletons müssen über rmic -iiop erzeugt werden Option -idl erzeugt zusätzlich OMG IDL Datei Namensdienst: statt RMI Registry muß JNDI benutzt werden, um auf CORBA-Namensdienst zuzugreifen Downcast: vom Namensdienst erhaltene Objektreferenzen müssen über PortableRemoteObject.narrow() in gültige Referenzen umgewandelt werden Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 184 4 RMI / IIOP... Beispiel: Gemischtes Hello World Server mit RMI realisiert Schnittstelle: import java.rmi.remote; import java.rmi.remoteexception; public interface Hello extends Remote { String sayhello(string to) throws RemoteException; Client wahlweise mit RMI oder CORBA Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 185

4 RMI / IIOP... Server-Code import javax.naming.*; import java.rmi.*; import java.util.*; import javax.rmi.portableremoteobject; public class HelloServer extends PortableRemoteObject implements Hello { public HelloServer() throws RemoteException { super(); public String sayhello(string to) { System.out.println("Hello-Server called"); return "Hello World to " + to + "!"; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 186 4 RMI / IIOP... Server-Code... public static void main(string args[]) { try { // Server Objekt erzeugen HelloServer obj = new HelloServer(); // Referenz über JNDI beim Namensdienst registrieren Properties props = new Properties(); props.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.cnctxfactory"); props.put("java.naming.provider.url", "iiop://bspc02:5555"); Context ctx = new InitialContext(props); ctx.rebind("helloworld", obj); catch (Exception e) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 187

4 RMI / IIOP... RMI Client public static void main(string args[]) { try { // Obektreferenz über JNDI vom Namensdienst besorgen Properties props = new Properties(); props.put(context.initial_context_factory, "com.sun.jndi.cosnaming.cnctxfactory"); props.put(context.provider_url, "iiop://bspc02:5555"); Context ctx = new InitialContext(props); Hello obj = (Hello) PortableRemoteObject.narrow(ctx.lookup("HelloWorld"), Hello.class); // Remote Methode aufrufen System.out.println(obj.sayHello("Roland")); catch (Exception e) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 188 4 RMI / IIOP... CORBA Client public static void main(string args[]) { try{ // ORB erzeugen und initialisieren ORB orb = ORB.init(args, null); // Root naming context holen org.omg.corba.object ns = orb.resolve_initial_references("nameservice"); NamingContextExt ncref = NamingContextExtHelper.narrow(ns); // Objektreferenz vom Namensdienst besorgen NameComponent path[] = ncref.to_name("helloworld"); Hello helloref = HelloHelper.narrow(ncRef.resolve(path)); System.out.println(helloRef.sayHello("Peter")); catch(exception e) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 189

4 RMI / IIOP... Code-Erzeugung mit RMI-Server / CORBA-Client Client Seite Server Seite _HelloStub.java Hello.java HelloServer.java HelloHolder.java HelloHelper.java Hello.java idlj javac Hello.class HelloServer.class HelloOperations.java HelloClient.java javac HelloClient.class... rmic iiop idl Hello.idl _Hello_Stub.class _HelloServer_Tie.class Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 190 Client/Server-Programmierung WS 2014/2015 5 Java Komponenten-Modelle Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 191

5 Java Komponenten-Modelle... Inhalt Komponenten-Modelle Java Beans Enterprise Java Beans (EJB 3.0) Burke / Monson-Haefel Farley / Crawford / Flanagan, Kap. 6 (EJB 2.1!) Orfali / Harkey, Kap. 27-34 (EJB 2.1!) Sriganseh / Brose / Silverman http://docs.oracle.com/javase/7/docs/api/java/beans/ package-summary.html http://docs.oracle.com/javaee/6/tutorial/doc Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 192 5 Java Komponenten-Modelle... 5.1 Komponenten-Modelle Was sind Software-Komponenten? Software-Komponenten sind ausführbare Software-Einheiten, die unabhängig hergestellt, erworben und konfiguriert werden und aus denen sich funktionierende Gesamtsysteme zusammensetzen lassen. Im Vordergrund: Zusammensetzungsaspekt Eine Komponente ist: eine funktional und technisch abgeschlossene, ausführbare Einheit unabhängig als Einheit entwickelbar und konfigurierbar wiederverwendbar nur über genau festgelegte Schnittstellen ansprechbar Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 193

5.1 Komponenten-Modelle... Begriffe Visuelle Komponente stellt etwas auf dem Bildschirm (der Anwendung) dar Nichtvisuelle Komponente ist für Benutzer der Anwendung nicht sichtbar Komponentenmodell: definiert Architektur der Komponenten u. Struktur ihrer Schnittstellen Mechanismen zur Zusammenarbeit mit Container und anderen Komponenten Container: Ausführungsumgebung für Komponenten Kontext, in dem Komponenten gruppiert und miteinander verbunden werden stellt Management- und Kontroll-Dienste zur Verfügung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 194 5.1 Komponenten-Modelle... Software-Entwicklung mit Komponenten Zwei Arten von Programmierern: Komponenten-Entwickler (component developer) implementiert eine Komponente Komponenten-Anwendungsentwickler (component assembler) entwickelt eine Anwendung (oder neue Komponenten) durch Zusammenfügen existierender Komponenten i.d.r. mit (graphischer) Werkzeug-Unterstützung! Bei Komponenten daher zwei verschiedene Nutzungsphasen: Design Time: während der Anwendungsentwicklung Run Time: während der Ausführung der Anwendung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 195

5.1 Komponenten-Modelle... Software-Entwicklung mit Komponenten: Beispiel Zusammenbau einer Komponente aus Teilkomponenten: public class MyEventAdapter { { private TextBean target; MyEventAdapter(TaextBean t) { target = t; public void actionperformed( ActionEvent e) { if (x < max) target.setvalue(val); = x; Verwendung der Komponente in einer Anwendung: Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 196 5.1 Komponenten-Modelle... Werkzeug-Unterstützung (Bsp: Visual Café) Komponenten auswahl Anwendung mit Komponenten Editor für Komponenten Eigenschaften Wizard zur Komponenten Verknüpfung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 197