|
Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Опубликован: 18.03.2010 | Доступ: свободный | Студентов: 841 / 85 | Оценка: 4.48 / 4.33 | Длительность: 12:01:00
Тема: Программирование
Специальности: Администратор коммуникационных систем
Лекция 2:
Технология CORBA
Сервер на C++
Данный пример демонстрирует взаимодействие компонентов, реализованных на различных языках программирования. А именно, сервер службы мгновенных сообщений реализован на С++.
Для корректного взаимодействия прямая передача ссылки на CORBA -объект получателя сообщений заменена передачей IOR. Это приводит к изменению в IDL -описании (измененное описание используется в этом и предыдущем примерах):
interface MessagingService
{
unsigned long login(in string userName, in string password, in string receiverlOR);
};Приведем реализацию сервера на С++. Функциональность, по сравнению с реализацией на Java,не изменилась.
#include "CosNaming c.hh" #include "Messlmpl.h"
USE_STD_NS
int main(int argc, char* const* argv)
{
try
{
// Инициализируем брокер объектных запросов
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
// Получаем ссылку на корневой объектный адаптер
PortableServer::POA_var rootPOA =
PortableServer::POA::_narrow( orb->resolve_initial_references("RootPOA"));
// Определяем политику для дочернего объектного адаптера
CORBA::PolicyList policies;
policies.length(l);
policies[(CORBA::ULong)0] =
rootPOA->create_lifespan_policy(PortableServer::PERSISTENT);
// Получаем ссылку на мэнеджер объектных адаптеров
PortableServer::POAManager_var poa_manager = rootPOA->the_POAManager();
// Создаем дочерний адаптер
PortableServer::POA_var myPOA = rootPOA->create_POA("messaging_poa", poa_manager,policies);
// Создаем сервер (реализацию объекта)
MessagingServiceImpl messagingServant(orb);
// Получение идентификатора серванта
PortableServer::ObjectId_var messagingId =PortableServer::string_to_ObjectId("MessagingService");
// Активация идентификатора серванта в дочернет объектном адаптере
myPOA->activate object with id(messagingId, &messagingServant);
// Активация мэнеджера объектных адаптеров
poa_manager->activate();
CORBA::Object_var reference =
myPOA->servant to reference(&messagingServant);
// Получаем ссылку на сервис имен
CosNaming::NamingContext_var rootContext =
CosNaming::NamingContext::_narrow(orb->resolve_initial_references("NameService"));
// Регистрация в сервисе имен
CosNaming::Name name;
name.length(l);
name[0].id = (const char *) "MessagingService";
name[0].kind = (const char *) "";
rootContext->rebind(name, reference);
cout << reference << " is ready" << endl;
// Ожидание соединений orb->run();
}
catch(const CORBA::Exception& e)
{ cerr << e << endl;
return l;
}
return 0;
}Ниже приведен частичный листинг серванта на С++ (полную версию можно найти в электронном варианте):
#include "message s.hh"
#include <math.h>
#include <string>
#include <vector>
#include <map>
USE_STD_NS
class Msg {...}; // Сообщение
class User {...}; // Информация о клиенте
class MessagingServiceImpl : public virtual POA_Message::MessagingService,
public virtual PortableServer::RefCountServantBase
{
public: MessagingServiceImpl(CORBA::ORB_var _orb) : orb(_orb) {}
CORBA::ULong registerUser(const char* _userName, const char* _password)
{
string userName(_userName);
string password(_password);
if (nameTold.find(userName) != nameToId.end())
{
std::cout << "User " << userName <<" already registered" << std::endl;
return (CORBA::ULong) 0;
}
else
{
int uid = nameToId.size();
nameToId[userName] = uid;
User u(userName, password);
users.push_back(u);
notifyAllUsers(++uid, false);
std::cout << "User " << userName <<" registered successfully, user ID is " <<
uid << std::endl;
return (CORBA::ULong) uid;
}
private:
CORBA::ORB_var orb;
void notifyAllUsers(int uid, bool online)
{
string userName = users[uid - l].name;
for (int i = 0; i < users.size(); ++i)
{
if (i != uid - l)
{
User& buddy = users[i];
if (buddy.online)
{
buddy.receiver->userStatusNotification( uid, userName.c_str(), online);
}
}
}
}
map<string, int> nameToId;
vector<User> users;
};Запуск сервера осуществляется следующей командой:
start Server -ORBInitRef NameService=iioploc://<host>:<port>/NameService