IDL接口定义语言_第1页
IDL接口定义语言_第2页
IDL接口定义语言_第3页
IDL接口定义语言_第4页
IDL接口定义语言_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IDL接口定义语言也叫“接口描述语言”(InterfaceDescriptionLanguage),是一个描述软件组件接口的语言规范。IDL用中立语言的方式进行描述,能使软件组件(不同语言编写的)间相互通信。IDL通常用于RPC(RemoteProcedureCall,远程过程调用)软件。IDL提供了一个“桥”来连接不同的系统。基于IDL的软件系统包括:Sun公司的ONCRPC,TheOpenGroup的DistributedComputingEnvironment(分布式计算环境),IBM的SystemObjectModel(系统对象模型),OMG组织的CORBA,Facebook公司的Thrift,用于WebService的WSDL。IDLSpecificationLanguage类似于其它的接口描述语言,IDL以独立于语言和硬件的方式来定义接口,允许组件间的接口规范采用不同语言编写,通过RPC可以执行在不同的机器上。JavaIDL把CORBA的能力移植到Java平台,提供了基于标准的互操作能力和连通性。JavaIDL使分布式带Web功能的Java应用程序能够透明地调用使用业界标准的OMGIDL的远程网络服务。JavaIDL技术是基于接口的,定义在CORBAIDL之上,为想使用Java编程语言的CORBA程序员进行编程的。这就是“Businessasusual”(照常营业,一切正常)的CORBA编程,支持Java技术,同样也支持C++或COBOL。IDL(InterfaceDefinitionLanguage)即接口定义语言,是CORBA规范的一部分,是跨平台开发的基础。IDL提供一套通用的数据类型,并以这些数据类型来定义更为复杂的数据类型。可变化IDL基本类型整数类型OMGIDL摒弃int类型在不同平台上取值范围不同带来的多义性的问题。常数定义常数可以是整数、字符、浮点数、字符串、Boolean,octet或枚举型,不能是any类型或用户定义的类型。OMGIDL数组类型IDLarray和sequence,可以轻易地被映射到实现语言中。序列可以包含所有类型的元素,不管是基本类型还是用户定义的类型。OMGIDL文件概述从本质上讲,OMGIDL接口定义语言不是作为程序设计语言体现在CORBA体系结构中的,而是用来描述产生对象调用请求的客户对象和服务对象之间的接口的语言。OMGIDL文件描述数据类型和方法框架,而服务对象则为一个指定的对象实现提供上述数据和方法。OMGIDL文件描述了服务器提供的服务功能,客户机可以根据该接口文件描述的方法向服务器提出业务请求。在大多数CORBA产品中都提供IDL到相关编程语言的编译器。程序设计人员只需将定义的接口文件输入编译器,设定编译选项后,就可以得到与程序设计语言相关的接口框架文件和辅助文件。IDL文件应用过程如图1所示。OMGIDL文件客户桩(Stub)服务器框架(Skeleton)客户机应用服务器应用图1OMGIDL文件编译过程在语法规则方面,类似于C++或Java中关于接口或对象的定义,OMGIDL增加了一些构造方法支持IDL特有的方法调用机制。OMGIDL只是一种说明性的语言,支持C++语法中的常量、类型和方法的声明。采用OMGIDL这样的说明性语言,其目的在于克服特定编程语言在软件系统集成及互操作方面的限制,这正是CORBA的诱人之处,同样也体现出采用CORBA构造分布式应用程序在网络时代的强大生命力°OMGIDL已经为C、C++、Java等主要高级程序设计语言制定了IDL到高级编程语言的映射标准。项目开发人员可以根据需要选择自己最熟悉的编程语言来独立开发基于CORBA的应用,而对软件系统的互操作能力不产生影响。OMGIDL的语法规则1.OMGIDL文件举例moduleCompute(typedefdoubleradius;typedeflongtimes;interfacePI(doublegetResult(inradiusaRadius,intimestime);}}上述接口定义文件主要用于客户端向服务对象提出请求:计算n值。因此,模块中定义了一个方法getResult(),以圆的直径(aRadius)和迭代次数(times)作为该方法的输入参数。OMGIDL词法规则OMGIDL采用ASCII字符集构成接口定义的所有标识符。标识符由字母、数字和下划线的任意组合构成,但第一个字符必须是ASCII字母。IDL认为大写字母和小写字母具有相同的含义,例如anExample和AnExample是相同的。与C++和Java类似,采用以“/*”开始,以“”'结束来注释一段代码,以“//”开始注释从“//”开始直至行尾的所有内容。另外,IDL保留了47个关键字,程序设计人员不能将关键字用作变量或方法名。需要注意的是关键字的大小写,例如:typedefdoublecontext;〃错误:定义的变量context是关键字typedefdoubleCONTEXT;〃错误:CONTEXT与关键字context冲突数据类型(1)基本数据类型:OMGIDL基本数据类型包括short、long和相应的无符号(unsigned)类型,表示的字长分别为16、32位。(2) 浮点数类型:OMGIDL浮点数类型包括float、double和longdouble类型。其中float表示单精度浮点数,double表示双精度浮点数,longdouble表示扩展的双精度浮点数。(3) 字符和超大字符类型:OMGIDL定义字符类型char为面向字节的码集中编码的单字节字符;定义类型wchar为从任意字符集中编码的超大字符。(4) 逻辑类型:用boolean关键字定义的一个变量,取值只有true和false。(5) 八进制类型:用octet关键字定义,在网络传输过程中不进行高低位转换的位元序列。(6)any数据类型:引入该类型用于表示OMGIDL中任意数据类型。常量OMGIDL用const关键字声明一个常量,用于模块(module)或接口(interface)中定义保持不变的量,如:constdoublePI=3.1415926;在IDL中,可以定义long、unsignedlong、unsignedshort、char、boolean、float、double>string类型的常量。构造数据类型类似于C和C++的语法规则,OMGIDL中构造数据类型包括结构、联合、枚举等形式。如下例:(1) 结构类型:typedeflongGoodsNumber;struct(GoodsNumbernumber;stringname;floatprice;}(2) 联合类型:unionstockInswitch(short)(case1:stocker:long;case2:goodsNamel:string;case3:goodsName2:string;}(3) 枚举类型:enumGoodsStatus{GOODS_SALED,GOODS_INSTOCK};数组类型OMGIDL的数组类型提供了多维定长、统一数据格式的数据存储方式一一数组。每一维的长度必须在定义时给定,所有数据单元必须存储相同类型的元素。如下例定义一个长度为20x100的整数数组:typedeflongaDimension[20][100];模板(template)类型OMGIDL提供两种类型的模板:⑴序列(sequence)类型:用该方法定义长度可变的任意数值类型的存储序列,通常在定义时可以指定长度,也可以不指定,如:typedefsequencevlong,80>aSequence;〃长度定义为80typedefsequencevlong>anotherSequence;〃长度不定(2)字符串(string)序列:同样对于字符串序列类型,也有两种定义方式:typedefstringv80>aName;//长度定义为80typedefstringanotherName;//长度不定8.接口(interface)在前几讲中,均提到了CORBA接口,接口作为服务对象功能的详细描述,封装了服务对象提供服务方法的全部信息,客户对象利用该接口获取服务对象的属性、访问服务对象中的方法。接口用关键字interface声明,其中包含的属性和方法对所有提出服务请求的客户对象是公开的,如下例:interfaceJobManager(readonlyattributestringFirstName;attributestringstatus;stringQueryJobStatus(inlongNumber,outstringproperty);}CORBACORBA(CommonObjectRequestBrokerArchitecture公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范。或者说CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。OMG组织成立后不久就制订了OMA(ObjectManagementArchitecture,对象管理体系结构)参考模型,该模型描述了OMG规范所遵循的概念化的基础结构。OMA由对象请求代理ORB、对象服务、公共设施、域接口和应用接口这几个部分组成,其核心部分是对象请求代理ORB(ObjectRequestBroker)0对象服务是为使用和实现对象而提供的基本服务集合;公共设施是向终端用户应用程序提供的一组共享服务接口;域接口是为应用领域服务而提供的接口;应用接口是由开发商提供的产品,用于它们的接口,不属于OMG标准的内容。ORB提供了一种机制,通过这种机制,对象可以透明的发出请求和接收响应。分布的、可以互操作的对象可以利用ORB构造可以互操作的应用。CORBA标准由对象管理组织(OMG)设立并进行控制,CORBA定议了一系列API,通信协议,和物件/服务信息模型用于使得异质应用程序能够互相操作,这些应用程序用不同的程序语言编写,运行在不同的平台上。CORBA因此为定义明确的物件提供了平台和位置的透明性,这些物件是分布式计算平台的基础。CORBA分布计算技术,是由绝大多数分布计算平台厂商所支持和遵循的系统规范技术,具有模型完整、先进,独立于系统平台和开发语言,被支持程度广泛的特点,已逐渐成为分布计算技术的标准。COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层是对象请求代理ORB,规定了分布对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布对象系统中的"软总线";在ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则。CORBA(公共对象请求代理架构):这是个和微软com,com+齐名的同类软件技术规范,由OMT提出。用于在不同进程(程序)之间,甚至是不同物理机器上的进程(程序)之间通讯。底层技术依靠RPC[远程过程调用]实现。面向对象的软件,以数据为中心设计,对象类既具有模块的封装性和类属等特性,还具有继承特性,极大地提高了类的可扩充性和可再用能力。对象类较之于传统软件的功能模块而另具有的优点是:(1) 易于理解,具有完整的语义特征;(2) 易于扩充和修改,具有较高的通用性和适应性;(3) 易于构造组装,具有规范的外部接口。开发应用组件必须遵循标准,以保证软件组件的互操作性,只有遵循统一的标准,不同厂商的、不同时期的、不同程序设计风格的、不同编程语言的、不同操作系统的、不同平台上的软件或软件部件才能进行交流与合作。为此,OMG(ObjectManageGroup)提供了一个对象标准CORBA,它定义了一个网连对象的接口,使得对象可以同时工作。基于CORBA的对象请求代理ORB为客户机/服务器开发提供了中间件的新格式。作为OMG成员的微软公司撇开CORBA而另辟了COM(ComponetObjectModel),即组件对象模型,并把COM定位成基于对象的软件开发模型,尽管COM被认为是微软鼓噪出来的技术,但支持COM的开发工具却不断增多,其中大部分来自于微软,包括VisualBasic和VisualC++。公共对象请求代理结构:CORBA标准全球性网络使线上的所有设备和软件成为全球共享的浩瀚的资源,计算机环境也从集中式发展到分布式环境,开放式系统的发展使用户能够透明地应用由不同厂商制造的不同机型不同平台所组成的异构型计算资源,因此,分布式处理和应用集成自然而然地成为人们的共同要求,那么什么是分布式处理和应用集成呢?它们的功能和关键技术是什么呢?简单地讲,分布式处理和应用集成就是指在异构的、网络的、物理性能差别很大的、不同厂商的、不同语言的信息资源的基础上构建信息共享的分布式系统,并且能够有效地进行应用系统和分布式处理的集成。分布式处理的关键在于定义可管理的软件构件,即面向对象技术中的“对象”。应用集成的关键在于为跨平台、跨机种、跨编程语言的产品提供统一的应用接口。OMG组织针对当今信息产业的要求,公布了CORBA标准,即公共对象请求代理体系结构(CommonObjectRequestBrokerArchitecture),这是一个具有互操作性和可移植性的分布式面向对象的应用标准。CORBA的核心是对象请求代理ORB,它提供对象定位、对象激活和对象通讯的透明机制。客户发出要求服务的请求,而对象则提供服务,ORB把请求发送给对象、把输出值返回给客户。ORB的服务对客户而言是透明的,客户不知道对象驻留在网络中何处、对象是如何通讯、如何实现以及如何执行的,只要他持有对某对象的对象引用,就可以向该对象发出服务请求。CORBA允许用户以两种不同的方式提出对象请求:1) 静态调用:通过给定接口的存根,在编译了对象代码后,进入客户端的程序。因此,静态调用必须在编译时就知道对象及其类型。2) 动态调用:通过ORB的动态调用接口DII,在运行时生成访问对象的代码。不管客户以哪一种形式提出请求,ORB的任务是:找出所要对象的位置,激活该对象,向对象传递此请求。对象执行所请求的服务后,把输出值返回给ORB,然后再由ORB返回给客户。CORBA的重要概念是:1.对象连接CORBA广泛地支持对象的实现,在单服务器系统中也可以实现由接口定义语言定义的接口。ORB的灵活性既可以直接集成已有的应用,又不会使新对象受某些原则的制约。对象连接提供了有不同类型对象实现时,使用ORB服务的方法,服务包括:对象引用、方法调用、安全控制、对象实现的激活与静候等。接口定义语言(IDL)CORBA用IDL来描述对象接口,IDL是一种说明性语言,它的语法类似于C++。IDL提供的数据类型有:基本数据类型、构造类型、模板类型、和复合类型、操作说明。这些类型可以用来定义变元的类型和返回类型,操作说明则可以用来定义对象提供的服务。IDL还提供模块构造,其中可以包含接口,而接口是IDL各类型中最重要的,它除了描述CORBA对象以外,还可以用作对象引用类型。IDL提供了接口继承性,派生接口可以继承其基类接口所定义的操作与类型。IDL的接口继承性有其特殊性,此处不赘述。总之,CORBA的IDL是一种说明性语言,描述面向对象系统开发所遵循的接口与实现相分离的基本原则。动态调用接口把IDL说明编译成面向对象程序设计语言的实代码后,客户可以调用已知对象的操作。在某些应用中,用户并不了解应用接口编译信息,但也要求调用对象的操作,这时就要动态调用接口来调用用户的操作了。例如,图形用户接口应支持用户浏览接口公共库,以获得每个对象所支持的操作信息,用户可根据自己的需求从浏览对象中挑选出所需的对象操作,具体的对象操作的调用实际上是用动态调用接口来完成的。接口公用库接口公用库持久地存储IDL的接口说明,借助于接口公用库,可以实现对象继承性层次结构的导航,并且提供了有关对象支持的所有操作的描述。接口公用库最常见的功能是为接口浏览器提供信息,帮助应用开发者找出潜在的可重用的软件部件。ORB可以利用接口公用库检查运行时的操作参数类型,但接口公用库的基本功能是提供类型信息,为动态调用接口发送请求提供信息支持。CORBA的不足之处:尽管有多家供应商提供CORBA产品,但是仍找不到能够单独为异种网络中的所有环境提供实现的供应商。不同的CORBA实现之间会出现缺乏互操作性的现象,从而造成一些问题;而且,由于供应商常常会自行定义扩展,而CORBA又缺乏针对多线程环境的规范,对于像C或C++这样的语言,源码兼容性并未完全实现。CORBA过于复杂,要熟悉CORBA,并进行相应的设计和编程,需要许多个月来掌握,而要达到专家水平,则需要好几年。一、什么是JavaIDL——JavaIDL(InterfaceDefinitionLanguage)可实现网络上不同平台上的对象相互之间的交互,该技术基于通用对象请求代理体系结构CORBA规范说明。IDL是不依赖于语言的接口定义语言,所有支持CORBA的语言都有IDL到该语言的映射。就像其名字所表示的那样,JavaIDL支持到Java语言的映射。CORBA规范说明和IDL映射是由OMG(ObjectManagementGroup)定义的。OMG由700多个成员组成,Sun公司是其成员之一,它在定义IDL到Java映射的工作中起了主要作用。----JDK1.1给Java开发人员提供了开发100%纯Java分布式应用的功能,即远程方法调用JavaRMI。而Java2平台提供的JavaIDL可以在分布式应用中使用非Java语言,也就是说,Java2平台提供的ORB(ObjectRequestBroker)可以和任何遵从CORBA规范的ORB互操作,包括IONATechnologies的Orbix、VisigenicSoftware的VisiBroker>IBM的ComponentBroker等。目前,主要的Web浏览器(MicrosoftIE4.0和NetscapeNavigator4.0)实现的主要是JDK1.1中的功能。不过,利用Sun公司提供的Java插件(Plug-in)可以使浏览器具备Java2平台的所有特征。----需要说明的是,Java2平台提供了两种不同的方法来构造分布式应用系统,即JavaRMI和JavaIDL,它们具有相似的特征和功能,JavaRMI支持用Java语言写的分布式对象,JavaIDL可以与支持CORBA的任何程序设计语言如C、C++、COBOL等写的分布式对象交互。这两种方法各自具有不同的特点:——(1)100%纯Java和对遗产应用系统(legacysystem)的支持。JavaRMI是对分布式应用系统的100%纯Java解决方法,具有Java的"Writeonce,runanywhere"的优点。用JavaRMI开发的应用系统可以部署在任何支持Java运行环境的平台上。----相反,JavaIDL是基于CORBA规范标准的技术,可以远程调用非Java语言编写的对象,因此JavaIDL提供了对那些用非Java语言开发的遗产应用系统的支持。----(2)使用不同的通信协议。JavaRMI和JavaIDL目前使用不同的通信协议,JavaIDL使用CORBA/IIOP协议,IIOP(InternetInter—ORBProtocol)协议可以使位于不同平台上、用不同语言写的对象以标准的方式进行通信;JavaRMI目前使用Java远程消息交换协议JRMP(JavaRemoteMessagingProtocol)进行通信,JRMP是专为Java的远程对象制定的协议,不过Sun和IBM已经宣布将来会支持在RMI中使用IIOP协议,以便和遵从CORBA规范的远程对象通信。----(3)通过引用调用对象还是通过值调用对象。在JavaIDL中,客户端通过引用与远程对象交互,即客户机使用桩(Stub)对远程服务器上的对象进行操作,但并不拷贝服务器上的对象。----相反,RMI使得客户机可以通过引用和远程对象交互,也可以把远程对象下载到客户机运行环境进行操作,由于在RMI中使用的对象都是Java对象,因此RMI使用Java中的对象串行化(Serialization)功能在服务器和客户机之间传输对象。不过CORBA规范的以后版本将包括按值调用对象的功能。----JavaRMI和JavaIDL各有自己的优缺点,从某种意义上说,RMI可以看作是RPC(RemoteProcedureCalls)的面向对象版本°RMI的最大优势是可以用它来提供100%纯Java的解决方案,这意味着构造RMI应用系统将比较简单,但这也正是基于RMI的应用系统的一个缺点,即只能在Java环境中运行,不能充分利用遗产应用系统。----JavaRMI和JavaIDL均可满足一定范围的用户需求,都适用于一定范围的应用,两者之间存在着重叠,有些应用可使用两者中的任何一种技术开发,但对于某些应用来说,采用其中的某一种比采用另一种更为恰当。二、使用CORBA和JavaIDL----从1989年以来,OMG一直致力于开放的软件总线体系结构CORBA的规范说明的定义,利用CORBA,不同供应商开发的、运行在不同平台上的构件可以互操作,而不管该对象位于何处,用什么语言实现。JavaIDL使得Java也支持CORBA规范说明。作为Java企业计算API的一部分,JavaIDL可以保证企业异质计算中的无缝互操作性和可连接性。----CORBA对象和一般的程序设计语言中的对象的区别在于:CORBA对象可以位于网络中的任何位置;CORBA对象可以和其他平台上的对象交互;CORBA对象可以用任何程序设计语言编写,只要有IDL到该语言的映射即可(目前已包括到Java、C++、C、Smalltalk、COBOL、Ada等语言的映射)。----接口定义语言IDL用于定义CORBA对象的接口,所有的CORBA对象都支持IDL接口。IDL语法和C++非常类似,利用JavaIDL,可以在Java中定义、实现、存取CORBA对象。对于每个IDL,idltojava生成一个Java接口和其他一些必要的.java文件,包括一个客户端桩(Stub)和服务器端骨架(Skeleton)。----为了使用JavaIDL,需要有idltojava编译器,idltojava产生和任何遵从CORBA规范的ORB一起工作的客户端桩和服务器端骨架,Java2平台中包括CORBAAPI和ORB,使得Java应用系统通过IIOP协议可以调用远程的CORBA对象,JavaORB支持暂态(Transient)CORBA对象,提供了暂态名字服务器把对象组织成树目录结构,名字服务器遵从CORBA中COS规范说明的命名服务规范说明(NamingServiceSpecification)0----图1说明了从客户端到服务器发送一个消息请求的过程,其中客户端也可以是一个CORBA对象:----客户机不需要了解CORBA对象的位置与实现细节,也不需要了解哪个ORB用于存取对象。----在客户端,应用系统包括远程对象的引用,对象引用使用桩方法作为远程方法的代理,这个方法事实上在ORB中的,所以调用桩方法会调用ORB的连接功能,ORB会把对桩方法的调用传递到服务器端。----在服务器端,ORB利用骨架代码把远程调用转换成本地对象的方法调用,骨架需要对调用和参数的格式进行转换。同时,当方法返回时,骨架对结果进行变换,然后通过ORB把结果返回给客户机。----不同的ORB之间通过IIOP协议进行通信,IIOP是建立在TCP/IP之上的协议。----CORBA目前还处于发展阶段,一些标准还在定义之中,但CORBA中的大部分基本结构已经定义,许多软件供应商已根据CORBA的定义作了很多开发工作,JavaIDL就是该规范说明的一个实现。但在Java2平台中,并没有实现CORBA规范说明中的所有特征,如:接口库:在一般的JavaIDL操作中并不需要接口库,Java客户机可以存取其他的接口库,如C++ORB提供的接口库;RMI/IIOP协议;按值调用对象;IDL中的一些类型如wchar、wstring、longdouble等。三、IDL到Java的映射----为了使Java支持CORBA规范说明,需要一个把IDL中的元素映射为Java中元素的标准途径,Sun已经制订了两者之间的映射规则,并提供了编译器idltojava,以便从IDL得到相应的桩和骨架。----下表列出了一些IDL中元素和Java中元素的映射关系。----和Java中的接口一样,IDL接口不包含方法的具体实现,Java开发人员需在Java类中提供对这些方法的具体实现。四、使用JavaIDL开发应用的过程及实例----用JavaIDL开发分布式应用系统一般可分为五个步骤:----1.定义远程接口----用IDL定义远程对象的接口,使用IDL而不是Java语言是因为idltojava编译器可以自动地从IDL产生Java语言的桩和骨架源文件,以及和ORB连接时所需要的一些代码。使用IDL,开发人员可以用其他语言来实现客户机和服务器。如果要为一个已经存在的CORBA服务实现客户机,或为一个已经存在的客户机实现服务,则首先要给出IDL接口,然后运行idltojava编译器产生桩和骨架,在此基础上再进行实现。----2.编译远程接口----在IDL文件运行idltojava编译器,产生Java版本的接口,以及桩和骨架代码文件,这些代码文件使得应用程序可以和ORB相连接。----3.实现服务器----把idltojava编译器产生的骨架和服务器应用程序集成在一起,除了要实现远程接口中的方法之外,服务器代码还要包括启动ORB以及等待远程客户机的调用等部分。----4,实现客户机----类似地,以桩作为客户端应用程序的基础,客户机建立在桩之上,通过JavaIDL提供的名字服务查询服务器,获得远程对象的引用,然后调用远程对象中的方法。----5,启动应用程序----一旦实现了服务器和客户机,就可以启动名字服务,接着启动服务器,然后运行客户机。----下面以一个经典的HelloWorld程序来说明具体的开发过程。HelloWorld包含一个操作,该操作返回一个字符串并打印出来,Client和Server之间的通信过程如下:----(1)客户端应用程序或小应用程序调用HelloServer的sayHello操作;----(2)ORB把调用传递到已注册的服务对象;----(3)服务对象运行sayHello方法,返回一个Java字符串;----(4)ORB把该字符串返回给客户机;----(5)客户机打印该字符串的值。----尽管HelloWorld程序比较简单,但它涉及到的任务和几乎任何一个使用CORBA静态调用的分布式应用系统所涉及到任务相同,图2说明了如何用CORBA在客户机和服务器之间实现经典的"HelloWorld'程序。----首先是定义Hello.idl,下面是用IDL描述的Hello.idl,只有一个操作(方法),该操作返回一个字符串。ModuleHelloApp{interfaceHello{stringsayHello();};};----然后把Hello.idl文件映射为Java源代码文件,用以下命令编译Hello.idl文件:——idltojavaHello.idl----根据命令行中的不同选项,idltojava编译器产生不同的文件,上面这条命令将创建子目录HelloApp并在其中产生五个文件:_HelloImplBase.java、_HelloStub.java、Hello.java、HelloHelper.java、HelloHolder.java。----要完成该应用程序,还要分别在这五个文件的基础上提供服务器端和客户机端的实现。----CORBA服务器程序的结构和大部分Java应用程序的结构一样,即导入所需要的包,声明服务器类,定义main方法,处理一些例外等。另外,CORBA服务器要有一个ORB对象,每个服务器实例化一个ORB,并向其注册服务对象,因此当ORB接收到调用请求时可以寻找到服务器。最后是服务对象的管理,服务器是一个进程,实例化了一个或多个服务对象,服务对象具体实现接口中说明的操作。HelloServer和命名服务一起工作,使得服务对象对于客户机来说是可用的,服务器需要对名字服务的对象引用,可以向名字服务注册,并保证向Hello接口的调用被路由到其服务对象上,最后是等待客户机的调用。----CORBA客户机的结构和大部分Java应用程序的结构基本相似,即导入所需要的包、声明应用类、定义main方法、处理一些例外等。另外和服务器程序一样,一个CORBA客户机也需要本地的ORB来执行所有的配置工作,每个客户机实例化一个org.omg.CORBA.ORB对象,然后向该对象传递一些必要的信息以进行初始化,最后是利用ORB取得所需要的服务。一旦一个应用有了ORB,即可通过ORB来确定应用所需要的服务的位置,在本例子中即是Helloserver。为了调用CORBA对象中的操作,客户端应用要有对该对象的引用,有很多种方法可以得到这种引用,如调用ORB.resolve_initial_references或使用其他的CORBA对象(如命名服务),当在分布式环境中没有命名服务可用时,CORBA客户机使用字符串化对象引用(Stringifiedobjectreference)来得到其第一个对象。1.4接口定义语言(IDL)一个IDL文件定义公共的应用程序接口(API),通过服务程序中的对象向外公布。个CORBA对象的类型称作接口,与C++中的类或者Java中的接口类似。IDL接口支持多重继承。一个IDL文件示例如图1.1所示。IDL接口可以包括方法和属性。很多人都误以为一个IDL接口的属性类似于C++中的示例变量(或者Jave中的域)的概念。这是错误的。一个属性只是在语法上对一对儿get-和set-类型方法的称谓。属性可以是只读的,这种情况时该属性只有一个get-类型的方法。moduleFinance(typedefsequence<string>StringSeq;structAccountDetails(stringname;StringSeqaddress;longaccountnumber;doublecurrentbalance;};exceptioninsufficientFunds{};interfaceAccount{voiddeposit(indoubleamount);voidwithdraw(indoubleamount)raises(insufficientFunds);readonlyattributeAccountDetailsdetails;};};“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““*************************************************************************““““““““““““““““““““““““““““****************************图1.1:IDL文件示例方法的参数有一个指定的方向,可以是in(意味着参数由客户程序传入服务程序),out(参数从服务程序传回客户程序)或者inout(参数是双向传递的)。方法同样可以有返回值。方法在某块出错时可以引发(抛出)一个异常。有30多种预定义的异常类型,称作系统异常,他们都可以由方法抛出,尽管在实际系统中CORBA运行时系统引发的异常多于应用程序代码引发的。除了预定义的系统异常,新的异常类型可以在IDL文件中定义,这些异常可称为用户定义的异常。方法署名的raises子句指定该方法可能抛出的用户定义异常。方法的参数(包括返回值)可以是内置类型的一种 例如:string,boolean或者long,也可以是IDL文件中定义的用户自定义的类型。用户定义类型可以是一下的任意一种:结构体。类似于C/C++中的结构体或者Java中只包含公共域的类。序列。集合类型,就像一个可以增或减的一维数组。数组。IDL数组的维度在IDL文件中指定,所以数组是固定大小的,这就是说他不能在运行时增或者减。数组在IDL中很少用到。序列类型更灵活,所以用的更多。自定义。给现存的类型定义一个新名字。例如,下面的语句定义age可用来描述short。typedefshortage;默认情况下,IDL的序列和数组是匿名类型,也就是说他们没有名字。通常使用typedef的重要意义在于给序列或者数组的声明关联一个名字。例句可以在图1.1中StringSeq的定义中看到。联合体。该类型可以在运行时保留多个值中的一个。例如:unionFooswitch(short)(case1:booleanboolVal;case2:longlongVal;case3:stringstringVal;};一个Foo类型的实例可以保存一个boolean、long或者string值。前面的case标记(成为判别式)表明当前是哪种值。与IDL联合体相同的理念可以在很多面向过程的语言中找到。但是,他们很少在面向对象的语言中使用,因为多态统称能以更好的方式达到同样的目的。枚举类型。枚举在概念上类似于一个常整型集合的声明。例如:enumcolor(red,green,blue);enumcity(Dublin,London,Paris,Rome);从本质上说,CORBA使用整数表达不同的枚举值,使用枚举声明的好处在于很多编程语言都有对它的内在支持,或者相似的机制,可以用来进行强类型判识,这样程序员就不会将city变量和color变量相加。定点类型。定点类型保存定点数值,而float和double类型保存浮点数值。浮点计算适用于很多用途,但是,可能导致几个小数位后的舍入误差。对比来说,定点数值可能比对应的浮点数值占用更多的内存空间,但是他们有避免舍入误差的优点。使用定点数值趋向于限制在适当的应用领域。例如金融计算和数字信号处理等。尽管一个工程使用定点类型数字,它很可能使用定点计算作为细节实现却不将定点数字的使用公布为公共的IDL接口。由于以上原因,定点类型很少在IDL文件中声明。值类型。在9.2节、96页讨论。IDL类型可以组织在一个module中。module结构与C++中的namespace或者Java中的package有异曲同工之妙,也就是说,他事先给类型名称前添加了一个前缀,以避免命名空间冲突。IDL中的域操作符是“::”。例如,Finance::Account是Finace模块中定义的Account类型的全域名编译IDL后生成的Java类Helper为接口客户提供有用的助手功能的类。编译器为narrow功能自动生成代码,这种narrow功能让客户将CORBA对象引用强制转换为接口类型。还提供了绑定(bind)功能,用户可以用其查找该类型的对象。Holder含有接口类型的公共实例成员的类。用户和服务器用其来以方法调用的out和inout参数的形式传递接口类型的对象Stub为接口对象实现客户端存根的类,它是真正的提供排列功能的接口的内部实现。Operations定义了IDL功能的类。TieCORBA支持两种类型的程序:基于继承(inheritance-based)的和基于委托的(delegantion-bas

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论