命名服务的本质是:将名字与corba对象引用绑定,即:名字与corba对象引用之间的一个映射关系。一个名字对应一个对象引用,一个对象引用可以对应多个名字。(关系为一对多)

       功能:实现给定一个名字,就可以获得绑定到该名字的对象引用。

       优点:不需要知道对象的物理位置,只根据名字就可获取该对象的引用。对应用程序而言,实现了网络透明。

 

       命名服务的名字:

       命名服务的名字是由上下文环境组成的。表现形式为:aaa/bbb/ccc/dddaaa/bbb/ccc/ddd为一个命名服务的名字)。一个名字可以分为几个子名字(aaabbbcccddd)。结构如下图所示,该结构可称为“命名树”或“命名环境”:

    

      

    名字在corba中的结构定义为:

       module CosNaming {

              typedef string Istring;

              struct NameComponent {

                     Istring id;

                     Istring kind;

              }

              typedef sequence <NameComponent> name;

       }

       其中,一个名字对应结构:name;一个子名字对应结构:struct NameComponentid为子名字的名称,kind为该子名字的属性描述。

       name类型的名字在使用时,类型名为:CosNaming::Name_var

       字符串类型的名字在使用时,类型名为:CosNaming::NamingContextExt::StringName

 

       命名服务中提供的操作:(均由接口CosNaming::NamingContextExt提供)

1. to_name()

类型转换:将字符串形式的名字转换为CosNaming::name类型的名字

2. to_string()

类型转换:将CosNaming::name类型的名字转换为字符串形式的名字

3. resolve_str()

根据字符串形式的名字,从命名树中获取该名字对应的对象引用。

 

       例如:

       CosNaming::Name_var name(4);

       name.length(4);

//注意:下标从0开始。

       name[0].id = CORBA::string_dup(“aaa”);

       name[0].kind = CORBA::string_dup(“”);

       name[1].id = CORBA::string_dup(“bbb”);

       name[1].kind = CORBA::string_dup(“”);

       name[2].id = CORBA::string_dup(“ccc”);

       name[2].kind = CORBA::string_dup(“”);

       name[3].id = CORBA::string_dup(“ddd”);

       name[3].kind = CORBA::string_dup(“”);

       //调用to_string

CosNaming::NamingContextExt::StringName strName;

       strName = root_cxt->to_string(name);

       //调用to_name

       name = root_cxt->to_name(“aaa/bbb/ccc/ddd”);

      

       命名服务的具体过程示例:

       /************* 1.初始化部分 ***************/

       //初始化orb

       CORBA::ORB_var orb = CORBA::ORB_init(argc,argv);

       //初始化命名服务,即初始化命名树或初试化命名环境

       CORBA::Object obj = orb->resolve_initial_references(“NameService”)

       CosNaming::NamingContextExt_var root_cxt;

       root_cxt = CosNaming::NamingContextExt::_narrow(obj);

 

       /************* 2.将名字帮定到命名环境中 ***************/

       //区分:名字和命名环境是两个不同概念。

//名字为:CosNaming::Name_var,命名环境为:CosNaming::NamingContext

//方法一:

       //创建一个新的命名环境

       CosNaming::NamingContext_var aaa_cxt;

       aaa_cxt = root_cxt->new_context();

       //初始化名字

       CosNaming::Name_var name;

       name.length(1);

       name[0].id = CORBA::string_dup(“aaa”);

       name[0].kind = CORBA::string_dup(“”);

       //在初始化环境中绑定新的名字

       root_cxt->bind_context(name, aaa_cxt);

       //方法二:

       //定义一个新的命名环境

       CosNaming::NamingContext_var aaa_cxt;

       //初始化名字

       CosNaming::Name_var name;

       name.length(1);

       name[0].id = CORBA::string_dup(“aaa”);

       name[0].kind = CORBA::string_dup(“”);

       //绑定

       aaa_cxt = root_cxt->bind_new_context(name);

 

       /************* 3.绑定对象引用 ***************/

       //绑定,obj_ref为对象引用

aaa_cxt->bind(name, obj_ref);

 

       /************* 4.获得对象引用 ***************/

       //设置名字(方法一)

       CosNaming::Name_var name;

       name.length(1);

       name[0].id = CORBA::string_dup(“aaa”);

       name[0].kind = CORBA::string_dup(“”);

       //获得引用

       CORBA::Object_var obj;

       obj = root_cxt->resolve(name);

       //再使用narrow即可.

       //获得引用(方法二)

       CORBA::Object_var obj;

       obj = root_cxt->resolve(“aaa”);

posted on 2009-04-30 14:39  sky100  阅读(604)  评论(0编辑  收藏  举报