CORBA技术系列二:CORBA基础概念-对象引用

系列二 对象引用
         CORBA作为传统中间件的典型代表,强调屏蔽底层网络对上层应用的差异性来建立一个统一的位置视图,使得程序员可以使用经典的面向对象思想开发客户程序和服务程序,而不受底层网络具体通信协议的困扰。举例而说,假如程序员开发了两个对象A和B,A位于机器Host1上,而B位于机器Host2上,业务逻辑要求A调用B的方法method()。在传统的TCP/IP Socket编程中,程序员不得不自己设计通讯协议,编码格式,参数解析等模块。这些工作即烦琐又容易出错。而CORBA基本上将程序员从与底层网络相关的协议设计中解放出来。程序员只用在A的模块稍微增加几行代码就可以实现远程对象的访问。对象引用就是CORBA为解决分布式系统设计中对象位置的透明性而设计的。
         让我们从问题出发讨论分析对象引用的基本概念。
         在单一进程空间中,A对象要调用B对象的方法,A对象必须要获得B对象的指针(或引用)。然而在分布式系统中,将B的地址传递给A是没有意义的。因为两者不在同一个进程空间。如果假设B的地址存在于A的进程空间中,然后调用B的方法,将带来内存非法访问等异常。那么CORBA是怎么解决这个问题的?实际上,为了定位B对象,我们需要的是一个超级指针的概念。因为原始的指针只包含地址信息,我们就在超级指针中新增主机地址信息、进程信息和对象的标识这三项信息。这实际上就是CORBA规范中定义的IOR(互操作对象引用)的格式。IOR格式定义如下:接口ID:主机地址:对象关键字。其中接口ID是用来唯一标识对象接口信息的,使用于CORBA高级服务接口池。格式为"IDL:对象名字:版本号"。主机地址包含协议类型和具体的地址,对于TCP/IP,就是IP地址和端口号。前两项信息是标准定义,不同CORBA产品实现厂商必须遵循。对象关键字包含POA标识和对象ID两项信息。对象关键字的语义在规范中没有指出,依赖于厂商的实现。
          IOR只是定义了分布式对象的位置格式。依然不是我们所要的编程级别的超级指针。我们需要的是一个能够隐藏底层网络信息和对象位置信息的指针。我们使用这个指针就可以如同单机环境编程一样,非常舒服的调用B对象的方法。CORBA是怎么做到的呢?CORBA在客户端提出了一个代理对象的概念,我们的超级指针指向的并不是远程对象,而是这个代理对象。代理对象的外部接口和B对象一样,但是其内部的实现负责了参数编码,建立连接,发送数据包,接受数据包,解码获得返回值等等繁琐的网络协议设计。当然,这些工作我们程序员并不用做,还记得上一节提到的IDL编译器吗,编译器会帮我们生成这样一个代理类。
          有了这个代理对象,我们还必须想办法构造它。构造它时,必须指出远程对象的位置信息。怎么构造?有两种方法,一种是获得IOR信息,直接构造。由服务器端公布这个IOR字符串,我们想办法拿到IOR串,然后调用ORB的string_to_object方法创建代理对象。string_to_object是CORBA规范中定义的标准ORB方法,其声明如下:Object string_to_object(in string or)。返回值是Object类型。实际上Object类型是所有代理对象的基类,获得这个Object对象后,还要使用代理类的_narrow(Object obj)方法才能获得实际需要的代理对象。在CORBA规范中对输入参数定义了三种方法,一种是直接表达IOR本身,另一种是内容为IOR的文件的地址,还有一种是使用corbaloc地址。
          1)IOR形式,则输入参数形式为"IOR:12412abc333000"的字符串,IOR是必须的,后面跟200到800个16进制形式的数字。这些数字就是IOR所带的信息。
          2)文件形式:输入参数形式为"file:/IOR文件绝对地址"或者"relfile:/相对路径"
          3)corbaloc形式:输入参数格式为"corbaloc:iiop:ip:port/对象名字"。其中corbaloc:iiop是格式必须要的,其后是IP地址,/后是对象名字。另外还有一种rir格式,详细见CORBA规范。

          下面给出第2个方法的代码片段:

int  commonproc(CORBA::ORB_ptr orb,  int  argc,  char *  argv[])
{
    
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值