CORBA接口开发详解.doc_第1页
CORBA接口开发详解.doc_第2页
CORBA接口开发详解.doc_第3页
CORBA接口开发详解.doc_第4页
CORBA接口开发详解.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

针对电信行业CORBA接口开发详解作者:文章来源:发布日期:2005年01月01日浏览次数:1次CORBA基本介绍CORBA(公用对象请求代理体系)是OMG(对象管理组织)于1991年提出的基于对象技术的分布计算应用软件体系结构。CORBA标准主要分为三个部分:接口定义语言(IDL)、对象请求代理(ORB),以及ORB之间的互操作协议IIOP,核心是对象请求代理。CORBA可以抽象系统平台、网络通讯及编程语言的差异。通过在CORBA技术规范中定义多种类型的服务,如名字服务(NamingService)、事务服务(TransactionService)、对象生命期服务(LifeCycleService)、并发控制服务(ConcurrencyControlService)、时间服务(TimeService)等功能,为应用软件开发者提供一个全面、健壮、可扩展的分布对象计算平台,使面向对象的应用软件在分布异构环境下方便地实现可重用、易移植和互操作。与RMI比较与RMI不同,CORBA不属于Java平台本身。OMG(ObjectManagementGroup,对象管理组织)发明了CORBA规范,CORBA被设计成与平台和语言无关。因此,CORBA对象可以运行于任何平台之上,位于网络的任何位置,还可以用任何语言(包括Java、C、C+和Smalltalk等)编写,只要该语言具有IDL(InterfaceDefinitionLanguage,接口定义语言)的映射。与RMI相比,CORBA是为更大、可伸缩更强的系统准备的,在这些系统中可能有数千个对象;CORBA的编程和部署比RMI更复杂,但允程序员开发需要事务、安全性等支持的企业级系统;CORBA的命名服务也比RMI命名注册功能更强大和灵活。CORBA的实现称为ORB(ObjectRequestBroker,对象请求代理)。JavaIDL即是CORBA的一个实现,它是JDK1.3或更高版本的核心软件包之一,定义在org.omg.CORBA及其子包中。在JavaIDL的支持下,开发人员可以使用如下两种方法将Java和CORBA集成在一起:?创建Java对象并使之可在CORBAORB中展开,?创建Java类并作为和其它ORB一起展开的CORBA对象的客户。这种方法提供了另外一种途径,通过它Java可以被用于将你的新的应用和以前遗留的系统相集。采用Java创建CORBA应用CORBA对象服务的实现方式分为两种:对象的命名引用方式和字符串化对象引用方式。不论采用何种高级语言,创建CORBA应用程序的过程大体如下:编写IDL接口定义文件;将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根;基于服务器框架,编写服务对象实现程序;基于客户端存根,编写客户对象调用程序;分别编译客户对象和服务对象程序;运行服务对象和客户对象程序;CORBA实例分析下面通过一个实例,描述如何通过Java创建CORBA应用程序。1.接口定义(Hello.idl)Hello.idlmoduleHelloAppinterfaceHellostringsayHello(instringmessage);通过Sun提供的将IDL文件编译成Java源代码的工具idlj(jdk1.3.0_01以上版本),为接口定义文件生成客户端存根和服务器框架。具体操作如下:idlj-oldImplBase-fallHello.idl编译后将在HelloApp子目录中形成以下六个文件:n_HelloImplBase.java该抽象类是一个服务器skeleton,它可为服务器提供基本的CORBA功能。它实现Hello.java接口。服务器类HelloServant扩展_HelloImplBase。n_HelloStub.java该类是客户机stub,可为客户机提供CORBA功能。它实现Hello.java接口。nHello.java该接口含有IDL接口的Java版本。Hello.java接口扩展org.omg.CORBA.Object并提供标准的CORBA对象功能。nHelloHelper.java这是一个终态类,可以提供辅助功能,特别是提供将CORBA对象引用转换为适当类型所需的narrow()方法。nHelloHolder.java这是一个终态类,其中含有Hello类型的公有实例成员。它可为“out”和“inout”变量提供操作。CORBA有这些变量,但不容易映射为Java的语义。nHelloOperations.java这是一个接口类,其中含有方法sayHello()。要完成该应用程序,只需在文件HelloServer.java和HelloClient.java中提供服务器和客户机的实现即可。2.接口实现HelloImpl.java是HelloIDL接口的实现;每个Hello实例都由一个HelloImpl实例来实现。HelloImpl是_HelloImplBase的子类,_HelloImplBase是由idlj编译器从示例IDL中生成的。HelloImpl.java/*authorgaohan创建日期2006-03-18*/importHelloApp.*;publicclassHelloImplextends_HelloImplBase/*构造函数*/publicHelloImpl()super();/*实现接口声明方法sayHello*/publicStringsayHello(Stringmessage)System.out.println(我在CORBA的服务器端,客户端正在调用sayHello方法。);System.out.println(Hello+message);returnmessage;3.服务器服务器类含有服务器的main()方法,可完成以下任务:?创建一个ORB实例?创建一个HelloImpl实例(CORBAHello对象的实现)并通知ORB?获取一个命名上下文的CORBA对象引用,在该命名上下文中注册新CORBA对象?在命名上下文中将新对象注册在“Hello”名下?等待对新对象的调用HelloSever.java/*authorgaohan创建日期2006-03-18*/importorg.omg.CosNaming.*;importorg.omg.CORBA.*;publicclassHelloServerpublicstaticvoidmain(Stringargs)try/*创建和初始化ORB*/ORBorb=ORB.init(args,null);System.out.println(开始ORBServer.);/*创建一个实例并将其向ORB注册*/HelloImplhelloImpl=newHelloImpl();orb.connect(helloImpl);System.out.println(将实例注册到ORB);/*获取根命名上下文*/org.omg.CORBA.ObjectobjRef=orb.resolve_initial_references(NameService);NamingContextncRef=NamingContextHelper.narrow(objRef);/*绑定命名中的对象引用*/NameComponentnc=newNameComponent(Hello,);NameComponentpath=nc;ncRef.rebind(path,helloImpl);/*等待来自客户机的调用*/java.lang.Objectsync=newjava.lang.Object();synchronized(sync)sync.wait();System.out.println(等待CORBA客户端调用.);catch(Exceptione)System.err.println(错误:+e);e.printStackTrace(System.out);4.客户端下面的应用程序客户机将完成以下任务:?创建一个ORB?获取一个指向命名上下文的引用?在命名上下文中查找Hello并获得指向该CORBA对象的引用?调用对象的sayHello()操作并打印结果HelloClient.java/*authorgaohan创建日期2006-03-18*/importHelloApp.*;importorg.omg.CosNaming.*;importorg.omg.CORBA.*;publicclassHelloClientpublicstaticvoidmain(Stringargs)try/*创建和初始化ORB*/ORBorb=ORB.init(args,null);/*获取根命名上下文*/org.omg.CORBA.ObjectobjRef=orb.resolve_initial_references(NameService);NamingContextncRef=NamingContextHelper.narrow(objRef);/*解析命名中的对象引用*/NameComponentnc=newNameComponent(Hello,);NameComponentpath=nc;Helloh=HelloHelper.narrow(ncRef.resolve(path);/*调用Hello服务器对象并打印结果*/System.out.println(我在客户端,开始调用CORBA服务器端的sayHello方法);System.out.println(欢迎,+h.sayHello(javamxjblog);catch(Exceptione)System.out.println(错误:+e);e.printStackTrace(System.out);CORBAServer/Client的编译与运行?把上面4个文件复制到D:CorbaSample目录下,在此目录下建立Client和Server目录,假设它们分别为客户端和服务端。?编译Hello.idlD:CorbaSampleidlj-oldImplBase-fallHello.idl这会生成一个HelloApp的目录?编译所有java文件:D:CorbaSamplejavac*.javaHelloApp/*.java?分别在Client和Server目录下建立HelloApp子目录,将D:CorbaSampleHelloApp目录中的_HelloStub.classHello.classHelloHelper.classHelloHolder.classHelloOperations.class复制到D:CorbaSampleClientHelloApp目录下,再将D:CorbaSample目录中的HelloClient.class复制到D:CorbaSampleClient目录下。将D:CorbaSampleHelloApp目录中的_HelloImplBase.classHello.classHelloOperations.class复制到D:CorbaSampleServerHelloApp目录下,再将D:CorbaSample目录中的HelloServer.class和HelloImpl.class复制到D:CorbaSampleServer目录中(注意:当然,你可以不必建立Server和Client目录及以上复制文件的操作,可以直接在D:CorbaSample目录中进行操作,我这样做的目的主要是为了区分客户端和服务端)?确保名字服务器处于运行状态:D:CorbaSampleServertnameserv-ORBInitialPort1050?启动Hello服务器:D:CorbaSampleServerjavaHelloServer-ORBInitialPort1050?CORBA客户端调用CORBA服务:D:CorbaSampleClientjavaHelloClient-ORBInitialPort1050(本地调用,不需要用-ORBInitialHost参数来指定远程的IP地址)D:CorbaSampleServerjavaHelloClient-ORBInitialHostlocalhost-ORBInitialPort1050(远程调用CORBA服务,可以将localhost替换成远程的IP地址)图1.客户端没有调用CORBA服务之前图2.客户端调用CORBA服务之后-一点补充:不知道大家注意到没有,在JDK1.4编译idl文件时使用的idlj-oldImplBase-fallHello.idl这个命令带有“-oldImplBase”参数,表示这是一个老版本的实现。而JDK1.4版本下,可以直接使用idlj-fallHello.idl命令,这样idlj编译器对服务器端生成的是轻便对象适配器(POA)。(直接再命令行敲入idlj可以得到其使用说明)这里我就不作详细说明了,操作基本上与上一个例子相似。首先在D:CorbaSample2目录下编写下面4个文件,然后依次进行如下操作:D:CorbaSample2idlj-fallHello.idlD:CorbaSample2javac*.javaHelloApp/*.javaD:CorbaSample2tnameserv-ORBInitialPort1050D:CorbaSample2javaHelloServer-ORBInitialPort1050D:CorbaSample2javaHelloClient-ORBInitialPort1050(注意:这里为了方便.我没有再划分客户端和服务端。进行对比,你可以发现这次idlj编译器生成的文件与上例中生成的文件有和不同。)Hello.idlmoduleHelloAppinterfaceHellostringsayHello(instringmessage);HelloImpl.java/*authorgaohan创建日期2006-03-18*/importorg.omg.CORBA.*;importHelloApp.HelloPOA;publicclassHelloImplextendsHelloPOAprivateORBorb;publicvoidsetORB(ORBorb_val)orb=orb_val;/*实现接口声明方法sayHello*/publicStringsayHello(Stringmessage)System.out.println(我在CORBA的服务器端,客户端正在调用sayHello方法。);System.out.println(Hello+message);returnmessage;HelloServer.java/*authorgaohan创建日期2006-03-18*/importHelloApp.*;importorg.omg.CosNaming.*;importorg.omg.CORBA.*;importorg.omg.PortableServer.*;importorg.omg.PortableServer.POA;publicclassHelloServerpublicstaticvoidmain(Stringargs)try/*创建和初始化ORB*/ORBorb=ORB.init(args,null);/*获取对RootPOA的引用,启动POAManager*/POArootpoa=POAHelper.narrow(orb.resolve_initial_references(RootPOA);rootpoa.the_POAManager().activate();/*创建一个实例并将其向ORB注册*/HelloImplh=newHelloImpl();h.setORB(orb);System.out.println(将实例注册到ORB);/*获取对服务端的对象引用*/org.omg.CORBA.Objectref=rootpoa.servant_to_reference(h);Hellohref=HelloHelper.narrow(ref);/*从名称服务中获取根元素名称上下文*/org.omg.CORBA.ObjectobjRef=orb.resolve_initial_references(NameService);NamingContextExtncRef=NamingContextExtHelper.narrow(objRef);/*在Hello名称下注册新对象*/Stringname=Hello;NameComponentpath=ncRef.to_name(name);ncRef.rebind(path,href);/*等待客户端的调用。*/or

温馨提示

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

评论

0/150

提交评论