JAVA与CORBA通信接口开发

Posted 星仔学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA与CORBA通信接口开发相关的知识,希望对你有一定的参考价值。

corba(公用对象请求代理体系)是基于对象技术的分布计算应用软件体系结构。corba标准主要分为三个部分:接口定义语言(idl),对象请求代理(orb),以及orb之间的互操作协议iiop,核心是对象请求代理。corba与平台和语言无关。

java idl既是corba的一个实现,它是jdk1.3或更高版本的核心软件开发包之一,定义在org.omg.corba及其子包中,在java idl的支持下,开发开发人员可以使用如下两种开发方法 将java和corba集成在一起:

创建java对象并使之可在corba orb中展开;创建java类并作为http://www.makaidong.com/jinzhengquan/admin/editposts.aspx?catid=295786和其它orb一起展开的corba对象的客户,这种开发方法 提供了另外一种途径,通过它java可以被用于将你的新的应用开发和以前遗留的系统开发相集成。

采用java创建corba应用开发,corba对象服务的实现方式分为两种:对象的命名引用方式和字符串化对象引用方式,创建corba应用开发程序的开发过程 大体如下:编写idl接口定义文件;将接口定义文件编译为相应高级语言源代码,产生服务器开发框架与客户端存根;基于服务器开发框架,编写服务对象实现程序;基于客户端存根,编写客户对象调用程序;分别编译客户对象和服务对象程序;运行服务对象和客户对象程序。

第一步下载jacorb并配置jacorb

1,解压jacorb-2.3.0-bin,将jacorb拷贝到c:\\jacorb;

2,修改c:\\jacorb\\bin下的文件,去掉idl.tpl,idl.bat.tpl,jaco.tpl和jaco.bat.tpl文件的后缀名".tpl";

3,在jacorb目录下建立classes文件夹,将etc中的jacorb_properties.template文件拷贝到classes下,将文件中(*)orbinitref.nameservice=file:/c:/ns_ref修改为
(*)jacorb.naming.ior_filename=c:/ns_ref,并将文件名改为jacorb.properties

4,在dos下输入ns即可。

但是在运行期间会出现 org.omg.corba.transient: retries exceeded, couldn't reconnect to 127.0.0.1:900  vmcid: 0x0  minor code: 0  completed: no” 

所以改用明命令

 tnameserv -orbinitialport 30000

源代码中用指定参数初始化 orb 的代码形如:

                   properties props = system.getproperties();

                   props.setproperty("org.omg.corba.orbclass""org.jacorb.orb.orb");

                   props.setproperty("org.omg.corba.orbsingletonclass""org.jacorb.orb.orbsingleton");

                   // 启动命名服务需要的参数 

                   props.setproperty("orbinitref.nameservice""corbaloc::192.168.0.5:30000/nameservice"); 

              // 初始化orb 

              org.omg.corba.orb orb = org.omg.corba.orb.init(args, props);

第二步下载orbstudio

解压缩从orbstudio/plugins/下面取得 orbstudio_7.7.7.jar 的jar包 放到eclipse/plugins下面,果考入jar包前以前eclipse是运行的请关闭,重新运行。

windows/preferences/出现如下窗口选择orb studio/idl compiler/ 在右边选择jacorb 这里有5种编译器我们使用jacorb. 打开idl compiler 前面的加号选择,

jacorb 右边参数idl command: d:\\java\\jacorb\\bin\\idl.bat

 command options: -d %d% %f% 这样就配置成功了eclipse下面的corba开发

第三步,编写idl文件

hello.idl

module helloapp

  interface hello
 
     string sayhello(in string message);
  ;
;

右键orb-->compile,会产生编译的源代码

_hellostub.java:该类是客户机stub,可为客户机提供corba功能,它实现hello.java接口。

也可以在idl文件所在的目录中使用命令:

 idlj -oldimplbase -fall hello.idl

编译该hello.idl文件。

hello.java:该接口含有idl接口的java版本,hello.java接口扩展org.omg.corba.object并提供标准的corba对象功能。

hellohelper.java:这是一个终态类,可以提供辅助功能,特别是提供将corba对象引用转换为适当类型所需的narrow()开发方法

helloholder.java:这是一个终态类,其中含有helo类型的公有实例成员,它可为“out”和“inout”变量提供操作,corba有这些变量,但不容易映射为java的语义。

hellooperations.java:这是一个接口类,其中含有开发方法 sayhello()。

helloimplbase.java:该抽象类是一个服务器开发skeleton,它可为服务器开发提供基本的corba功能,它实现hello.java接口,服务器开发类helloservant扩展helloimplbase。

要完成该应用开发程序,只需在文件helloserver.java和helloclient.java中提供服务器开发和客户机的实现即可。

、启动eclipse,新建java项目,一切默认即可,新建文件 
new->others->corba wizard->idl files->next->设置idl文件

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

路径及文件名称(此处以默认值为例)->finish 
打开simple.idl,将看到已经有了默认内容 
(大致意思是定义了一个模块,此模块对应到java里面就是一个 package,此模块(包)中定义了一个名为 myservice 的 interface,此interface定义了一个名为operation1的 开发方法  ,此 开发方法  还接收一个string类型的传入参数,大致就是这么个意 思,至于idm的协议规范,参见具体文档)

8、生成corba框架代码,右键simple.idl文件,orb menu->compile, 
此时会在src目录生成一个myserver的包,此包里面将会生成 
_myservicestub.java 
myservice.java 
myservicehelper.java 
myserviceholder.java 
myserviceoperations.java 
myservicepoa.java 
myservicepoatie.java 
这几个文件,至于具体各是什么意义,我也理太清楚,只知道 
myservice变是idl文件中定义的接口文件,后面 会经常用于与org.omg.corba.object打交道 
myservicehelper应该是个服务类,后面会经常用到,应该是 将对象的org.omg.corba.object、interface(myservice)之间进行包装转换用 
myserviceholder 看代码,觉得是个载体对象,具体如何用,目前还不太清楚 
myserviceoperations字面上看就是定义接口的操作的类,实际 是个接口,myservice就是继承自它(严格的说是接口继承,因为myservice也是接口) 
myservicepoa corba需要的类,我们实现接口(myservice)的类应该从它继承 
myservicepoatie就不太清楚其用处了

9、利用orb插件为生成实现接口的类,新建文件 
new->other->corba wizard->server->active object map->next-> 
idl fieldname:选择/项目名称/simple.idl 
interface: 选择myserver.myservice 
package:填写包名称(可以任意名称) 
server classname:myserviceserverimpl(可以任意取名) 
继续next,勾选 create server class(勾了会自动生成server端的默认代码,代码的内容形貌,取决于6的idl compiler选项值及具体的子command和command options)

10、打开 myserviceserverimpl,实现myserviceoperations接口定义的开发方法

11、编写服务端代码,打开 server_aom文件,默认代码是使用ior文件进行通信的,为了体现corab的跨平台开发特性,此处使用命名服务的方式运行, 
注释掉 try...里面的代码,编写如下代码,其它代码保持不变,并

import org.omg.cosnaming.*; 

修改后的代码

            // 启动命名服务需要的参数 
            props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); 

            // 初始化orb 
            org.omg.corba.orb orb = org.omg.corba.orb.init(args, props); 
            // 获取根poa引用 
            poa poaroot = poahelper.narrow(orb.resolve_initial_references("rootpoa")); 
            // 激活poa管理器 
            poaroot.the_poamanager().activate(); 
            // 实例化一个myserviceserverimpl对象 
            myserviceserverimpl serviceimpl = new myserviceserverimpl(); 
            // 从servant获得一个对象引用 
            org.omg.corba.object refobj = poaroot.servant_to_reference(serviceimpl); 
            // 获得对象接口引用 
            myserver.myservice service = myserver.myservicehelper.narrow(refobj); 
            // 命名上下文 
            org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice"); 
            namingcontextext nc = namingcontextexthelper.narrow(ncobj); 
            // 绑定一个服务引用,以便客户端可以调用 
            nc.rebind(nc.to_name("simple.myservice"), service); 

            system.out.println("myservice is running and waiting......"); 
            // 运行orb 
            orb.run(); 

有必要说一下自己对corba启动整体流程的理解, 
首先是设置参数,

设置orb的服务端实现类

props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb"); 

调协orb的单例类

props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton"); 

设置orb命名服务的初始化参数,具体意思 corbaloc 协议名称 192.168.0.14 orb服务器开发地址(也可以是主机名) 30000 orb运行的端口

props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); 

设置了参数后,根据参数初始化一个org.omg.corba.orb的实例 
接着从orb实例中获取一个根

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

poa 对象引用 ,通过调用poahelper服务 开发方法  将poa根引用转换成poa对象, 
紧接着调用poa管理器,将其激活 
服务器开发 端环境设置完成,

进而创建实现接口的对象的实例, 
调用要根poa将其转换成一个org.omg.corba.object对象, 
再调用服务开发方法 得到其接口定义对象

通过orb对象获得一个命名服务器开发对象, 
通过命名服务辅助类得到一个命名上下文 
再通过命名上下文实与服务接口绑定(因为服务接口与实现接口的对象的已建立关系,所以此时命名上下文也与接口的实现对象建立了关系) 
绑定完成之后,就可以进行orb实例对象了

至此,服务端的运行完毕,只等待客户端的调用了。

12、编写客户端代码,还是通过orb 控件生成客户端代码,新建文件 
new->other->corba wizard->client->simple implementation,与9是基本一样,选择idl文件,选择接口文件、填写包名称、客户端类名称

13、打开myserviceclientimpl,找到initorb开发方法 ,注释默认添加的代码, 
其代码如下:

        properties props = system.getproperties(); 
       props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb"); 
       props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton"); 

        // 启动参数 
        props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); 

       orb = org.omg.corba.orb.init(args, props); 
       // 获得命名服务上下文 
        // 获得命名服务对象        
        org.omg.corba.object nsobj = null; 
        try  
            nsobj = orb.resolve_initial_references("nameservice"); 
         catch (invalidname e)  
            CORBA介绍

CORBA IDL 哈希图

不同语言之间的 Corba 通信

Eclipse Kepler CORBA 插件不会编译 IDL 文件

有啥比 CORBA 更适合跨语言程序通信的吗?

Corba python 与 web 服务 java 的集成