Cobra-omniORB简单编程-命名服务

 命名服务基本与上面的<<Cobra-omniORB简单编程-IOR>>相似,下面具体对需要的操作步骤进行描述。

一、设置环境变量

1)、在“D:/omniORB-4.1.1/”目录下新建目录Omninames;

2)、设置用户环境变量“OMNINAMES_LOGDIR = D:/omniORB-4.1.1/Omninames”。

二、配置命名服务

执行D:/omniORB-4.1.1/sample.reg注册文件,

在HKEY_LOCAL_MACHINE/SOFTWARE/omniORB/InitRef 加入类型为字符串键“1”,键值为"NameService=corbaname::my.host.name"(这里的my.host.name 是你的机器名)

如果使用本机来测试,键值可以为NameService=corbaname::127.0.0.1。

三、使用上述testOrbServer工程文件,修改testOrbServer.cpp代码:

// testOrbServer.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include "time.h"
using namespace std;

class Time_impl:public virtual POA_Time
{
public :
	virtual short get_gmt();
};

short Time_impl::get_gmt()
{
	return 1234;
}

int main(int argc, char* argv[])
{
	CORBA::ORB_var orb;
	Time_impl* impl = NULL;
	try
	{

		// Initialize the ORB
		orb = CORBA::ORB_init(argc,argv);

		// Get a reference to the root POA
		CORBA::Object_var rootPOAObj = orb->resolve_initial_references("RootPOA");

		// Narrow it to the correct type
		PortableServer::POA_var rootPOA	= PortableServer::POA::_narrow(rootPOAObj.in());

		// Create POA policies
		CORBA::PolicyList policies;
		policies.length(1);
		policies[0] = rootPOA->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL);

		// Get the POA manager object
		PortableServer::POAManager_var manager = rootPOA->the_POAManager();

		// Create a new POA with specified policies
		PortableServer::POA_var myPOA = rootPOA->create_POA("myPOA", manager, policies);

		// Free policies
		CORBA::ULong len = policies.length();
		for (CORBA::ULong i = 0;i < len; i++)
			policies[i]->destroy();

		//Get a reference to the Naming Service root_context
		CORBA::Object_var rootContextObj = orb->resolve_initial_references("NameService");
		// Narrow to the correct type
		CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow(rootContextObj.in());
		//CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow(rootContextObj);

		// Create a reference to the servant
		impl = new Time_impl();
		// Activate object
		PortableServer::ObjectId_var myObjID = myPOA->activate_object(impl);

		// Get a CORBA reference with the POA through the servant
		CORBA::Object_var o = myPOA->servant_to_reference(impl);
		// The reference is converted to a character string
		_CORBA_String_var s = orb->object_to_string(o);
		cout << "The IOR of the object is: " << s.in() << endl;

		CosNaming::Name name;
		name.length(1);
		name[0].id = (const char *)"FirstTimeService";
		name[0].kind = (const char *)"";
		// Bind the Object into the name service
		nc->rebind(name, o);

		//Activate the POA
		manager->activate();
		cout << "The server is ready. Awaiting for incoming requests..." << endl;

		// Strat the ORB
		orb->run();
	}
	catch (const CORBA::Exception& e)
	{
		cerr << " exception " << e._name() << endl;
		return 1;
	}
	// Decrement reference count
	if (impl)
	{
		impl->_remove_ref();
	}

	// End CORBA
	if (!CORBA::is_nil(orb))
	{
		try
		{
			orb->destroy();
			cout << "Ending CORBA..." << endl;
		}
		catch (const CORBA::Exception& e)
		{
			cout << "orb->destroy() failed:" << e._name() << endl;
			return 1;
		}
	}
	return 0;
}

四、使用上述testOrbClinet工程文件,修改testOrbClinet.cpp代码:

// testOrbClient.cpp : Defines the entry point for the console application.
//
#include <iostream>

#include "time.h"
using namespace std;

int main(int argc,char* argv[])
{
	// Declare ORB
	CORBA::ORB_var orb;
	try
	{
		if (argc != 2)
		{
			throw 0;
		}

		// Initialize the ORB
		orb = CORBA::ORB_init(argc, argv);

		//Get a reference to the Naming Service
		CORBA::Object_var rootContextObj = orb->resolve_initial_references("NameService");
		if (CORBA::is_nil(rootContextObj))
		{
			cerr << "Nil Time Reference" << endl;
			throw 0;
		}
		CosNaming::NamingContext_var nc = 
			CosNaming::NamingContext::_narrow(rootContextObj.in());


		CosNaming::Name name;
		name.length(1);
		name[0].id = (const char *)"FirstTimeService";
		name[0].kind = (const char *)"";
		//Invoke the root context to retrieve the object reference
		CORBA::Object_var managerObj = nc->resolve(name);
		//Narrow the previous object to obtain the correct type
		::Time_var manager = ::Time::_narrow(managerObj.in());

		if (CORBA::is_nil(manager))
		{
			cerr << "Nil Time Reference" << endl;
			throw 0;
		}
		cout << "OK, Let's have a look: " << manager->get_gmt() << endl;		
	}
	catch (const CORBA::Exception& e)
	{
		cerr << "Client.main() Exception  " << e._name() << endl;
		return 1;
	}
	return 0;
}

五、编译上述两个工程

六、启动命名服务

打开一个命令窗口,输入omniNames –start (请不要关闭该窗口,如果不幸把这个窗口关闭了,那就重新输入omniNames就行了,不用带参数了。也就是说只有第一次用omniNames时才用-start,第二次以后就不用了,因为log文件已经存在了。)。

  

六、运行testOrbServer.exe服务端程序

七、运行testOrbClient.exe客户端程序

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值