`
美丽的小岛
  • 浏览: 308799 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

CORBA学习与实践

阅读更多

1、简述:
来自百度百科的一个描述,CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范。或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。
2、对象管理体系结构:
对象管理体系结构OMA(Object Management Architecture )的参考模型。它从总体上抽象地描述了OMG组织推出的面向对象技术所包含的内容,以及模型中各组成部分之间的关系。CORBA规范定义了接口定义语言IDL (Interface Definition Language )及其与某些其他语言的映射、单个对象请求代理ORB(Object Request Broker)和ORB间互操作机制。
对象管理体系结构:



对象请求代理ORB:对象请求代理负责对象在分布环境中透明的收发请求和响应,它是构建分布对象应用、在异构或同构环境下实现应用间互操作的基础。
对象服务(Object Services):对象服务是为使用和实现对象而提供的基本服务集合。针对对象服务,OMG组织制订了CORBA服务规范,简称COSS规范(Common Object Services Specification)。COSS规范由一组接口(Interface)和相应的服务描述构成。       
公共设施(Common Facilities):公共设施是向应用开发提供的一组共享服务接口,但这组服务不像对象服务那样基本。
应用接口(Application Interfaces):应用接口是由软件销售商提供的、可控制其接口的产品。应用接口处于参考模型的最高层。
域接口(Domain Interfaces):域是指一个范围,在其中的对象具有公共的特征,遵从公共的规则。一个域可以是一个单独的ORB系统,在其中的对象具有公共的对象引用、网络地址、保密机制等;一个域也可以跨越多个ORB系统,ORB内的对象具有公共的特征。一个ORB系统内部也可以划分为多个域。域接口是为应用领域服务而提供的接口。
3、ORB的体系结构



 (1)IDL语言通过说明对象的接口来定义对象。一个接口包括一组命名的操作和相应于这些操作的参数。
(2)ORB核心提供了客户与对象之间实现透明通信的方法,它可以屏蔽对象实现位置、实现方法、状态和通信机制等细节以及不同实现间可能存在的差异。
(3)对象适配器OA(Object Adaptor)位于各个ORB内核和对象实现之间,它负责服务对象的注册、对象引用的创建和解释、对象实现的服务进程(或线程)的创建和撤消、对象的构造和撤消以及客户请求的分发。
(4)IDL Stub为客户提供了静态调用方式,IDL Skeleton与Java RMI服务者Stub类似,为服务方提供了静态实现方式。IDL编译器编译描述服务对象接口的IDL文件,生成对应于具体编程语言的IDL Stub和IDL Skeleton程序。IDL Skeleton 对用户请求进行反序列化,定位所请求的对象的方法,执行要求的方法,并把执行结果或异常信息序列化后发送回客户。
(5)动态调用接口DII(Dynamic Invocation Interface)和动态构架接口DSI(Dynamic Skeleton Interface)提供了动态调用方式和动态实现方式。
4、ORB运行原理
在单个ORB支撑的环境中,操作步骤大致如下:
1. 客户通过某种方式找到特定对象实现的对象引用,这些查询方式包括:
(1)使用ORB接口中提供的操作。
    当ORB初次启动时,客户并不知道它要调用的对象实现的对象引用。没有对象引用就不能定位对象实现,也就不能进行调用请求。因此,ORB给出了获取初始对象引用的方法,应用可以通过调用它来获得初始化对象引用。ORB接口获取初始对象引用的操作以ORB对象的操作的形式出现。
(2) 使用CORBA对象服务中的命名服务。
(3) 通过其他接口的输出参数或者返回值。
(4) 通过ORB实现系统自身提供的特定的对象引用获取方法。
2.如果该对象实现有相应的IDL Stub,则客户可以通过该IDL Stub向对象实现发出请求。否则,在接口库的协助下,客户可以使用动态调用接口来向对象实现发出请求。
3.当对象调用请求通过IDL Stub或动态调用接口到达ORB核心以后,ORB核心负责请求的传送,将其送给相应的对象适配器,其具体的请求传递方式由ORB的具体实现决定。
4.对象适配器接到该请求后,判断一下所请求的对象实现是否有IDL Skeleton存在。如果有,则对象适配器通过该IDL Skeleton架调用执行对象实现中的操作;否则,对象适配器将通过动态构架接口中的动态实现例程(DIR)来调用对象实现中的操作。
5.对象实现的特定操作方法执行完成后,结果(包括输出参数、输入输出参数、返回值以及异常信息等)将按照对象请求传递和执行路径逆向返回给客户对象。至此,一个完整的对象请求调用便完成了。
包含多个异构ORB系统的环境中,客户可以通过自己所在的ORB系统向其他ORB系统上的对象实现发出调用请求,其具体的执行步骤略有不同,但各个ORB系统内的对象请求处理过程也是和上面过程一样的。
5、IDL语言
IDL语言是一种接口定义语言。IDL语言不同于所有已有的程序设计语言,它是一种描述性语言,也就是说,用它描述得到的接口是不能直接被编译执行。
    OMG IDL语言采用ISOLatin-1(8859.1)字符集。该字符集可以分为字母、数字、图形符号、空格符、和格式符号。其中字母包括英文26个字母的大小写,数字包括10个阿拉伯数字0到9。
6、idlj命令介绍:
 idlj命令是把idl文件生成java代码,此命令在JDK的安装目录的bin目录下可以找到
   idlj命令的使用语法如下:
   idlj [选项] <idl文件>
其中,<idl 文件> 是包含 IDL 定义的文件的名称,而[选项] 是以下所列选项的任一组合。这些选项是可选的,并且可以以任意顺序显示;<idl 文件> 是必须的并且必须显示在最后。


 7、orbd命令介绍
orbd是用来使客户能够透明地查找和调用持久对象在服务器上应用环境,各个参数如下:


  sun关于orbd的介绍文档地址如下:http://download.oracle.com/javase/1.4.2/docs/guide/idl/orbd.html
8、对于整数的加减法的实现操作的接口,写idl文件LR.idl 

module LR{
 interface Op{
  long add(in long a, in long b) ;
  long sub(in long a,in long b) ;
        };
};

 9、执行idlj命令,实现idl到java的实现:


 10、这样的情况就成功了。会在D:\test\test文件夹中多出了一个文件夹LR。进入LR文件夹中,查看LR文件中有6个java文件。


 Holder类(支持类)
    所有的IDL标准类型和自定义类型都映射为相应的Holder类。所有IDL基本数据类型的Holder类都在org.omg.CORBA包中定义,所有自定义的类型名,除了那些由typedef定义的外,都映射有相应的Holder类。Holder类的作用主要是为远程方法参数传递提供支持。
Helper类(帮助类)
    所有用户自定义的IDL类型(如<UserType> )都会映射为一个相应的< UserType >Helper类。它提供了几种静态方法,包括该类型对象的插入和获取操作、获得对象在接口库中的标识(repository id)、获得TypeCode操作,以及把该类型对象写入输出流或从输入流中读出的操作。另外,Helper类还定义了narrow操作,实现对象名到对象的映射。
11、编写OpImpl.java类,对接口OpPOA的继承:

import LR.OpPOA;
public class OpImpl extends OpPOA {
 @Override
 public int add(int a , int b) {
    return ( a + b );
 }
 @Override
 public int sub(int a , int b) {
    return ( a - b );
 }
 }

 12、编写服务器端,OpServer.java.

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import LR.Op;
import LR.OpHelper;
public class OpServer {
     private static String strPort = "-ORBInitialPort" ;
     private static String numPort = "1050" ;
    //启动ORB以及等待远程客户机的调用的代码
    public static void main(String args[]) throws Exception {
        // -ORBInitialPort
        args = new String[2];
        args[0] = strPort;
        args[1] = numPort;//端口
        // 初始化ORB
        ORB orb = ORB.init(args, null);
  System.out.println("初始化ORB!");
     // 取根POA的引用,并激活POAManager
        org.omg.CORBA.Object obj=orb.resolve_initial_references("RootPOA");
     System.out.println("取根POA引用");
        POA rootpoa = POAHelper.narrow(obj);
  System.out.println("调用了narrow函数") ;
        rootpoa.the_POAManager().activate();
     System.out.println("激活POAManager");
        // 创建一个Impl实例
        OpImpl opImpl = new OpImpl();
        System.out.println("创建了接口的实例");
        // 从服务中得到对象的引用
        org.omg.CORBA.Object ref = rootpoa.servant_to_reference(opImpl);
        Op href = OpHelper.narrow(ref);
  System.out.println("从服务中得到对象引用");
        // 得到一个根名称的上下文
        org.omg.CORBA.Object objRef = orb
                .resolve_initial_references("NameService");
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
     System.out.println("得到根名称的上下文");
        // 在命名上下文中绑定这个对象
        String name = "Op";
        NameComponent path[] = ncRef.to_name(name);
        ncRef.rebind(path, href);
        System.out.println("在根名称的上下文绑定实例对象");
  System.out.println("启动线程服务,等待客户端调用");
        // 启动线程服务,等待客户端调用
        orb.run();
    }
}

 13、编写服务器端,OpClient.java.

import LR.Op;
import LR.OpHelper;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
public class OpClient {
    private static Op op;
    static {
         System.out.println("客户端的初始化配置开始");
         //参数设置 -ORBInitialHost 127.0.0.1 -ORBInitialPort 1050
         String args[] = new String[4];
         args[0] = "-ORBInitialHost";
         args[1] = "127.0.0.1";// 服务端的IP地址
         args[2] = "-ORBInitialPort";
         args[3] = "1050";// 服务端的端口
         // 初始化
         ORB orb = ORB.init(args, null);
        // 获取根名称上下文
         org.omg.CORBA.Object objRef = null;
         try {
             objRef = orb.resolve_initial_references("NameService");
         } catch (InvalidName e) {
             e.printStackTrace();
         }
         NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);
         String name = "Op"; //注意这个是接口来的
         try {
            op = OpHelper.narrow(neRef.resolve_str(name));
         } catch (NotFound e) {
             e.printStackTrace();
         } catch (CannotProceed e) {
             e.printStackTrace();
         } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
             e.printStackTrace();
         }
         System.out.println("客户端的初始化配置结束");
     }
     public static void main(String args[]) throws Exception {
        test(1,2) ;
     }
     public static void test(int a,int b) {
         System.out.println("add(1,2) result="+op.add(a,b));
   System.out.println("sub(1,2) result="+op.sub(a,b)) ;
     }
 }

14、编译所有java类
javac *.java
编译之后,在相应的文件夹中就会出玩了相对应的class文件。 

15、启动orbd


 16、看看是否启动了1050端口


 17、启动服务器


 18、运行客户端


 好了,整个过程也就算是成功了。

  • 大小: 5.9 KB
  • 大小: 18.5 KB
  • 大小: 149.1 KB
  • 大小: 30.9 KB
  • 大小: 9.3 KB
  • 大小: 41.2 KB
  • 大小: 16.8 KB
  • 大小: 23.7 KB
  • 大小: 24 KB
  • 大小: 15.1 KB
4
2
分享到:
评论
3 楼 kokorodo 2013-01-22  
太强悍了!谢谢中,谢谢啊!
2 楼 美丽的小岛 2012-08-14  
缥缈孤鸿 写道
人才~~~~

1 楼 缥缈孤鸿 2012-08-13  
人才~~~~

相关推荐

    com 与corba 本质与互用

    COM(Component Object Model)和CORBA(Common Object Request Broker Architecture)是两种不同的分布式对象...通过学习和实践,开发者能够熟练掌握这些技术,并在实际工作中灵活运用,提升软件开发的质量和效率。

    vc 使用corba 开发学习手册

    《VC使用CORBA开发学习...帮助开发者在Windows环境下利用VC和Tuxedo实现CORBA应用,从零开始,逐步深入,包括环境配置、接口设计、服务端与客户端实现、编译与运行等关键环节,是学习和实践CORBA技术的重要参考资料。

    corba中文版学习手册

    CORBA(Common Object Request Broker Architecture,公共对象请求代理架构...此外,还会涉及到故障恢复、性能优化和实际应用案例等内容,帮助你在实践中掌握CORBA技术。这份教程将是你迈进分布式计算世界的重要一步。

    corba中文版学习指南

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是面向对象分布式...通过深入阅读和实践,你可以掌握创建和部署分布式CORBA应用的技能,为你的软件开发工作带来更高的效率和灵活性。

    Corba学习实例文档

    在本Corba学习实例文档中,我们将探讨Java中如何使用CORBA(Common Object Request Broker Architecture)来实现跨网络的对象通信。CORBA是一种标准,允许不同操作系统、编程语言和网络环境中的对象相互协作,仿佛...

    CORBA基础_C++corba开发_corba_

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是用于分布式计算的一种标准,它允许不同系统间的软件对象进行...随着深入学习和实践,开发者可以掌握如何构建可靠、高效的分布式系统。

    CORBA与RMI的比较 及 实例

    通过阅读这份文档,开发者可以深入理解CORBA的工作原理,并能动手实践,建立自己的分布式应用程序。 总结来说,CORBA与RMI各有优缺点,适用于不同的开发环境和需求。理解它们的差异和应用场景,有助于我们在分布式...

    Ultra Corba Simulator (Corba 模拟器)1.3.6

    总结,Ultra Corba Simulator 1.3.6是一款强大的工具,它简化了Corba技术的学习和实践,无论是初学者还是经验丰富的开发者,都能从中受益。通过模拟器,我们可以更直观地理解Corba的客户端-服务器模型,以及ORB如何...

    Corba入门教程(中文)

    【Corba入门教程(中文)】是一份专为初学者设计的教程,旨在帮助那些对分布式计算技术感兴趣的读者快速理解并掌握CORBA...通过深入学习和实践,你将能够构建出自己的分布式系统,并利用CORBA实现跨平台的通信。

    14天学会corba

    **第十四天:案例分析与实践** 通过实际项目或案例研究,将所学知识应用于实践中,巩固理论知识并提升实战技能。 在学习过程中,Sams - Teach Yourself CORBA In 14 Days.chm这本书可能提供了详细的步骤、示例代码...

    corba实例

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是一种...总之,"corba实例"是一个学习和实践CORBA技术的好资源,通过实际操作,你可以更直观地掌握分布式对象通信的核心概念和技术。

    CORBA 程序设计入门(中兴版)

    学习资源与实践** 学习CORBA不仅要理解其原理,还需要通过实践来巩固。可以参考《01-03 CORBA入门.doc》这份文档,它可能涵盖了基本概念、编程示例和练习题,逐步引导学习者掌握CORBA编程。此外,还可以结合开源...

    corba技术中文版

    5. **并发与线程**:学习如何在CORBA环境中处理并发和多线程问题,包括同步机制、线程池和并发策略。 6. **异常处理**:了解CORBA的异常处理机制,包括系统异常和用户自定义异常。 7. **安全性**:学习CORBA提供的...

    CORBA.rar_Java CORBA_corba

    6. **学习与实践** 学习Java CORBA时,首先理解基础概念,然后动手实践编写服务器端和客户端代码,运行并观察交互过程。这将帮助开发者掌握ORB的运作机制,理解如何通过IOR进行对象定位,以及如何在不同进程中调用...

    corba.rar_Java CORBA_corba_corba p

    8. **学习路径**:对于初学者,可以从理解ORB和IDL的概念开始,然后逐步学习GIOP和IIOP的通信机制,接着通过编写简单的客户端和服务端程序来实践CORBA通信。最后,可以研究更高级的服务,如命名服务和事务服务,以...

    CORBA 程序设计指南入门

    本指南将引导初学者从零开始学习CORBA,尤其针对那些已经有一定Java编程基础的读者。以下是关于CORBA及其与Java结合使用的详细知识点: 1. **CORBA概念**: - **ORB(Object Request Broker)**: 是CORBA的核心,...

    Java Corba 复习及开发文档

    本复习及开发文档旨在深入理解Java CORBA的核心概念和实践操作。 **一、CORBA基本原理** 1. **ORB(Object Request Broker)**: ORB是CORBA的核心,它作为中间件处理对象间的通信。ORB负责对象的定位、消息的传输...

    corba核心规范-- 一个简单的CORBA/Java示例

    通过学习和实践这样的例子,我们可以深入理解CORBA的核心概念和工作原理,从而在更复杂的分布式系统中灵活应用。对于需要构建跨平台、跨语言的大型分布式系统的IT专业人士来说,掌握CORBA是一项重要的技能。

    corba的详细明了的实验教程

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是一种中间件技术,用于构建分布式应用程序。...通过学习和实践,你将能够利用CORBA的强大功能构建跨平台、高效率的分布式系统。

Global site tag (gtag.js) - Google Analytics