CORBA程序设计指南.docx

上传人:牧羊曲112 文档编号:1774106 上传时间:2022-12-18 格式:DOCX 页数:105 大小:848.74KB
返回 下载 相关 举报
CORBA程序设计指南.docx_第1页
第1页 / 共105页
CORBA程序设计指南.docx_第2页
第2页 / 共105页
CORBA程序设计指南.docx_第3页
第3页 / 共105页
CORBA程序设计指南.docx_第4页
第4页 / 共105页
CORBA程序设计指南.docx_第5页
第5页 / 共105页
点击查看更多>>
资源描述

《CORBA程序设计指南.docx》由会员分享,可在线阅读,更多相关《CORBA程序设计指南.docx(105页珍藏版)》请在三一办公上搜索。

1、 CORBA 程序设计指南(入门)这里假设你对CORBA毫无所知。对JAVA略有所知,因为这里使用JAVA作为程序设计语言。学习了本书,你将对CORBA有个初步了解,并能编写一个简单完整的CORBA应用程序。1 CORBA 简介CORBA(Common Object Request Broker Architecture)是为了实现分布式计算而引入的。为了说明CORBA在分布计算上有何特点,我们从它与其它几种分布计算技术的比较中进行说明。与过去的面向过程的RPC(Remote Procedure Call)不同,CORBA是基于面向对象技术的,它能解决远程对象之间的互操作问题。MicroSof

2、t 的DCOM (Distributed Component Object Model)也是解决这一问题的, 但它基于Windows操作系统,尽管到本书编写时,DCOM已有在其他操作系统如Sun Solaris, Digital Unix, IBM MVS 上的实现,但毫无疑问,只有在微软的操作系统上才会实现得更好。而只有CORBA是真正跨平台的,平台独立性正是CORBA的初衷之一。另一种做到平台无关性的技术是Java RMI(Remote Method Invocation),但它只能用JAVA实现。CORBA与此不同,它通过一种叫IDL(Interface Definition Langu

3、age)的接口定义语言,能做到语言无关,也就是说,任何语言都能制作CORBA组件,而CORBA组件能在任何语言下使用。 因此,可以这样理解CORBA:CORBA一种异构平台下的语言无关的对象互操作模型。1.1 CORBA体系结构CORBA的体系结构如下:图1.1 CORBA体系结构CORBA上的服务用IDL描述,IDL将被映射为某种程序设计语言如C+或Java,并且分成两分,在客户方叫IDL Stub(桩), 在服务器方叫IDL Skeleton(骨架)。两者可以采用不同的语言。服务器方在Skeleton的基础上编写对象实现(Object Implementation),而客户方要访问服务器对

4、象上的方法,则要通过客户桩。而双方又要通过而ORB(Object Request Broker,对象请求代理)总线通信。与传统的Client/Server模式(我们称为Two-tier client/server)不同,CORBA是一种multi-tier client/server architecture,更确切的说,是一种three-tier client/server模式。双重客户/服务器模式存在的问题是两者耦合太紧,它们之间采用一种私有协议通信,服务器的改变将影响到客户方。多重客户/服务器与此不同,两者之间的通信不能直接进行,而需要通过中间的一种叫代理的方式进行。在CORBA中这种代

5、理就是ORB。通过它,客户和服务器不再关心通信问题,它们只需关心功能上的实现。从这个意义上讲,CORBA是一种中间件(Middleware)技术。下面列出CORBA中的一些重要概念,或者说CORBA中的几个重要名词,有助于读者了解CORBA的一些重要的方面。1.2 CORBA中的几个概念1.2.1 ORB(Object Request Broker)CORBA体系结构的核心就是ORB。可以这样简单理解:ORB就是使得客户应用程序能调用远端对象方法的一种机制。图1.2 ORB模型具体来说就是:当客户程序要调用远程对象上的方法时,首先要得到这个远程对象的引用,之后就可以像调用本地方法一样调用远程对

6、象的方法。当发出一个调用时,实际上ORB会截取这个调用(通过客户Stub完成,“提高”篇中会详细解释),因为客户和服务器可能在不同的网络、不同的操作系统上甚至用不同的语言实现,ORB还要负责将调用的名字、参数等编码成标准的方式(称Marshaling)通过网络传输到服务器方(实际上在同一台机器上也如此),并通过将参数Unmarshaling的过程,传到正确的对象上(这整个过程叫重定向,Redirecting),服务器对象完成处理后,ORB通过同样的Marshaling/Unmarshaling方式将结果返回给客户。因此,ORB是一种功能,它具备以下能力:1对象定位(根据对象引用定位对象的实现)

7、2对象定位后,确信Server能接受请求3将客户方请求通过Marshaling/Unmarshing方式重定向到服务器对象上4如果需要,将结果以同样的方式返回。1.2.2 IDL(Interface Definition Language)IDL,接口定义语言,是CORBA体系中的另一个重要概念。如果说ORB使CORBA做到平台无关,那么IDL, 则使CORBA做到语言无关。正像其名字中显示的那样,IDL仅仅定义接口,而不定义实现,类似于C中的头文件。实际上它不是真正的编程语言。要用它编写应用,需要将它映射它相应的程序设计语言上去,如映射到C+或JAVA上去。映射后的代码叫Client Stu

8、b Code和 Server Skeleton Code。IDL的好处是使高层设计人员不必考虑实现细节而只需关心功能描述。IDL可以说是描述性语言。设计IDL的过程也是设计对象模型的过程。它是编写CORBA应用的第一步,在整个软件设计过程中至关重要。IDL的语法很像C+,当然也像Java。很难想像一个程序设计人员是不懂C或Java的,所以,几乎所有的程序设计人员都能迅速理解IDL。而这正是IDL设计者所希望的。下面是一个IDL定义的简单例子:/ grid.idl/ IDL definition of a 2-D grid:module simpleDemointerface grid read

9、only attribute short height; / height of the grid readonly attribute short width; / width of the grid / IDL operations / set the element row,col of the grid, to value: void set(in short row, in short col, in long value); / return element row,col of the grid: long get(in short row, in short col); ;Th

10、is IDL defines an interface for a grid CORBA object that maintains a grid or 2-D array of data values, which a client can access or modify remotely. Module类似于Java中包(Package)的概念,实际上module simpleDemo映射到JAVA正是package simpleDemo。而Interface类似于C+中的类(classs)声明,或是Java中的Interface 定义。附录中列出了IDL的全部语法。1.2.3 Stub

11、 Code 和 Skeleton CodeStub code 和Skeleton Code 是由IDL Complier自动生成的,前者放在客户方,后者放在服务器方。不同厂商的IDL complier生成的Stub 和Skeleton会略有区别,但影响不大。如上面的grid.idl, 编译后,Stub Code包含以下文件:grid.java_gridStub.javagridHelper.javagridHolder.javagridOperations.javaSkeleton Code则包含以下文件: gridOperations.java gridPOA.java gridPOATie

12、.java(在Stud Code 也包含gridOperations.java, 是因为在使用Call back机制时会用到。)这些文件的用途后面会讲到。 1.2.4 GIOP 和 IIOP我们知道,客户和服务器是通过ORB交互的,那么,客户方的ORB和服务器方的ORB又是通过什么方式通信呢?通过GIOP(General Inter-ORB Protocol)。也就是说,GIOP是一种通信协议,它规定了两个实体:客户和服务器ORBs间的通信机制。 图1.3 ORBs通信机制GIOP在设计时遵循以下目标: Widest possible availability Simplicity Scala

13、bility Low cost Generality Architectural neutrality也是说,GIOP设计的尽可能简单,开销最小,同时又具有最广泛的适应性和可扩展性,以适应不同的网络。GIOP定义了以下几个方面:1The Common Data Representation (CDR) definition.通用数据表示定义。它实际上是IDL数据类型在网上传输时的编码方案。它对所有IDL数据类型的映射都作了规定。2GIOP Message Formats. 它规定了Client和Server两个角色之间要传输的消息格式。主要包括Request和Reply两种消息。一个Reque

14、st 消息有以下几部分组成: A GIOP message header A Request Header The Request Body相应的,一个Reply消息则包括A GIOP message header A Reply Header The Reply BodyGIOP1.1规定 GIOP message header格式如下:/ GIOP 1.1struct MessageHeader_1_1 char magic 4;Version GIOP_version;octet flags; / GIOP 1.1 changeoctet message_type;unsigned lo

15、ng message_size; Request Header格式如下:/ GIOP 1.1struct RequestHeader_1_1 IOP:ServiceContextList service_context;unsigned long request_id;boolean response_expected;octet reserved3; / Added in GIOP 1.1sequence object_key;string operation;Principal requesting_principal; Request Body则按CDR规定的方式编码,它主要对方法调用的

16、参数进行编码, 如方法: double example (in short m, inout Principal p); 可表示成:struct example_body short m; / leftmost in or inout parameterPrincipal p; / . to the rightmost;3GIOP Transport Assumptions:主要规定在任何面向连接的网络传输层上的一些操作规则。如:Asymmetrical connection usage,Request multiplexing,Overlapping requests,Connection

17、management等。另外,因为CORBA是基于对象的,GIOP还需定义一套Object Location的机制。GIOP因为是一种通用协议,所以不能直接使用。在不同的网络上需要有不同的实现。目前使用最广的便是Internet上的GIOP,称为IIOP(Internet Inter-ORB Protocol)。IIOP基于TCP/IP协议。IIOP消息格式定义如下:module IIOP / IDL extended for version 1.1struct Version octet major;octet minor;struct Pro / renamed from ProVersi

18、on iiop_version;string host;unsigned short port;sequence object_key;struct Pro Version iiop_version;string host;unsigned short port;sequence object_key;sequence components;1.2.5 Dynamic Invocation Interface (DII) 和 Dynamic Skeleton Interface (DSI)动态调用接口(DII)和动态骨架接口(DSI)是用来支持客户在不知道服务器对象的接口的情况下也能调用服务器

19、对象。一个增加了DII和DSI的CORBA调用模型如下: 图1.4 增加了DII和DSI的调用模型我们在“提高篇”中再详细讲述DII和DSI。1.2.6 Object Adapter (对象适配器)对象适配器是ORB的一部分。它主要完成对象引用的生成、维护,对象定位等功能。对象适配器有各种各样。Basic Object Adapter(BOA, 基本对象适配器)实现了对象适配器的一些核心功能。而Portable Object Adapter(POA,可移植对象适配器)则力图解决对象实现在不同厂商的ORBs下也能使用的问题。最新的ORB产品一般都支持POA。还有其他一些专有领域的对象适配器如Da

20、tabase Object Adapter等。1.3 CORBA历史CORBA是由OMG(Object Management Group)负责制定和维护的一组规范。OMG成立于1989年,是一个非营利的国际性软件组织,主要致力于为分布式计算提供解决方案并制定规范。除CORBA外,OMG还制定了如UML(United Modeling Language, 统一建模语言)、CWM等其他重要规范。OMG目前已有世界上760多个成员,东南大学是中国唯一的OMG成员。CORBA自1990提出并被OMG采纳以来,已历经多个版本。分别称为 CORBA 1、CORBA 2和CORBA 3。其中CORBA 1是

21、对CORBA 1.x的统称,CORBA 2是对CORBA 2.x的统称。目前CORBA 3规范还在制订中,不久便可面世。下面是CORBA版本的更新历史。CORBA1 :CORBA 1.0 90-12, 提出CORBA框架CORBA 1.1 91早期,定义了IDL及ORB Interface。 CORBA 1.2 92-93, 修订CORBA定义了ORB的一些基本特性,但是没有定义而ORB间的通用协议。CORBA 2主要解决这一问题。CORBA 2:CORBA 2.0 94-12, 定义了GIOP和IIOPCORBA 2.1 97-08CORBA 2.2 98-02, 增加了POA。CORBA

22、2.3 98-12CORBA 2.3.1 99-10, 一些Change bars.CORBA 2.4 00-10, 具备CORBA 3的雏形,包括:QoS Specification, Asynchronous Messaging, Minimum CORBA, Real-Time CORBA, CORBAComponents, Notification Services, Firewall Specification等。CORBA 2.4.1 00-11CORBA 2.4.2 01-02因此,可以说,CORBA 1提出ORB和IDL等CORBA基本概念,CORBA 2主要贡献是IIOP,而

23、在制订中CORBA 3 则集中于CORBA Components技术及Real-time特性等。对CORBA的简要介绍就到这里。关于OMG及CORBA的更多信息,可访问OMG站点:.下面我们开始编写第一个CORBA程序。2 使用Orbix 2000编写第一个CORBA程序在编写CORBA程序前,需要安装CORBA环境。提供CORBA产品的厂商有很多,这里我们采用IONA公司的Orbix 2000。IONA公司在CORBA领域一直处于领先地位,其产品几乎总是和CORBA规范同时出台。Orbix 2000是IONA公司2001年2月发布的最新产品,它具有Real-time特性,而这正是CORBA在

24、电信领域应用的最关键的特性之一。而程序设计语言采用JAVA。其开发环境为JBuilder 4. JBuilder 4 是Enterprise 公司(原著名的Boland公司)推出的最新JAVA集成开发环境,其内嵌JDK 1.3。2.1 安装环境你需要安装JAVA和CORBA ORB环境,前者使用JBuilder 4, 后者使用Orbix 2000。操作系统建议使用Windows 2000(Professional or Server),因为我们后面所讲的一些配置工作是基于Windows 2000,和Windows 98稍有区别。另外,Windows 2000也更为稳定。2.1.1 安装Java

25、Orbix 2000需要一个JDK环境。如果你安装了JBuilder 4,可以直接使用其所带的JDK1.3。否则,你需要单独安装一个JDK。JDK是免费的,你可以下载一个较新的版本。JBuilder 4不是必需的。但我们建议你使用它,因为JBuilder 4 支持CORBA程序的编写,除了能使用其自身的Visibroker(Enterprise公司自己的ORB)外,通过配置,还可直接使用Orbix。这对提高我们的开发效率是很有帮助的。2.1.2 安装Orbix 2000Orbix 2000安装很简单,按照安装步骤进行即可。但要注意以下几点:尽量按缺省方式,这样可以省去不少配置上的麻烦。如安装路

26、径使用C:Program FilesIONA;使用典型安装等。Orbix 2000同时支持JAVA和C,还带有一个COMet Development Kit。只需安装Orbix 2000 v1.2 Java Development Kit即可。图 2.1 安装 Orbix 2000 for Java安装过程中,会提示输入JDK的路径,所以,最好先安装JAVA。假设JBuilder 4安装在C:JBuilder 4 目录下,那么,在提示框中输入C:JBuilder 4jdk1.3。Orbix 2000需要license。License.txt文件中包含有所需的license.txt, 告诉安装程

27、序这个文件所在的位置,安装程序会自动读取并安装所需的license。图 2.2 安装 license最后,安装程序会做一些配置工作,为使配置生效,你需要重启机器。2.1.3 配置Orbix 2000为使Orbix 2000能正常工作,还需要做一些额外的配置工作,主要是设置一些必需的环境变量。这里以Windows 2000为例。(Windows 98中需要在autoexec.bat中用相应命令设置。)打开Windows的控制面板,找到“System”-“Advanced”-“Environment Variables”,如图2.3所示。图 2.3 配置环境变量“Environment Varia

28、bles”分为两部分:“User variables”和“System variables”。(以下标*的环境参数是需要用户自己配置的。其他参数安装程序会自动配置,但由于安装不得当或其他原因,也可能不正确,这里列出来,对照检查一遍是否都正确。另外,我们假设程序安装在C:Program FilesIONA目录下,如果不是,作相应改变。)1. User variables:1)CLASSPATH(*)在CLASSPATH的末尾添加以下路径:C:Program FilesIONAorbix_art1.2localhost; .;.classes(添加的部分与前面部分用分号;隔开,下同)it_java

29、c, it_java工具会在运行时添加C:Program FilesIONAorbix_art1.2classes, 所以不必在这里设置。增加当前目录 . 和.classes会对你工作带来便利。 2)PATH 在末尾增加 C:Program FilesIONAbin 这样你可以在任何目录运行Orbix2000的命令了。2System variables:1)IT_PRODUCT_DIR (*)如果没有IT_PRODUCT_DIR,单击”new”按钮,添加它,其值设置为 C:Program FilesIONA,也即程序安装路径。这个参数非常重要,Orbix自动设置其他关于目录的参数时都基于它。2

30、)JAVA_HOME (*) 添加JAVA_HOME,设置为C:JBuilder4jdk1.3,或其他JDK路径。it_javac和it_java的运行需要它。3)PATH增加C:Program FilesIONAbinUser variables 和System variables中只需设置一个就行,当然都设置也无妨。4)IT_IDL_CONFIG_FILE(*)idl compiler工具需要这个参数,添加这个参数,设置为C:Program FilesIONAorbix_art1.2etc在开始编程之前,请确保上述设置是正确的。当你使用命令行方式时,如果你改变了设置,为使改变生效,需要重新

31、开一个DOS窗口,然后在此窗口下操作,但不必重启机器。2.2 编写第一个CORBA程序2.2.1 命令行方式我们先介绍在命令行方式下的开发步骤,编写一些小型的测试程序可以使用这种方式,因为没有必要启动庞大的JBuilder 4。 后面我们再介绍在JBuilder 4集成开发环境下的使用方法。实际上两者步骤是类似的,只是方便程度不一样。通常,开发一个CORBA应用的大致步骤如下:1)定义 IDL。2)用IDL complier 将IDL编译成 Client Stub 代码和 Server Skeleton代码。3)编写Server方的实现(Implementation)代码。4)编写 Serve

32、r。5)编写 Client。6)编译和调试。7)运行程序。编写Server Implementation和编写Server不是一回事。Server和Client都是带有main()函数的可执行的程序。但Server Implementation 是对interface的实现,它可以单独放在一个.java文件中,也可以和Server放在同一个文件中。下面以一个简单的例子详细讲解各个步骤。第一步:定义IDL首先建立一个工作目录,这里假设为D:myworksimpleDemo。然后编写IDL。这个例子我们使用1.2.1 节中grid.idl,一个对二维数组操作的例子。可以使用任何文本编辑器编写,如U

33、ltraEdit等。之后保存到D:myworksimpleDemo下。grid.idl定义了一个接口interface grid。其中定义两个方法get()和set(),用以获取和设置数组元素值。注意属性(attribute)的定义,这是C和JAVA中没有的概念(在Delphi中有这个概念),实际上它就相当于类的数据定义,但在映射到Java时被映射成方法。第二步:编译IDL 为Java Stub和Skeleton.打开DOS窗口,进入到D:myworksimpleDemo目录,在Dos命令提示符下键入:idl jbase jpoa grid.idl参数-jbase表示生成java stub c

34、ode,参数jpoa 表示生成java skeleton code,在Orbix 2000中,骨架代码使用POA方式。缺省情况下idl编译器会创建一个java_output的目录,如果idl中有module定义,还会生成与此module同名的子目录,并将编译后生成的.java程序放在此目录中。你可以开关参数控制编译方式,例如,如果想将客户stub和服务器skeleton代码分开,可以键入:idl jbase:-Oclient grid.idlidl jpoa:-Oserver grid.idl-O 参数控制输出目录。编译器会自动生成client和server目录,并将代码分别放在这目录中。我们

35、知道,idl编译器会将module映射成package,缺省情况下,module simpleDemo映射成package simpleDemo。如果想自己控制package的生成,例如要生成package demos.simpleDemo 形式的包,可以:idl jbase:-Oclient jbase:-Pdemos grid.idl编译器会在module指定的包前再加上-P参数指定的包前缀,即生成package demos.simpleDemo。注意不要写成-Pdemos.simpleDemo,否则会生成package demos.simpleDemo.simpleDemo。附录B中列出

36、了idl命令的用法。注意,我们看看idl生成的stub和skeleton代码。Stub Code包含以下文件:grid.java 定义了接口 interface grid,public interface grid extends gridOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity 直接由grid.idl中的interface grid 映射而来。_gridStub.java 桩代码,定义了class _gridStub public class _gridStub extends org.omg.COR

37、BA.portable.ObjectImpl implements gridpublic void set() ;pubic int get().;class _gridStub中实现了客户方的set()和get()等方法,它们封装了ORB的功能,截取客户的调用,执行Marshaling/Unmarshing等操作,最终得到调用结果。也就是说,在客户方声明一个grid类型的对象,实际上使用gridHelper操作得到的是一个_gridStub类型的实例,调用grid上的方法实际上是调用_gridStub上的方法。gridHelper.java 定义 public class gridHelpe

38、r 帮助客户方grid对象生成一个_gridStub类型的实例,同时得到服务器对象的引用。gridHolder.java 定义public final class gridHolder implements org.omg.CORBA.portable.Streamable当需要处理out,inout类型的参数时,需要这个类。gridOperations.java 定义public interface gridOperations void set() int get() 这个接口实际上是Server使用的。当客户方需要使用callback功能时,也需要这个接口。Skeleton Code则包

39、含以下文件: gridPOA.java 定义类abstract public class gridPOA extends org.omg.PortableServer.Servant implements org.omg.CORBA.portable.InvokeHandler, gridOperations Server方的Implementation代码直接继承自这个类。 gridPOATie.java 定义类public class gridPOATie extends simpleDemo.gridPOA当使用代理方式而不是继承方式创建Server Object时,使用这个类。 -jp

40、oa 参数只生成上述两个文件,实际上Skeleton Code也包含gridOperations.java,因为class gridPOA就是实现gridOperations的。上述接口(类)的继承关系如下:grid.idl中只定义了一个interface grid,实际上如果定义了多个interface, 那么对每个interface都会生成和上面类似的一套代码。第三步:编写Server方的Implementation代码(即编写Servant)到现在为止,我们才开始真正编写代码。引入了POA概念后,Server方的实现对象称为Servant, 编写Implementation代码实际上就是

41、对IDL定义的每个interface,都编写一个Servant,其中要现实interface中定义的每个方法。.这里我们将Servant类定义为class gridImpl,类名字可以自己随便取,通常都命名为xxxImpl的形式。Class gridImpl直接继承自gridPOA。在D:myworksimpleDemo目录下创建一个gridImpl.java文件,内容如下:package simpleDemo;public class gridImpl extends gridPOA short m_height; / store the height short m_width; / st

42、ore the width int m_array; / a 2D array to hold the grid data private int i=0; private int j=0; private int n=0; public gridImpl(short width, short height) m_array = new intwidthheight; / allocate the 2D array m_height = height; / set up height m_width = width; / set up width /* * Implementation of

43、the method which reads the height attribute */ public short height() return m_height; /* * Implementation of the method which reads the width attribute */ public short width() return m_width; /* * Implementation of the set operation */ public void set (short x, short y, int value) i+; n+; System.out

44、.println (- +n+ Server / +i+ grid.set()-); System.out.println (In grid.set() x = + x); System.out.println (In grid.set() y = + y); System.out.println (In grid.set() value = + value); m_arrayyx = value; /* * Implementation of the get operation */ public int get (short x, short y) j+; n+; System.out.p

45、rintln (- +n+ Server / +j+ : grid.get()-); int value = m_arrayyx; System.out.println (In grid.get() x = + x); System.out.println (In grid.get() y = + y); System.out.println (In grid.get() value = + value); return value; 编写好Implementation代码后,实际上你就可以编译了。使用it_javac 命令进行编译。在编译gridImpl.java之前,请先编译idl生成的stub和skeleton代码。1) 转到D:myworksimpleDemo,用mkdir classes建立一个目录d:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号