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:
  1. faire un diagramme de séquence
  2. 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


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