corba程序设计Word下载.docx
《corba程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《corba程序设计Word下载.docx(65页珍藏版)》请在冰豆网上搜索。
双重客户/服务器模式存在的问题是两者耦合太紧,它们之间采用一种私有协议通信,服务器的改变将影响到客户方。
多重客户/服务器与此不同,两者之间的通信不能直接进行,而需要通过中间的一种叫代理的方式进行。
在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方式重定向到服务器对象上
4.如果需要,将结果以同样的方式返回。
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;
//heightofthegrid
readonlyattributeshortwidth;
//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和SkeletonCode
Stubcode和SkeletonCode是由IDLComplier自动生成的,前者放在客户方,后者放在服务器方。
不同厂商的IDLcomplier生成的Stub和Skeleton会略有区别,但影响不大。
如上面的grid.idl,编译后,StubCode包含以下文件:
grid.java
_gridStub.java
gridHelper.java
gridHolder.java
gridOperations.java
SkeletonCode则包含以下文件:
gridOperations.java
gridPOA.java
gridPOATie.java
(在StudCode也包含gridOperations.java,是因为在使用Callback机制时会用到。
)
这些文件的用途后面会讲到。
1.2.4GIOP和IIOP
我们知道,客户和服务器是通过ORB交互的,那么,客户方的ORB和服务器方的ORB又是通过什么方式通信呢?
通过GIOP(GeneralInter-ORBProtocol)。
也就是说,GIOP是一种通信协议,它规定了两个实体:
客户和服务器ORBs间的通信机制。
图1.3ORBs通信机制
GIOP在设计时遵循以下目标:
Ø
Widestpossibleavailability
Simplicity
Scalability
Lowcost
Generality
Architecturalneutrality
也是说,GIOP设计的尽可能简单,开销最小,同时又具有最广泛的适应性和可扩展性,以适应不同的网络。
GIOP定义了以下几个方面:
1.TheCommonDataRepresentation(CDR)definition.
通用数据表示定义。
它实际上是IDL数据类型在网上传输时的编码方案。
它对所有IDL数据类型的映射都作了规定。
2.GIOPMessageFormats.
它规定了Client和Server两个角色之间要传输的消息格式。
主要包括Request和Reply两种消息。
一个Request消息有以下几部分组成:
AGIOPmessageheader
ARequestHeader
TheRequestBody
相应的,一个Reply消息则包括
AGIOPmessageheader
AReplyHeader
TheReplyBody
GIOP1.1规定GIOPmessageheader格式如下:
//GIOP1.1
structMessageHeader_1_1{
charmagic[4];
VersionGIOP_version;
octetflags;
//GIOP1.1change
octetmessage_type;
unsignedlongmessage_size;
RequestHeader格式如下:
structRequestHeader_1_1{
IOP:
:
ServiceContextListservice_context;
unsignedlongrequest_id;
booleanresponse_expected;
octetreserved[3];
//AddedinGIOP1.1
sequence<
octet>
object_key;
stringoperation;
Principalrequesting_principal;
RequestBody则按CDR规定的方式编码,它主要对方法调用的参数进行编码,如方法:
doubleexample(inshortm,inoutPrincipalp);
可表示成:
structexample_body{
shortm;
//leftmostinorinoutparameter
Principalp;
//...totherightmost
3.GIOPTransportAssumptions:
主要规定在任何面向连接的网络传输层上的一些操作规则。
如:
Asymmetricalconnectionusage,Requestmultiplexing,Overlappingrequests,Connectionmanagement等。
另外,因为CORBA是基于对象的,GIOP还需定义一套ObjectLocation的机制。
GIOP因为是一种通用协议,所以不能直接使用。
在不同的网络上需要有不同的实现。
目前使用最广的便是Internet上的GIOP,称为IIOP(InternetInter-ORBProtocol)。
IIOP基于TCP/IP协议。
IIOP消息格式定义如下:
moduleIIOP{//IDLextendedforversion1.1
structVersion{
octetmajor;
octetminor;
structProfileBody_1_0{//renamedfromProfileBody
Versioniiop_version;
stringhost;
unsignedshortport;
structProfileBody_1_1{
TaggedComponent>
components;
1.2.5DynamicInvocationInterface(DII)和DynamicSkeletonInterface(DSI)
动态调用接口(DII)和动态骨架接口(DSI)是用来支持客户在不知道服务器对象的接口的情况下也能调用服务器对象。
一个增加了DII和DSI的CORBA调用模型如下:
图1.4增加了DII和DSI的调用模型
我们在“提高篇”中再详细讲述DII和DSI。
1.2.6ObjectAdapter(对象适配器)
对象适配器是ORB的一部分。
它主要完成对象引用的生成、维护,对象定位等功能。
对象适配器有各种各样。
BasicObjectAdapter(BOA,基本对象适配器)实现了对象适配器的一些核心功能。
而PortableObjectAdapter(POA,可移植对象适配器)则力图解决对象实现在不同厂商的ORBs下也能使用的问题。
最新的ORB产品一般都支持POA。
还有其他一些专有领域的对象适配器如DatabaseObjectAdapter等。
1.3CORBA历史
CORBA是由OMG(ObjectManagementGroup)负责制定和维护的一组规范。
OMG成立于1989年,是一个非营利的国际性软件组织,主要致力于为分布式计算提供解决方案并制定规范。
除CORBA外,OMG还制定了如UML(UnitedModelingLanguage,统一建模语言)、CWM等其他重要规范。
OMG目前已有世界上760多个成员,东南大学是中国唯一的OMG成员。
CORBA自1990提出并被OMG采纳以来,已历经多个版本。
分别称为CORBA1、CORBA2和CORBA3。
其中CORBA1是对CORBA1.x的统称,CORBA2是对CORBA2.x的统称。
目前CORBA3规范还在制订中,不久便可面世。
下面是CORBA版本的更新历史。
CORBA1:
CORBA1.090-12,提出CORBA框架
CORBA1.191早期,定义了IDL及ORBInterface。
CORBA1.292-93,修订
CORBA定义了ORB的一些基本特性,但是没有定义而ORB间的通用协议。
CORBA2主要解决这一问题。
CORBA2:
CORBA2.094-12,定义了GIOP和IIOP
CORBA2.197-08
CORBA2.298-02,增加了POA。
CORBA2.398-12
CORBA2.3.199-10,一些Changebars.
CORBA2.400-10,具备CORBA3的雏形,包括:
QoSSpecification,AsynchronousMessaging,MinimumCORBA,Real-TimeCORBA,CORBA Components,NotificationServices,FirewallSpecification等。
CORBA2.4.100-11
CORBA2.4.201-02
因此,可以说,CORBA1提出ORB和IDL等CORBA基本概念,CORBA2主要贡献是IIOP,而在制订中CORBA3则集中于CORBAComponents技术及Real-time特性等。
对CORBA的简要介绍就到这里。
关于OMG及CORBA的更多信息,可访问OMG站点:
http:
//www.omg.org.
下面我们开始编写第一个CORBA程序。
2使用Orbix2000编写第一个CORBA程序
在编写CORBA程序前,需要安装CORBA环境。
提供CORBA产品的厂商有很多,这里我们采用IONA公司的Orbix2000。
IONA公司在CORBA领域一直处于领先地位,其产品几乎总是和CORBA规范同时出台。
Orbix2000是IONA公司2001年2月发布的最新产品,它具有Real-time特性,而这正是CORBA在电信领域应用的最关键的特性之一。
而程序设计语言采用JAVA。
其开发环境为JBuilder4.JBuilder4是Enterprise公司(原著名的Boland公司)推出的最新JAVA集成开发环境,其内嵌JDK1.3。
2.1安装环境
你需要安装JAVA和CORBAORB环境,前者使用JBuilder4,后者使用Orbix2000。
操作系统建议使用Windows2000(ProfessionalorServer),因为我们后面所讲的一些配置工作是基于Windows2000,和Windows98稍有区别。
另外,Windows2000也更为稳定。
2.1.1安装Java
Orbix2000需要一个JDK环境。
如果你安装了JBuilder4,可以直接使用其所带的JDK1.3。
否则,你需要单独安装一个JDK。
JDK是免费的,你可以下载一个较新的版本。
JBuilder4不是必需的。
但我们建议你使用它,因为JBuilder4支持CORBA程序的编写,除了能使用其自身的Visibroker(Enterprise公司自己的ORB)外,通过配置,还可直接使用Orbix。
这对提高我们的开发效率是很有帮助的。
2.1.2安装Orbix2000
Orbix2000安装很简单,按照安装步骤进行即可。
但要注意以下几点:
尽量按缺省方式,这样可以省去不少配置上的麻烦。
如安装路径使用C:
\ProgramFiles\IONA;
使用典型安装等。
Orbix2000同时支持JAVA和C,还带有一个COMetDevelopmentKit。
只需安装Orbix2000v1.2JavaDevelopmentKit即可。
图2.1安装Orbix2000forJava
安装过程中,会提示输入JDK的路径,所以,最好先安装JAVA。
假设JBuilder4安装在C:
\JBuilder4目录下,那么,在提示框中输入C:
\JBuilder4\jdk1.3。
Orbix2000需要license。
License.txt文件中包含有所需的license.txt,告诉安装程序这个文件所在的位置,安装程序会自动读取并安装所需的license。
图2.2安装license
最后,安装程序会做一些配置工作,为使配置生效,你需要重启机器。
2.1.3配置Orbix2000
为使Orbix2000能正常工作,还需要做一些额外的配置工作,主要是设置一些必需的环境变量。
这里以Windows2000为例。
(Windows98中需要在autoexec.bat中用相应命令设置。
打开Windows的控制面板,找到“System”-“Advanced”-“EnvironmentVariables”,如图2.3所示。
图2.3配置环境变量
“EnvironmentVariables”分为两部分:
“Uservariables”和“Systemvariables”。
(以下标*的环境参数是需要用户自己配置的。
其他参数安装程序会自动配置,但由于安装不得当或其他原因,也可能不正确,这里列出来,对照检查一遍是否都正确。
另外,
我们假设程序安装在C:
\ProgramFiles\IONA目录下,如果不是,作相应改变。
1.Uservariables:
1)CLASSPATH(*)
在CLASSPATH的末尾添加以下路径:
C:
\ProgramFiles\IONA\orbix_art\1.2\localhost;
.\;
.\classes
(添加的部分与前面部分用分号;
隔开,下同)
it_javac,it_java工具会在运行时添加C:
\ProgramFiles\IONA\orbix_art\1.2\classes,所以不必在这里设置。
增加当前目录.\和.\classes会对你工作带来便利。
2)PATH
在末尾增加C:
\ProgramFiles\IONA\bin
这样你可以在任何目录运行Orbix2000的命令了。
2.Systemvariables:
1)IT_PRODUCT_DIR(*)
如果没有IT_PRODUCT_DIR,单击”new”按钮,添加它,其值设置为C:
\ProgramFiles\IONA,也即程序安装路径。
这个参数非常重要,Orbix自动设置其他关于目录的参数时都基于它。
2)JAVA_HOME(*)
添加JAVA_HOME,设置为C:
\JBuilder4\jdk1.3,或其他JDK路径。
it_javac和it_java的运行需要它。
3)PATH
增加C:
Uservariables和Systemvariables中只需设置一个就行,当然都设置也无妨。
4)IT_IDL_CONFIG_FILE(*)
idlcompiler工具需要这个参数,添加这个参数,设置为C:
\ProgramFiles\IONA\orbix_art\1.2\etc
在开始编程之前,请确保上述设置是正确的。
当你使用命令行方式时,如果你改变了设置,为使改变生效,需要重新开一个DOS窗口,然后在此窗口下操作,但不必重启机器。
2.2编写第一个CORBA程序
2.2.1命令行方式
我们先介绍在命令行方式下的开发步骤,编写一些小型的测试程序可以使用这种方式,
因为没有必要启动庞大的JBuilder4。
后面我们再介绍在JBuilder4集成开发环境下的使用方法。
实际上两者步骤是类似的,只是方便程度不一样。
通常,开发一个CORBA应用的大致步骤如下:
1)定义IDL。
2)用IDLcomplier将IDL编译成ClientStub代码和ServerSkeleton代码。
3)编写S