CORBA Implementierung von Client und Server



Ähnliche Dokumente
Vorkurs C++ Programmierung

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

CORBA. Systemprogrammierung WS

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Objektbasierte Entwicklung

Java Virtual Machine (JVM) Bytecode

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Java Kurs für Anfänger Einheit 5 Methoden

Kapitel 6. Vererbung

Objektorientierte Programmierung

Kommunikation. Björn und Georg

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

Seminar Ausgewählte Komponenten von Betriebssystemen. IDL4 Compiler

Kapitel 6. Vererbung

Übungen zu Softwaretechnik

Remote Method Invocation

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

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

Distributed Computing Group

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

3 Objektorientierte Konzepte in Java

Fakultät Angewandte Informatik Lehrprofessur für Informatik

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Mobile und Verteilte Datenbanken

Einführung in die C++ Programmierung für Ingenieure

Kapitel 6. Vererbung

Einführung in die Programmierung

C/C++-Programmierung

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Applet Firewall und Freigabe der Objekte

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Einführung in die Programmierung (EPR)

Client-Server-Beziehungen

Zählen von Objekten einer bestimmten Klasse

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Modul Software Komponenten 10 Komponentenarchitektur

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Programmieren in Java

2. Semester, 2. Prüfung, Lösung

3. Stored Procedures und PL/SQL

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

Middleware. Einführung in CORBA. Middlewareplattform CORBA. CORBA: Eigenschaften

Computeranwendung und Programmierung (CuP)

Tagesprogramm

Programmierkurs Java

Prinzipien Objektorientierter Programmierung

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

Client/Server-Programmierung

Client/Server-Programmierung

Java Einführung Abstrakte Klassen und Interfaces

Meeting C++ C++11 R-Value Referenzen

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

virtual Wertpapier& operator=(const Wertpapier&); // VIRTUELLE ZUWEISUNG protected: static enum {wortfeldlaenge = 20}; char* name_z; double kurs; };

Grundlagen von Python

Alltagsnotizen eines Softwareentwicklers

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Java Einführung Collections

Delegatesund Ereignisse

Konstruktor/Destruktor

Hello World from CORBA

Einführung in die Programmierung

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

C# im Vergleich zu Java

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Servlet Debugging

Einführung in die Programmierung für Wirtschaftsinformatik

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Algorithmen und Datenstrukturen

13. Tutorium zu Programmieren

Effizientes Memory Debugging in C/C++

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

Software Engineering Klassendiagramme Einführung

Musterlösung Übungsblatt 2 Netzprogrammierung WS 05/06

Java: Vererbung. Teil 3: super()

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

Objektorientierte Programmierung. Kapitel 12: Interfaces

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Klassenhierarchie der Skeletons für eine Schnittstelle Foo. IDL und Java. Separierung von Klientenseite und Serverseite

Vererbung & Schnittstellen in C#

4 Generische Programmierung. 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer)

Internetanwendungstechnik (Übung)

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einführung in die Java- Programmierung

Große Übung Praktische Informatik 1

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

Von der UML nach C++

Einführung in die Programmierung

Szenario 3: Service mit erweiterter Schnittstelle

Praktikum Betriebssysteme 1. Aufgabe (1)

Objektorientierte Programmierung mit C++ Vector und List

Besonderheiten von C#

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Transkript:

CORBA Implementierung von Client und Server J. Heinzelreiter WS 2003/04

Implementierung des Clients Initialisierung und Freigabe des ORBs. Mapping von Interfaces. Behandlung von Objektreferenzen. Verwaltung von Proxies (Reference-Counting). Parameterübergabe Regeln für Speicherverwaltung Verwendung von Smart-Pointer-Klassen 2 CORBA/Client&Server

Initialisierung und Freigabe des ORBs Initialisierung und Übernahme der ORB-Parameter using namespace CORBA; int main(int argc, char* argv[]) { ORB_var orb; // Smart-Pointer auf ORB try { orb = ORB_init(argc, argv); } catch (Exception& e) { return 1; } Freigabe orb->destroy(); } // ~ORB_var(): release(orb); 3 CORBA/Client&Server

Mapping von Interfaces IDL-Interfaces interface X { void f(); }; werden auf C++-Klassen ( proxies ) abgebildet. typedef X* X_ptr; class X : public virtual Object { public: static X_ptr _narrow(object_ptr obj); static X_ptr _duplicate(x_ptr); static X_ptr _nil(); virtual void f(); }; Zusätzlich wird Smart-Pointer-Klasse X_var generiert. 4 CORBA/Client&Server

Objektreferenzen - Proxies Proxies werden vom ORB instanziert: X_ptr ptrx = getx(); Entfernter Methoden-Aufruf: ptrx->f(); ptrx Client ptrx->f() X (proxy) 1 Reference-Counter f() Server POA_X (skeleton) f() X_impl 5 CORBA/Client&Server

Objektreferenzen Reference-Counting ORB instanziert Referenz (Counter wird auf 1 gesetzt) X_ptr ptr1 = getx(); ptr1 X (proxy) 1 Kopieren der Referenz: X_ptr ptr2 = X::_duplicate(ptr1); ptr1 ptr2 X (proxy) 2 Freigabe der Referenzen: CORBA::release(ptr1); CORBA::release(ptr2); 6 CORBA/Client&Server ptr1 ptr2 X (proxy) 0

Smart-Pointer-Klasse für Referenzen (1) class X_var { private: X_ptr _ptr; // Pointer auf verwaltete Referenz public: // Initialisierung mit nil-referenz. X_var(); // Besitz an Referenz übernehmen. X_var(X_ptr p); // Copy-Konstr.: Referenz kopieren (X::_duplicate()). X_var(const X_var& pv); // Destruktor: Referenz freigeben (CORBA::release()). ~X_var(); // Selektionsoperator: Delegation an _ptr. X_ptr& operator->() const; 7 CORBA/Client&Server

Smart-Pointer-Klasse für Referenzen (2) class X_var {... // Zuweisungsoperatoren: Besitz übernehmen bzw. kopieren. X_var& operator= (X_ptr p); X_var& operator= (const X_var& pv); // Konversionsoperator. operator X_ptr& (); // Funktionen zum direkten Zugriff auf _ptr. Für Compiler, // die Konversionsoperatoren falsch implementieren. X_ptr in() const; X_ptr& inout(); X_ptr& out(); // Übergibt Besitz an Referenz an den Rufer. X_ptr _retn(); } 8 CORBA/Client&Server

Verwendung der _var Klasse Zuweisung einer Referenz Object_var obj = orb->string_to_object( ); Überprüfung auf nil-referenz (Konversionsoperator) if (is_nil(obj)) { } Downcast: _narrow inkrementiert den Ref-Counter X_var ptr1 = X::_narrow(obj); Kopieren der Objektreferenz X_var ptr2 = ptr1; Zugriff auf Funktion von Interface X ptr1->f(); Ref-Conter wird von ~X_var() dekrementiert. 9 CORBA/Client&Server

Austausch von Referenzen Konvertierung in Strings interface ORB { string object_to_string(in Object obj); Object string_to_object(in string str); }; Naming Service (in Modul CosNaming) interface NamingContext { (re)bind(in Name n, in Object o); Object resolve(in Name n);(innamen); (NameN)(}; Methodenaufruf interface X { Y gety(); // Y ist ebenfalls ein IDL-Interface }; 10 CORBA/Client&Server

Regeln für Parameterübergabe Die Art der Parameterübergabe hängt vom directional attribute und vom Parametertyp ab: IDL in inout out return simple simple simple & string const char* char *& X X_ptr X_ptr & sequ const sequ & sequ & struct, fixed const struct & struct & struct, var. const struct & struct & array, fixed const array array_slice * simple & char *& X_ptr & sequ *& struct & struct *& array_slice * simple char * X_ptr sequ * struct struct * array_slice * array, var. const array array_slice * array_slice*& array_slice * Stack oder Heap Heap: Freigabe Heap: Allokierung und Freigabe 11 CORBA/Client&Server

Parameter mit fixer Länge IDL: interface X { long f(in long lin, inout long linout, out long lout); }; C++: typedef Long& Long_out; CORBA::Long f(corba::long lin, CORBA::Long& linout, CORBA::Long_out lout); Verwendung: X_var x = ; // Hole Referenz auf Objekt CORBA::Long in = 5; CORBA::Long inout = 9; CORBA::Long out, ret; ret = x->f(in, inout, out); cout << inout << out << ret << endl; 12 CORBA/Client&Server

Übergabe von Stringparametern IDL: string f(in string sin, // interface X inout string sinout, out string sout); C++: char* f(const char* sin, char*& sinout, String_out sout); Verwendung: X_var x = ; // Hole Referenz auf Objekt // inout muss mit dynamisch allokiertem Wert initialisiert werden, String_var inout = string_dup("yyy"); String_var out, ret; ret = x->f("xxx", inout, out); cout << out << inout << ret << endl; // String_out sorgt dafür, dass out vor zweitem Aufruf freigegeben wird. ret = x->f("xxx", inout, out); 13 CORBA/Client&Server

Parameter mit variabler Länge IDL: typedef sequence<long> LongSeq; LongSeq f(in LongSeq sin, // interface X inout LongSeq sinout, out LongSeq sout); C++: typedef LongSeq*& LongSeq_out; LongSeq* f(const LongSeq& sin, LongSeq& sinout, LongSeq_out sout); Verwendung: X_var x = ; // Hole Referenz auf Objekt LongSeq_var in = new LongSeq; LongSeq_var inout = new LongSeq; LongSeq_var out, ret; in->length(2); in[0] = 111; in[1] = 222; inout->length(1); inout[0] = 333; ret = x->f(in, inout, out); 14 CORBA/Client&Server

Übergabe von Objektreferenzen IDL: interface Article { } Article f(in Article ain, // interface X inout Article ainout, out Article aout); C++: Article_ptr f(article_ptr ain, Article_ptr& ainout, Article_out aout); Verwendung: X_var x = ; // Hole Referenz auf Objekt Article_var ain = findarticlebyid("a001"); Article_var ainout = findarticlebyid("a002"); Article_var aret = x->f(ain, ainout, aout); ainout->setstock(100); // Entfernter Methodenaufruf aout->setprice(1000.0); 15 CORBA/Client&Server

Implementierung des Servers Initialisierung und Freigabe des ORBs. Implementierung von Servants. Erzeugung Objektreferenzen. Parameterübergabe Regeln für Speicherverwaltung Verwendung der Smart-Pointer-Klassen 16 CORBA/Client&Server

Initialisierung und Freigabe des ORBs (1) using namespace CORBA; Initialisierung des ORBs ORB_var orb; orb = ORB_init(argc, argv); Referenz auf Object-Adapter (POA) holen Object_var poaobj = orb->resolve_initial_references("rootpoa"); PortableServer::POA_var rootpoa = PortableServer::POA::_narrow(poaObj); Aktivierung des POA-Managers PortableServer::POAManager_var manager = rootpoa->the_poamanager(); manager->activate(); 17 CORBA/Client&Server

Initialisierung und Freigabe des ORBs (2) Instanzierung und Registrierung der Servants X_impl servantx(rootpoa); X_var refx = servantx._this(); Starten der Dispatch-Schleife des ORBs orb->run(); Terminieren des ORBs orb->shutdown(wait_for_completion); Freigabe des ORBs orb->destroy(); 18 CORBA/Client&Server

Implementierung des Servants (1) interface X { void f(); }; ServantBase virtual POA_Ptr _default_poa() virtual Boolean _is_a(...) POA_X X_ptr _this() virtual void f() RefCountServantBase virtual void _add_ref() virtual void _remove_ref() X_impl virtual POA_Ptr _default_poa() virtual void f() 19 CORBA/Client&Server

Implementierung des Servants (2) ServantBase: gemeinsame Funktionaltät aller Servants. Enthält Implementierungen von Methoden von CORBA::Object (z.b. _is_a(), _non_existent()). _default_poa() liefert Referenz auf RootPOA. RefServantBase: Reference-Counting für Servants. abgeleitete Servants müssen am Heap allokiert werden. Freigabe mit _remove_ref() (und nicht mit delete). POA_X: Skeleton-Code Wird vom IDL-Compliler für jedes IDL-Interface generiert Enthält für jede Operation des IDL-Interfaces eine virtuelle Methode. _this(): Aktivierung des Servants und Generierung einer Objektreferenz. X_impl: Servant Implementierung aller Methoden des Skeletons. _default_poa() überschreiben, falls POA mit spezifischen Policies benötigt wird. 20 CORBA/Client&Server

Parameterübergabe Regeln für Parameterübergabe sind das Gegenstück zu den entsprechenden Regeln auf Client-Seite. Wenn Client einen Parameter freigeben muss, muss der Server diesen allokieren. Parameter mit fixer Länge werden by value oder by reference übergeben. in-parameter dürfen nicht überschrieben oder freigegeben werden. out-parameter und Rückgabewerte mit variabler Länge werden vom Server dynamisch allokiert. inout-parameter mit variabler Länge werden vom Client allokiert. Der Server kann diese überschreiben. Strings können auch freigegeben und neu allokiert werden. 21 CORBA/Client&Server

Parameter mit fixer Länge IDL: interface X { long f(in long lin, inout long linout, out long lout); }; Skeleton: CORBA::Long f(corba::long lin, CORBA::Long& linout, CORBA::Long_out lout) = 0; Implementierung: CORBA::Long X_impl::f( ) { cout << lin << endl; linout += 1; lout = 0; return 1; } 22 CORBA/Client&Server

Parameter mit variabler Länge IDL: typedef sequence<long> LongSeq; LongSeq f(in LongSeq sin, // interface X inout LongSeq sinout, out LongSeq sout); Skeleton: typedef LongSeq*& LongSeq_out; LongSeq* f(const LongSeq& sin, LongSeq& sinout, LongSeq_out sout) = 0; Implementierung: LongSeq* X_impl::f( ) { sinout.length(sin.length()); for (int i=0; i<sin.length(); i++) sinout[i] = sin[i]; sout = new LongSeq; sout->length(1); sout[0] = 5; LongSeq_var sret = new LongSeq; sret->length(2); sret[0] = 1; sret[1] = 2; return sret._retn(); } 23 CORBA/Client&Server

Übergabe von Stringparametern IDL: string f(in string sin, // interface X inout string sinout, out string sout); Skeleton: char* f(const char* sin, char*& sinout, String_out sout) = 0; Implementierung: char* X_impl::f( ) { string_free(sinout); sinout = string_dup(sin); sout = string_dup("outstring"); return string_dup("returnstring"); } 24 CORBA/Client&Server

Übergabe von Objektreferenzen IDL: interface Article { } Article f(in Article ain, // interface X inout Article ainout, out Article aout); Skeleton: Article_ptr f(article_ptr ain, Article_ptr& ainout, Article_out aout) = 0; Implementierung: Article_ptr X_impl::f( ) { if (!CORBA::is_nil(aIn)) ain->setprice(500.0); CORBA::release(aInOut); ainout = Article::_duplicate(sIn); sout = _this(); Article_var aret = stock->findarticlebyid("a001"); return aret->_retn() ; } 25 CORBA/Client&Server