命名服务(Naming Service)是CORBA定义的诸多服务中比较常用的一个, Naming Service提供的助记符解析服务使得应用程序可以借助助记符,而不是一大串IOR来访问到相应的Servant。
直接将IOR串在程序间传递的做法往往比较不方便,特别是,对于非持久servant来说,每次重启Server程序时,这个IOR都会发生变化,在使用上比较不便,而且,当我们需要访问的servant不是一个,而是多个时,使用IOR就更加不便了。为此,CORBA定义了Naming Service服务,命名服务(Naming Service,不过大家叫的更多的是命名服务)是CORBA最基本的服务之一。Server程序将servant注册到Naming Service中,Client程序就可以借助助记符,而不是一大串IOR来访问到相应的Servant了。
TAO对标准的名字服务进行了扩展,使得可以利用multicast来得到名字服务。此外,TAO还提供了NT_Naming_Service,可以将名字服务注册为NT服务进行管理。
名字服务的文件名为:Naming_Service.exe,它的启动参数有:
% Naming_Service [-ORBNameServicePort nsport]
[-o ior_output_file]
[-p pid_file_name]
[-s context_size]
[-t time]
[-f persitence_file_name]
[-b base_address]
[-m (1=enable multicast responses,0=disable(default)]
-ORBNameServicePort nsport:指定名字服务监听multicast包的端口号。只有在使用了'-m 1'时才有效.
-o ior_output_file: 指定文件名,用来保存名字服务的根上下文的IOR.
-p pid_file_name: 指定文件名,用来保存名字服务程序的进程id
-s context_size: 当创建上下文时, 指定新上下文使用的哈希表的大小,默认1024
-t time: 名字服务监听的时间,单位:秒。默认: 无限
-f persistence_file_name: 指定文件名,用来存放名字服务中被绑定的对象引用。
-m (1=enable multicast responses, 0=disable(default): 是否使用多播功能。
运行名字服务时,可以使用-ORBEndpoint参数来指定其运行的端点(有关-ORBEndpoint的详细内容参见文档: $TAO_ROOT/docs/ORBEndpoint.html):
%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -ORBEndpoint iiop://localhost:2809 -m 0
(名字服务在本机的2809端口监听请求,不使用多播方式)
若要使用多播方式启动Naming_Service时,只需执行
%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 1
启动完成后,Naming Service就默默在那里工作了,但是,你的servant和client如何访问它呢?
要在Server和Client程序中访问NameService有两种方法:
1、配置InitRef信息:
可以在启动程序时通过-ORBInitRef来指定,如:
-ORBInitRef NameService=IOR:00ff...
或使用corbaname,如:
-ORBInitRef NameService=corbaname::localhost:2809
指定NameService在本机的默认端口上监听。
也可采用corbaloc来指定NameService的运行信息,如:
-ORBInitRef NameService=corbaloc:iiop:1.2@localhost:2809/NameService
在这里,corbaloc/corbaname被用于以更具有可读性的方式来定位servant,关于corbaname、corbaloc的更为详细的信息见参考6。
配置好InitRef后,程序中就可以通过:
orb->resolve_initial_references("NameService");
访问到NameService了。
2、访问Naming Service的另一种方式则是传递Naming Service的IOR串,然后通过:
orb->string_to_object(...);
从IOR串连接到相应的Naming Service,因为NameService只不过是一个特殊的servant。
下面新建一个工程eg2_svr,添加到当前Solution,在该工程中添加一个名为eg2_svr.cpp的文件(由于代码较多,文件内容略,详见附件),使该工程依赖于前面的idl工程。由于这是一个Server程序,并且还要用到命名服务,需要链接以下两个链接库:
TAO_CosNamingd.lib
TAO_PortableServerd.lib
编译该工程。
新建一个eg2_cli工程,添加到当前Solution,在该工程中添加一个名为eg2_cli.cpp的文件(由于代码较多,文件内容略,详见附件),使该工程依赖于前面的idl工程,并在工程链接选项中添加TAO_CosNamingd.lib,以使用命名服务,编译该工程。
在Server程序中,我们在创建好servant object后,将其bind到了Naming Service中;在Client程序中,通过resolve助记符,我们从Naming Service那里取得了servant的IOR信息,进而便可与相应的servant进行连接。
在这里Naming Service一定程度上扮演了一个DNS的角色,DNS完成了地址到IP的转换,而Naming Service完成的则是助记符到IOR的转换。
下面是几组正确的启动Naming Servie和eg2_svr/eg2_cli的方法:
%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 1
eg2_svr
eg2_cli
%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 0 -ORBEndpoint iiop://localhost:2809
eg2_svr -ORBInitRef NameService=iioploc://localhost:2809/NameService
eg2_cli -ORBInitRef NameService=iioploc://localhost:2809/NameService
%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 0 -ORBEndpoint iiop://localhost:2809
eg2_cli -ORBInitRef NameService=corbaname:iiop:1.2@localhost:2809
eg2_svr -ORBInitRef NameService=corbaname::localhost
%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 0 -ORBEndpoint iiop://localhost:2809
eg2_cli -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:2809
eg2_svr -ORBInitRef NameService=corbaloc::localhost
(注:iiop协议标记可以省略,另IANA已将2809端口分配给corbaloc,当服务程序在该端口上监听时可以省略端口号。)
%TAO_ROOT%/utils目录下有两个工具:NameViewer/nslist,可用于查看当前Naming_Service中注册的NamingContext的信息,其中NameViewer是一个基于MFC的可视化的工具,如果你使用的是VC2005 Express将无法编译该工程。
此外,该目录下还有一个工具catior可用于查看IOR的详细信息,你可以指定一个存有IOR信息的文件作为输入参数(catior -f file_name)或者在Naming_Service运行过程中,指定一个有效的NamingContext作为参数,如:
catior -n test.my_context/Echo.Object
附:本文示例源代码
1. Duncan Grisby, Sai-Lai Lo, David Riddoch. The omniORB Version4.0 User's Guide. http://omniorb.sourceforge.net/omni40/omniORB.pdf
2. OMG. Naming Service Specification, V1.3. http://www.omg.org/cgi-bin/apps/doc?formal/04-10-03.pdf
3. Carlos O'Ryan. TAO's Naming Service. http://www.cs.wustl.edu/~schmidt/ACE_wrappers/TAO/docs/tutorials/Quoter/Naming_Service/index.html
4. Object Computing, Inc. TAO FAQ. http://www.theaceorb.com/faq/index.html
5. Mentoya. TAO使用指南. http://www.huihoo.com/ace_tao/tao_guide.html
6. Ciaran McHale. The corbaloc and corbaname URLs. http://www.iona.com/devcenter/corba/corbaloc.pdf