JAVA与CORBA通信接口开发

更新时间:2023-05-25 01:19:50 阅读: 评论:0

JAVA与CORBA通信接⼝开发corba(公⽤对象请求代理体系)是基于对象技术的分布计算体系结构。corba标准主要分为
三个部分:接⼝定义语⾔(idl),对象请求代理(orb),以及orb之间的互操作协议iiop,
核⼼是对象请求代理。corba与平台和语⾔⽆关。
java idl既是corba的⼀个实现,它是jdk1.3或更⾼版本的核⼼包之⼀,定义在
成在⼀起:
采⽤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⽬录下建⽴class⽂件夹,将etc中的plate⽂件拷贝
到class下,将⽂件中(*)orbinitref.namervice=file:/c:/ns_ref修改为
(*)jacorb.naming.ior_filename=c:/ns_ref,并将⽂件名改为jacorb.properties
4,在dos下输⼊ns即可。
但是在运⾏期间会出现 ba.transient: retries exceeded, couldn't reconnect to
127.0.0.1:900  vmcid: 0x0  minor code: 0  completed: no”
所以改⽤明命令
tnamerv -orbinitialport 30000
源代码中⽤指定参数初始化 orb 的代码形如:
properties props = properties();
props.tproperty("ba.orbclass", "b.orb");
);
);
第⼆步下载orbstudio
解压缩从orbstudio/plugins/下⾯取得 orbstudio_7.7.7.jar 的jar包 放到eclip/plugins
下⾯,果考⼊jar包前以前eclip是运⾏的请关闭,重新运⾏。
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% 这样就配置成功了eclip下⾯的corba开发
第三步,编写idl⽂件
hello.idl
module helloapp
{undefined
interface hello
{undefined
string sayhello(in string message);
};
};
右键orb-->compile,会产⽣编译的源代码
_hellostub.java:该类是客户机stub,可为客户机提供corba功能,它实现hello.java接⼝。
陈馨妍也可以在idl⽂件所在的⽬录中使⽤命令:
idlj -oldimplba -fall hello.idl
编译该hello.idl⽂件。
hello.java:该接⼝含有idl接⼝的java版本,hello.java接⼝扩展ba.object并提
供标准的corba对象功能。
hellohelper.java:这是⼀个终态类,可以提供辅助功能,特别是提供将corba转换为适当类
不近人情
型所需的narrow()
helloholder.java:这是⼀个终态类,其中含有helo类型的公有实例成员,它可
为“out”和“inout”变量提供操作,corba有这些变量,但不容易映射为java的语义。
hellooperations.java:这是⼀个接⼝类,其中含有 sayhello()。
helloimplba.java:该抽象类是⼀个skeleton,它可为提供基本的corba功能,它实现
hello.java接⼝,类hellorvant扩展helloimplba。
要完成该程序,只需在⽂件hellorver.java和helloclient.java中提供和客户机的实现即
可。
、启动eclip,新建java项⽬,⼀切默认即可,新建⽂件
new->others->corba wizard->idl files->next->设置idl⽂件
路径及⽂件名称(此处以默认值为例)->finish
打开simple.idl,将看到已经有了默认内容
(⼤致意思是定义了⼀个模块,此模块对应到java⾥⾯就是⼀个 package,此模块(包)中定义了⼀个名为 myrvice 的 interface,此interface定义了⼀个名为operation1的 ,此 还接收⼀个string类型的传⼊参数,⼤致就是这么个意 思,⾄于idm的协议规范,参见具体⽂档)
8、⽣成corba框架代码,右键simple.idl⽂件,orb menu->compile,
此时会在src⽬录⽣成⼀个myrver的包,此包⾥⾯将会⽣成
_myrvicestub.java
myrvice.java
myrvicehelper.java
myrviceholder.java
myrviceoperations.java
myrvicepoa.java
myrvicepoatie.java
这⼏个⽂件,⾄于具体各是什么意义,我也理太清楚,只知道
myrvice变是idl⽂件中定义的接⼝⽂件,后⾯ 会经常⽤于与ba.object打交
myrvicehelper应该是个服务类,后⾯会经常⽤到,应该是 将对象的
myrviceholder 看代码,觉得是个载体对象,具体如何⽤,⽬前还不太清楚
myrviceoperations字⾯上看就是定义接⼝的操作的类,实际 是个接⼝,myrvice就是随声附和拼音
继承⾃它(严格的说是接⼝继承,因为myrvice也是接⼝)
myrvicepoa corba需要的类,我们实现接⼝(myrvice)的类应该从它继承
myrvicepoatie就不太清楚其⽤处了
9、利⽤orb插件为⽣成实现接⼝的类,新建⽂件
new->other->corba wizard->rver->active object map->next->
idl fieldname:选择/{项⽬名称}/simple.idl
interface: 选择vice
package:填写包名称(可以任意名称)
rver classname:myrvicerverimpl(可以任意取名)
继续next,勾选 create rver class(勾了会⾃动⽣成rver端的默认代码,代码的内容形
貌,取决于6的idl compiler选项值及具体的⼦command和command options)
10、打开 myrvicerverimpl,实现myrviceoperations接⼝定义的
11、编写服务端代码,打开 rver_aom⽂件,默认代码是使⽤ior⽂件进⾏通信的,为了
体现corab的特性,此处使⽤命名服务的⽅式运⾏,
怎么泡海参
注释掉 try{...}⾥⾯的代码,编写如下代码,其它代码保持不变,并
snaming.*;
修改后的代码
// 启动命名服务需要的参数
props.tproperty("orbinitref.namervice", "corbaloc::192.168.0.14:30000/namervice");
// 初始化orb
// 获取根poa引⽤
poa poaroot = poahelper.solve_initial_references("rootpoa"));
// 激活poa管理器
poaroot.the_poamanager().activate();
/
/ 实例化⼀个myrvicerverimpl对象
myrvicerverimpl rviceimpl = new myrvicerverimpl();
// 从rvant获得⼀个
// 获得对象接⼝引⽤
// 命名上下⽂
namingcontextext nc = namingcontextexthelper.narrow(ncobj);
// 绑定⼀个服务引⽤,以便客户端可以调⽤
<_name("vice"), rvice);
system.out.println("myrvice is running ");
// 运⾏orb
orb.run();
有必要说⼀下⾃⼰对corba启动整体流程的理解,
⾸先是设置参数,
设置orb的服务端实现类
props.tproperty("ba.orbclass", "b.orb");
调协orb的单例类
props.tproperty("ba.orbsingletonclass", "b.orbsingleton");
设置orb命名服务的初始化参数,具体意思 corbaloc 协议名称 192.168.0.14 orb地址(也可以是主机名) 30000 orb运⾏的端⼝
props.tproperty("orbinitref.namervice", "corbaloc::192.168.0.14:30000/namervice");
设置了参数后,根据参数初始化⼀个ba.orb的实例
接着从orb实例中获取⼀个根
poa,通过调⽤poahelper服务 将poa根引⽤转换成poa对象,
紧接着调⽤poa管理器,将其激活
端环境设置完成,
进⽽创建实现接⼝的对象的实例,
调⽤要根poa将其转换成⼀个ba.object对象,
再调⽤服务 得到其接⼝定义对象
通过orb对象获得⼀个命名对象,
通过命名服务辅助类得到⼀个命名上下⽂
再通过命名上下⽂实与服务接⼝绑定(因为服务接⼝与实现接⼝的对象的已建⽴关系,所以此时命名上下⽂也与接⼝的实现对象建⽴了关系)
绑定完成之后,就可以进⾏orb实例对象了
⾄此,服务端的运⾏完毕,只等待客户端的调⽤了。
12、编写客户端代码,还是通过orb 控件⽣成客户端代码,新建⽂件
new->other->corba wizard->client->simple implementation,与9是基本⼀样,选择idl ⽂件,选择接⼝⽂件、填写包名称、客户端类名称
13、打开myrviceclientimpl,找到initorb ,注释默认添加的代码,18个超级冷笑话
其代码如下:
properties props = properties();
props.tproperty("ba.orbclass", "b.orb");
props.tproperty("ba.orbsingletonclass", "b.orbsingleton");
// 启动参数
props.tproperty("orbinitref.namervice", "corbaloc::192.168.0.14:30000/namervice");
orb = ba.orb.init(args, props);
// 获得命名服务上下⽂
// 获得命名服务对象
try {
nsobj = solve_initial_references("namervice");
} catch (invalidname e) {
// todo auto-generated catch block
e.printstacktrace();
}
// 通过命名服务对象得到命名服务上下⽂
namingcontextext nc = namingcontextexthelper.narrow(nsobj);
// 从命名服务上下⽂中获得特定的命名服务对象
try {
svrobj = nc.resolve_str("vice");
} catch (notfound e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (cannotproceed e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (snaming.namingcontextpackage.invalidname e) {
// todo auto-generated catch block
e.printstacktrace();
}
// 从将特定命名服务对象中获得服务接⼝
target =  rvice;
客户端代码就⽐较简单了,简单描述⼀下,
⾸先还是设置参数,初始化orb,
从orb实例对象中获取命名服务对象,
通过命名服务对象辅助类从命名服务对象中获取命名服务上下⽂对象,
从命名服务上下⽂对象中获取指定名称的服务的ba.object对象,
再通过接⼝服务对象辅助类从ba.object类型的接⼝服务对象中获取实现该接⼝服务的实例对象
获取了接⼝服务对象后,就可以使⽤该服务了,⾄于是谁实现了该接⼝,如何实现的,这⾥根本不关⼼,尽管使⽤就是了:)...
另外还需要修改main ,取消默认的注释,这样才能调⽤服务接⼝定义的 !
对于这个客户端⽂件,在原有已导⼊的基础上还得导⼊如下⼀些
bpackage.invalidname;
snaming.namingcontextpackage.cannotproceed;
found;
vicehelper;
14、说了代码层⾯的,就该启动服务了,
⾸先启动corba,
运⾏->cmd->ns d:/java/jacorb/ctest/ns_ref -p 30000
再运⾏rver,
动物睡觉右键 rver_aop->run as->java application
发现了什么,⼀⼤堆的红⾊的错误信息,
⼤致如下:
b.init(unknown source)
at rver_aom.main(rver_aom.java:36)
caud by: java.lang.classnotfoundexception: b.orb
海天相吻urlclassloader$1.run(unknown source)
at java.curity.accesscontroller.doprivileged(native method)
urlclassloader.findclass(unknown source)
at java.lang.classloader.loadclass(unknown source)
at sun.misc.launcher$appclassloader.loadclass(unknown source)
at java.lang.classloader.loadclass(unknown source)
at java.lang.classloader.loadclassinternal(unknown source)
at java.lang.class.forname0(native method)
at java.lang.class.forname(unknown source)
... 3 more
⼀看⼤致是没有找到b.orb这个类引起的问题,应该是没有引⽤相关的类引起
的,
prenting
于是,项⽬->properties->java build path->libraries->add library->ur library->next-
>ur libraries->new->填写⽤户类库名称->选中刚新建的名称->add jars->浏览选择
d:\java\jacorb\lib\jacorb.jar (注意:此处的d:\java\jacorb视个⼈环境⽽定)
再次运⾏,可恶,⼜⼀在段红⾊错误提⽰信息,在此也列出来吧,
b.init(unknown source)
at rver_aom.main(rver_aom.java:36)
caud by: lassdeffounderror: org/apache/log/format/formatter
at java.declaredconstructors0(native method)
at java.lang.class.privategetdeclaredconstructors(unknown source)
at java.structor0(unknown source)
at java.winstance0(unknown source)
at java.winstance(unknown source)
at org.vironment.initlogging(unknown source)
at org.vironment.init(unknown source)
at org.vironment.<clinit>(unknown source)
at b.buffermanager.<clinit>(unknown source)
at b.orb.<init>(unknown source)
winstance0(native method)
winstance(unknown source)
winstance(unknown source)
at winstance(unknown source)
at java.winstance0(unknown source)
at java.winstance(unknown source)
... 3 more
看 caud by: lassdeffounderror:
org/apache/log/format/formatter 这 句,估计以是没有找到相关的引⽤类,于是,添加
d:\java\jacorb\lib\logkit-1.2.jar 到⽤户类库,具体 见上,
再次运⾏,还错误,

本文发布于:2023-05-25 01:19:50,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/927467.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   服务   命名   代码   名称   实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图
  • 我要关灯
    我要开灯
  • 返回顶部