Przykład programu klienckiego w C++ (środowisko VisiBroker 4.5) korzystającego z serwera nazw (orbd) i serwisu napisanego w Javie (1.4).

Implementacja klienta

Klient korzysta z usługi o interfejsie zadeklarowanym dla środowiska JAVA.

#include "CosNaming_c.hh"
#include "slownik_c.hh"

USE_STD_NS

int main(int argc, char* const* argv) {

  try {
    // inicjowanie ORB'a
    CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv);

    // Serwer nazw
    CosNaming::NamingContext_var rootContext = 
      CosNaming::NamingContext::_narrow(
        orb->resolve_initial_references("NameService"));

    CosNaming::Name name;
    name.length(1);
    name[0].id = (const char *) "tlumacz";
    name[0].kind = (const char *) "";
    Tlumaczenie::Slowniczek_var slownik = 
      Tlumaczenie::Slowniczek::_narrow(rootContext->resolve(name));

    cout << slownik->angpol("red") << "\n";
  }
  catch (const CORBA::Exception& e) {
    cerr << e;
  }
}

Uruchomienie

Polecenia:

idl2cpp slownik.idl
generuje odpowiednie pliki, m.in. potrzebny podczas kompilacji slownik_c.hh. Taki program można skompilować standardowym kompilatorem c/c++. Odpowiednie parametry kompilacji można podejrzeć w podkatalogu examples instalacji VisiBrokera. Uruchomienie klienta
Klient -ORBInitRef NameService=iioploc://host.com:1050/NameService
Parametr wskazuje ORB'owi klienta gdzie znajduje się serwer nazw i na jakim nasłuchuje porcie.

Realizacja programu w środowisku VisiBroker 4.5

Implementacja interfejsu

#include "string.h"
#include "slownik_s.hh"
// implementacja serwera
USE_STD_NS

class SlowniczekImpl : public POA_Tlumaczenie::Slowniczek 
{

private: 
  char tablica[100][2][100];
  int poz;

public:

  void wstaw(const char *pol, const char * ang) {
    strncpy(tablica[poz][1], pol, 90);
    strncpy(tablica[poz][2], ang, 90);
    poz++;
  }

  char *angpol(const char* ang) {
    int i;
    i = 0;
    while (i < poz) {
      if (strcmp(tablica[i][2], ang)) {
        break;
      }
    }

    if (poz <= i) {
      throw Tlumaczenie::Nieznane();
    }
    return CORBA::string_dup(tablica[i][1]);
  }

  char *polang(const char* pol) {
    int i;
    i = 0;
    while (i < poz) {
      if (strcmp(tablica[i][1], pol)) {
        break;
      }
    }

    if (poz <= i) {
      throw Tlumaczenie::Nieznane();
    }
    return CORBA::string_dup(tablica[i][2]);
  }

  CORBA::ULong rozmiar() {
    return poz;
  }
};

Rejestracja serwera

#include "SerwerImpl.h"

// USE_STD_NS is a define setup by VisiBroker to use the std namespace
USE_STD_NS

int main(int argc, char* const* argv) 
{
  try {
    // inicjacja ORB'a
    CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);

    // referencja do POA
    CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
    PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(obj);

    PortableServer::POAManager_var poa_manager = rootPOA->the_POAManager();

    // Utworzenie serwera
    SlowniczekImpl slownikImp; 
    PortableServer::ObjectId_var managerId =
      PortableServer::string_to_ObjectId("tlumacz");

    // aktywacja serwera
    rootPOA->activate_object_with_id(managerId, &slownikImp);

    // katywacja POAManager
    poa_manager->activate();

    cout <<  rootPOA->servant_to_reference(&slownikImp) << " is ready" << endl;

    // Czekanie na nadchodzące żądania
    orb->run();

  }
  catch(const CORBA::Exception& e) {
    cerr << e << endl;
    return 1;
  }
  return 0;
}

Klient

#include "slownik_c.hh"

USE_STD_NS

int main(int argc, char* const* argv) {

  try {
    // inicjowanie ORB'a
    CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv);

    PortableServer::ObjectId_var managerId =
      PortableServer::string_to_ObjectId("tlumacz");

    Tlumaczenie::Slowniczek_ptr slownik =
      Tlumaczenie::Slowniczek::_bind("/tlumacz_agent_poa", managerId);

    slownik->wstaw("czerwony", "red");
    cout << slownik->angpol("red") << "\n";
  }
  catch (const CORBA::Exception& e) {
    cerr << e;
  }
}