您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > corba_java
1CORBA程序设计指南(入门)Author:龙湘明Company:北京邮电大学国家重点实验室Date:2001-2-28Update:2020-06-30这里假设你对CORBA毫无所知。对JAVA略有所知,因为这里使用JAVA作为程序设计语言。学习了本书,你将对CORBA有个初步了解,并能编写一个简单完整的CORBA应用程序。1.CORBA简介CORBA(CommonObjectRequestBrokerArchitecture)是为了实现分布式计算而引入的。为了说明CORBA在分布计算上有何特点,我们从它与其它几种分布计算技术的比较中进行说明。与过去的面向过程的RPC(RemoteProcedureCall)不同,CORBA是基于面向对象技术的,它能解决远程对象之间的互操作问题。MicroSoft的DCOM(DistributedComponentObjectModel)也是解决这一问题的,但它基于Windows操作系统,尽管到本书编写时,DCOM已有在其他操作系统如SunSolaris,DigitalUnix,IBMMVS上的实现,但毫无疑问,只有在微软的操作系统上才会实现得更好。而只有CORBA是真正跨平台的,平台独立性正是CORBA的初衷之一。另一种做到平台无关性的技术是JavaRMI(RemoteMethodInvocation),但它只能用JAVA实现。CORBA与此不同,它通过一种叫IDL(InterfaceDefinitionLanguage)的接口定义语言,能做到语言无关,也就是说,任何语言都能制作CORBA组件,而CORBA组件能在任何语言下使用。因此,可以这样理解CORBA:CORBA一种异构平台下的语言无关的对象互操作模型。1.1CORBA体系结构CORBA的体系结构如下:图1.1CORBA体系结构2CORBA上的服务用IDL描述,IDL将被映射为某种程序设计语言如C++或Java,并且分成两分,在客户方叫IDLStub(桩),在服务器方叫IDLSkeleton(骨架)。两者可以采用不同的语言。服务器方在Skeleton的基础上编写对象实现(ObjectImplementation),而客户方要访问服务器对象上的方法,则要通过客户桩。而双方又要通过而ORB(ObjectRequestBroker,对象请求代理)总线通信。与传统的Client/Server模式(我们称为Two-tierclient/server)不同,CORBA是一种multi-tierclient/serverarchitecture,更确切的说,是一种three-tierclient/server模式。双重客户/服务器模式存在的问题是两者耦合太紧,它们之间采用一种私有协议通信,服务器的改变将影响到客户方。多重客户/服务器与此不同,两者之间的通信不能直接进行,而需要通过中间的一种叫代理的方式进行。在CORBA中这种代理就是ORB。通过它,客户和服务器不再关心通信问题,它们只需关心功能上的实现。从这个意义上讲,CORBA是一种中间件(Middleware)技术。下面列出CORBA中的一些重要概念,或者说CORBA中的几个重要名词,有助于读者了解CORBA的一些重要的方面。1.2CORBA中的几个概念1.2.1ORB(ObjectRequestBroker)CORBA体系结构的核心就是ORB。可以这样简单理解:ORB就是使得客户应用程序能调用远端对象方法的一种机制。图1.2ORB模型具体来说就是:当客户程序要调用远程对象上的方法时,首先要得到这个远程对象的引用,之后就可以像调用本地方法一样调用远程对象的方法。当发出一个调用时,实际上ORB会截取这个调用(通过客户Stub完成,“提高”篇中会详细解释),因为客户和服务器可能在不同的网络、不同的操作系统上甚至用不同的语言实现,ORB还要负责将调用的名字、参数等编码成标准的方式(称Marshaling)通过网络传输到服务器方(实际上在同一台机器上也如此),并通过将参数Unmarshaling的过程,传到正确的对象上(这整个过程叫重定向,Redirecting),服务器对象完成处理后,ORB通过同样的Marshaling/Unmarshaling方式将结果返回给客户。因此,ORB是一种功能,它具备以下能力:1.对象定位(根据对象引用定位对象的实现)2.对象定位后,确信Server能接受请求3.将客户方请求通过Marshaling/Unmarshing方式重定向到服务器对象上34.如果需要,将结果以同样的方式返回。1.2.2IDL(InterfaceDefinitionLanguage)IDL,接口定义语言,是CORBA体系中的另一个重要概念。如果说ORB使CORBA做到平台无关,那么IDL,则使CORBA做到语言无关。正像其名字中显示的那样,IDL仅仅定义接口,而不定义实现,类似于C中的头文件。实际上它不是真正的编程语言。要用它编写应用,需要将它映射它相应的程序设计语言上去,如映射到C++或JAVA上去。映射后的代码叫ClientStubCode和ServerSkeletonCode。IDL的好处是使高层设计人员不必考虑实现细节而只需关心功能描述。IDL可以说是描述性语言。设计IDL的过程也是设计对象模型的过程。它是编写CORBA应用的第一步,在整个软件设计过程中至关重要。IDL的语法很像C++,当然也像Java。很难想像一个程序设计人员是不懂C或Java的,所以,几乎所有的程序设计人员都能迅速理解IDL。而这正是IDL设计者所希望的。下面是一个IDL定义的简单例子://grid.idl//IDLdefinitionofa2-Dgrid:modulesimpleDemo{interfacegrid{readonlyattributeshortheight;//heightofthegridreadonlyattributeshortwidth;//widthofthegrid//IDLoperations//settheelement[row,col]ofthegrid,tovalue:voidset(inshortrow,inshortcol,inlongvalue);//returnelement[row,col]ofthegrid:longget(inshortrow,inshortcol);};};ThisIDLdefinesaninterfaceforagridCORBAobjectthatmaintainsagridor2-Darrayofdatavalues,whichaclientcanaccessormodifyremotely.Module类似于Java中包(Package)的概念,实际上modulesimpleDemo映射到JAVA正是packagesimpleDemo。而Interface类似于C++中的类(classs)声明,或是Java中的Interface定义。附录中列出了IDL的全部语法。1.2.3StubCode和SkeletonCodeStubcode和SkeletonCode是由IDLComplier自动生成的,前者放在客户方,后者放4在服务器方。不同厂商的IDLcomplier生成的Stub和Skeleton会略有区别,但影响不大。如上面的grid.idl,编译后,StubCode包含以下文件:grid.java_gridStub.javagridHelper.javagridHolder.javagridOperations.javaSkeletonCode则包含以下文件:gridOperations.javagridPOA.javagridPOATie.java(在StudCode也包含gridOperations.java,是因为在使用Callback机制时会用到。)这些文件的用途后面会讲到。1.2.4GIOP和IIOP我们知道,客户和服务器是通过ORB交互的,那么,客户方的ORB和服务器方的ORB又是通过什么方式通信呢?通过GIOP(GeneralInter-ORBProtocol)。也就是说,GIOP是一种通信协议,它规定了两个实体:客户和服务器ORBs间的通信机制。图1.3ORBs通信机制GIOP在设计时遵循以下目标:WidestpossibleavailabilitySimplicityScalabilityLowcostGeneralityArchitecturalneutrality也是说,GIOP设计的尽可能简单,开销最小,同时又具有最广泛的适应性和可扩展性,以适应不同的网络。GIOP定义了以下几个方面:51.TheCommonDataRepresentation(CDR)definition.通用数据表示定义。它实际上是IDL数据类型在网上传输时的编码方案。它对所有IDL数据类型的映射都作了规定。2.GIOPMessageFormats.它规定了Client和Server两个角色之间要传输的消息格式。主要包括Request和Reply两种消息。一个Request消息有以下几部分组成:AGIOPmessageheaderARequestHeaderTheRequestBody相应的,一个Reply消息则包括AGIOPmessageheaderAReplyHeaderTheReplyBodyGIOP1.1规定GIOPmessageheader格式如下://GIOP1.1structMessageHeader_1_1{charmagic[4];VersionGIOP_version;octetflags;//GIOP1.1changeoctetmessage_type;unsignedlongmessage_size;};RequestHeader格式如下://GIOP1.1structRequestHeader_1_1{IOP::ServiceContextListservice_context;unsignedlongrequest_id;booleanresponse_expected;octetreserved[3];//AddedinGIOP1.1sequenceoctetobject_key;stringoperation;Principalrequesting_principal;};RequestBody则按CDR规定的方式编码,它主要对方法调用的参数进行编码,如方法:doubleexample(inshortm,inoutPrincipalp);可表示成:structexample_body{shortm;//leftmostinorinoutparameterPrincipalp;//...totherightmost};3.GIOPTransportAssumptions:6主要规定在任何面向连接的网络传输层上的一些操作规则。如:Asymmetricalconnectionusage,Requestmultiplexing,Overlappingrequests,Connectionmanagement等。另外,因为CORBA是基于对象的,GIOP还需定义一套ObjectLocation的机制。GIOP因为是一种通用协议,所以不能直接使用。在不同的网络上需要有不同的实现。目前使用最广的便是Internet上的GIOP,称为IIOP(InternetInter-ORBProtocol)。IIOP基于TCP/IP协议。IIOP消息格式定义如下:moduleIIOP{//IDLextendedforversion1.1structVersion{octetmajor;octetminor;};structProfileBody_1_0{//renamedfromProfileBodyVersioniiop_version;stringhost;unsignedshortport;sequenc
本文标题:corba_java
链接地址:https://www.777doc.com/doc-6219882 .html