浏览 6434 次
锁定老帖子 主题:【原創】构建简单的CORBA应用
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-23
IDL技术概述 IDL 是Interface Definition Language(接口定义语言)的缩写,是OMG定义的标准语言,用于定义所有 CORBA 对象的接口。IDL接口将声明一批操作、异常和属性。每个操作都有一个用法说明。用法说明定义了操作的名称、参数、结果和异常。OMG IDL不包括操作的实现;相反,正如其名称所示,它只是一种用来定义接口的语言。IDL的完整句法和语义在 OMG 规范的第 3 章中进行讨论,可在 OMG 站点找到,地址是http://www.omg.org/technology/documents/idl2x_spec_catalog.htm。使用Java(TM)编写的API提供基于标准的和CORBA的交互性和连接性。 JAVA IDL的语法和使用 下面我们学习怎么写一个最简单的IDL文件,文件名称是hello.idl。代码如下: module cn{ interface Hello{ string say(); }; }; 结尾处的;不可省略。module相当与定义java的包,这里包名是cn,包名中不能包含.。interface用来定义接口,接口的名字是Hello。接口包含了一个方法,返回一个字符串。IDL中的字符串类型是string。对于基本数据类型而言,CORBA会选取语言定义更短的,这是IDL为了实现跨语言应用而不得不采取的折中。四、五两行大括号后面的;不可省略。 接下来的工作,就是把这个idl文件编译成对应的java文件,这是通过JDK自带的idlj工具完成的,这个工具和javac在一个目录下。它的命令格式如下: idlj hello.idl 我们可以使用-td参数指定生成java文件的路径,我的java文件所在的路径在在当前工程下的src中。我们可以指定生成文件的范围,比如只生成服务器端的文件,我们用-fserver命令行参数,如果只生成客户端的文件,使用-fserver参数,全部生成使用-fall参数。默认全部生成。在src 目录下,我们会发现新生成了一个目录cn,下面包含了6个java源文件,分述如下:
关于这些类的更详细的信息,读者可以参阅SUN公司发布的JavaDocs文档,里面有更详细的说明,还有更多的例子。 现在我们提供一个服务器端的实现,注意这个实现类继承的是HelloPOA: package cn.zxm.corba.hello.server; import cn.HelloPOA; public class HelloImpl extends HelloPOA { public String say() { System.out.println("客户调用时间——" + new java.util.Date()); return "Hello World!"; } } 接下来,把它绑定到命名服务,以便客户端可以调用: package cn.zxm.corba.hello.server; import java.util.Properties; import org.omg.CORBA.ORB; import org.omg.CosNaming.NameComponent; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import cn.Hello; import cn.HelloHelper; public class HelloServer { public void run(String[] args) throws Exception { //生成一个对象请求代理(ORB),并初始化 Properties props = new Properties(); //初始化端口,默认的端口是900 props.put("org.omg.CORBA.ORBInitialPort", "1050"); //绑定到服务器 props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.100"); //初始化ORB ORB orb = ORB.init(args, props); // get reference to rootpoa & activate the POAManager //获取一个根POA引用,并激活POA管理器 POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); //实例化一个HelloImpl对象 HelloImpl hello = new HelloImpl(); // 从servant获得一个对象引用 org.omg.CORBA.Object ref = poa.servant_to_reference(hello); Hello href = HelloHelper.narrow(ref); // 获得命名上下文 org.omg.CORBA.Object objref = orb.resolve_initial_references("NameService"); // 使用NamingContextExt 它是INS(Interoperable Naming Service,协同命名规范)的一部分 NamingContextExt ncRef = NamingContextExtHelper.narrow(objref); //绑定一个对象引用,以便客户端可以调用 String name = "Hello"; NameComponent[] nc = ncRef.to_name(name); ncRef.rebind(nc, href); System.out.println("HelloServer ready and waiting......"); //运行ORB orb.run(); } public static void main(String[] args) { HelloServer server = new HelloServer(); try { server.run(args); }catch(Exception e) { e.printStackTrace(); } } } 现在我们可以写客户端调用代码,代码如下: package cn.zxm.corba.hello.client; import java.util.Properties; import org.omg.CORBA.ORB; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import cn.Hello; import cn.HelloHelper; public class HelloClient { public void run(String[] args) throws Exception { Properties props = new Properties(); // 生成一个ORB,并初始化,这个和Server端一样 props .put("org.omg.CORBA.ORBInitialPort", "1050"); props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.100"); ORB orb = ORB.init(args, props); // 获得根命名上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // 用NamingContextExt代替NamingContext. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // 通过名称获取服务器端的对象引用 String name = "Hello"; Hello hello = HelloHelper.narrow(ncRef.resolve_str(name)); //调用远程对象 System.out.println(hello.say()); } public static void main(String[] args) { HelloClient client = new HelloClient(); try { client.run(args); } catch (Exception e) { e.printStackTrace(); } } } 一个完整的基于java的CORBA应用完成了,现在我们编译这些类了。编译完成后,我们需要启动orbd,这是一个类似于rmiregistry的工具,提供最简单的命名服务。启动的命令如下: start orbd -port 1050 -ORBInitialPort 1049 -ORBInitialHost localhost 这个命令定义了CORBA用到的服务器是本机,初始化端口是1049,使用的绑定端口是1050。然后我们运行HelloServer,命令是 start java cn.zxm.corba.hello.server.HelloServer 服务器会把_HelloStub绑定到orbd,我们使用的绑定名称是Hello。然后运行客户端,命令是 java cn.zxm.corba.hello.client.HelloClient 运行效果如图1: 图1 CORBA客户端运行效果 通过上面的例子,我们对CORBA有了一个初步的印象。CORBA本身是极为复杂的,读者可以看到,上面的绑定和调用都是很繁琐的,而且让人难于理解。总体而言,它比RMI要复杂的多,因此,我们可以借助于RMI的简易性来实现CORBA。对分布式应用感兴趣的朋友,可以到OMG或者SUN的网站上,察看关于它的更详细的信息。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |