Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 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