Exercices Corba
Télécharger tous les
exercices Corba (projets eclipse à dézipper dans
workspace)
Serveurs et clients
simples
Ne pas oublier de lancer le serveur de noms:
Avec le JDK :
$JAVA_HOME/bin/orbd &
Avec omniORB:
omniNames -start -logdir $PWD &
Correcteur
orthographique avec Java
Cet exercice a pour but de travailler avec un argument inout de type
string.
// corrector.idl - compile with:
// idlj -fallTIE -td src corrector.idl
module p1 {
interface Corrector {
void correct ( inout string word );
};
};
Solution: corrector-corba-java.zip
Rappel simple
Cet exercice, un rappel par le client aussi simple que possible,
présente les mêmes diffcultés Corba que l'exemple
papier - pierre -
ciseaux .
module rappel {
interface Client {
string rappel(in string message);
};
interface Serveur {
void donner_client(in Client c);
};
};
Enoncé: Programmer client et serveur avec callback.idl
1. comportement très simple du serveur et du client
- le client fait un echo
- le serveur rappelle tout de suite
2. le serveur rappelle après un certain temps (par exemple
après une entrée au clavier)
Conception
==========
Que fait le programme "client" ?
// initialisation ORB+POA classique
// instancie et enregistre un objet client qui implémente l'IDL
(classique)
// appeler le serveur en lui transmettant la référence du
client
// boucle d'attente pour les rappels
Que fait le programme "serveur" ?
// initialisation ORB+POA classique
// instancie et enregistre un objet serveur qui implémente l'IDL
(classique)
// boucle d'attente
Les ingrédients pour faire marcher le client avec le rappel
(callback)
==========================================
// en C++
#include <unistd.h> // for usleep()
// boucle d'événements en C++
while( condition_portant_sur_client ) {
usleep ( 500000 ); // dormir pendant un
certain nombre de microsecondes.
if ( orb->work_pending() ) {
orb->perform_work();
cout << "orb->perform_work()
succeeded" << endl;
// break;
};
}
// comment garder la référence du client
côté serveur:
Client::_duplicate(objet_reference_corba_client);
// en Java
boolean
condition_portant_sur_client = true;
while(
condition_portant_sur_client ) {
try {
Thread.sleep ( 500 );
// dormir pendant un certain nombre de millisecondes.
}
catch (InterruptedException e) {
e.printStackTrace();
}
if (
orb.work_pending() ) {
orb.perform_work();
System.out.println ("orb->perform_work() succeeded" );
};
}
Solutions:
Rappel simple Corba en C++ -
Rappel simple Corba en C++ avec module
Rappel simple Corba en Java avec module
Jeu papier - pierre -
ciseaux avec C++
Le jeu papier - pierre - ciseaux : concevoir et programmer une version
Corba (en ligne de commande).
Deux voies pour la conception:
- faire un diagramme de séquence
- trouver les objets, et lister leurs méthodes
Ensuite on est est prêt à écrire l'IDL.
solution Jeu papier - pierre -
ciseaux Corba/C++
Diagramme de séquence
Avec omniORB
Pour utiliser les templates tie, il faut demander à omniidl de
les générer avec : -Wbtp
omniidl -bcxx -Wbtp jeu.idl
Avec MICO
La seule différence par rapport à la version omniORB est
la localisation de l'include pour le service de nommage; on n'a besoin
de rien pour omniORB, et ici il faut :
#include <coss/CosNaming.h>
Compiler et lancer l'exemple:
export LD_LIBRARY_PATH=/usr/local/lib
make
# Création du talon et du squelette:
/usr/local/bin/idl jeu.idl
ln -s jeu.h jeu.hh # car MICO nomme différemment de omniORB le C++ généré
g++ -I . -c *.cc
g++ -o Jeu_server -lmico2.3.11 -ldl -lmicocoss2.3.11 *.o
cd ../ppc-clt
g++ -I . -c *.cc
g++ -o Jeu_clt -lmico2.3.11 -ldl -lmicocoss2.3.11 *.o \
../ppc-lib/jeu.o ../ppc-lib/Joueur_impl.o
# Lancer le service de nommage:
# nsd -ORBNamingAddr inet:protea:2809 ==> ne suffit pas, il faut lancer micod
start-naming-mico.sh
# dans 2 autres fenêtres:
./Jeu_client -ORBNamingAddr inet:protea:2809
Problème avec
l'appel "ping pong" (jeu PPC)
Ce problème m'a tenu en haleine pendant quelques jours. La
solution est venue grâce à la liste de courrier de MICO.
Karel Gardas a écrit :
Please have a look at mico/demo/mt/callback demo which is very simple (and
in fact not quite robust) example how to create callback client.
Thank you for indicating me this example. There was just one line to
change in my example. In the game server I changed the way it stores
the reference of the client to call back. It used to be:
player1_ = player;
I changed it to:
player1_ = Player::_duplicate(player);
On Wed, 24 Mar 2004, Jean-Marc Vanel wrote:
Hello
I did a simple game (Scissors, Paper, Stone) with 2 instances of client
program (Player) and one serveur (Arbitrer).
When the second player calls the Arbitrer to play, the Arbitrer must call
the first Player to communicate him the result of the game.
Doing this naively, I keep a Player_ptr member in the Arbitrer
implementation, and I get a CORBA::SystemException in the second player and
a segmentation fault in the Arbitrer.
I have tried this with Mico and omniORB.
I added an event loop with perform_work() and work_pending() in my
player clients. But it still doesn't work.
I get this when calling the first Player to communicate him the result
of the game:
CORBA::SystemException: IDL:omg.org/CORBA/TRANSIENT:1.0 (0, maybe-completed)
I use last version of MICO on RedHat Fedora Linux.
The sequence diagram is here (see it with fixed-width font ):
Player1 Player2 Arbitrer
| | |
--accepteCoup("p", player1)-------------------------------->
| | |
| | |
| | |
| --accepteCoup("c", player2)----->
| | |
| <--accepteResultat("win")--------
| | |
<-----------------------------accepteResultat("loose")------
Décodage d'un
Any
cf présentation JMV no 2.
module calc {
typedef sequence<long> intSequence;
interface Calculatrice
{
intSequence addition( in any nb1, in any nb2 );
};
};
??? REDACTION EN COURS
Liste en Corba
Il s'agit d'encapsuler une liste en Corba. La problématique est
ici de renvoyer des pointeurs sur des objets créés
dynamiquement côté serveur.
module list_m {
interface Item {
attribute string message;
};
interface List {
attribute Item first;
void add_after( in Item it);
Item next_after( in Item it);
};
};
??? REDACTION EN COURS
Interoperabilité
C++ - Java
cf exemple Rappel simple ci-dessus en C++
.
??? REDACTION EN COURS
Solutions:
Rappel simple Corba en C++ avec module
Rappel simple Corba en Java avec module
- Corba "pur" en Java
- RMI sur IIOP
Portabilité
entre ORB C++
Reprendre la même application Rappel
simple (callback) avec, cette fois, l'ORB TAO (cf compléments
formation).
??? REDACTION EN COURS
Exercices
génériques
Ces Exercices génériques peuvent se faire en Corba, Web
services, Web ordinaire, ou IHM.
Voir ici les sujets