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介绍