Опубликован: 18.03.2010 | Доступ: свободный | Студентов: 840 / 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

Антон Зубеков
Антон Зубеков

Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений"