分享
 
 
 

亲身体验CORBA:使用java和C++混合编程

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

1. 前言

现在很多人在对CORBA进行学习,大家都已经了解到CORBA是一个完全中间性的语言,可以使用接口定义语言(IDL)定义开发时使用接口的 Client 和实现接口的 Server 所需要的信息。Client 和 Server 的具体实现代码并不在IDL定义中编写,而是使用某种目标语言的IDL 编译器生成所需的代码存根及helper类,Client 和 Server再使用真正的编程语言来进行具体实现。

为了保证在不同的 CORBA 产品基础之上构建的分布式对象可以相互通信,Client和Server通过ORB(对象请求代理)进行通信。一般的运行流程是Client把请求发送给ORB,ORB再把请求发送给Server,Server把返回结果发送ORB,ORB再把返回结果发送给Client。ORB可以说Client和Server之间的翻译者。即使Client和Server使用不同的编程语言编写,只要是符合相同的IDL定义,ORB也可以完成相互的通信。

所有的文档在强调服务器及客户机可以是Java也可以是C++或其他语言(如:Delphi)进行编写,但在网站或书本是没有详细说如何应对多语言客户机的例子。《JAVA2核心技术》上面有些说明,但也只是介绍性的文章,故自己下载了omniORB304,进行了一次使用SUN的 tnameserv命名服务程序,服务器用JAVA编写,客户机分别用JAVA和C++(VC6+omniORB)编写的试验,希望通过一次编程的具体操作实例来体验或明了CORBA思想。

总体的编写过程如下:

用IDL定义一个接口文件,描绘要实现的功能,也可以说是定义一个要实现功能的一个模版(SysProp.idl)

使用"IDL to Java"编译器(这里是IDLJ)将IDL文件转化为Java编程语言中编写的接口定义,生成所需的代码存根及helper类

使用Java语言编写客户机和服务器的实现程序。

使用"IDL to C++"编译器(这里是omniidl)将IDL文件转化为C++编程语言中编写的接口定义,生成所需的代码存根及helper类

使用C++语言编写客户机实现程序(当然也可编写服务器程序,但本次试验没有进行)

起动命名服务tnameserv

起动Java编写的服务程序

用Java和C++编写的客户机分别调用相应的服务

2. 运行环境的设定:

总体环境由jdk1.3+omniORB3.0(www.uk.research.att.com\omniORB\doc\3.0) +vc6 组成,下面说明具体的安装。

2.1. 安装JDK1.3

从SUN公司DOWN JDK1.3或者通过其他方式得到jdk1.3进行安装,再设定相应的环境变量,在本文测试用的电脑上是如下所示:

CLASSPATH=.;

JAVA_HOME=D:\jdk130

修改原来的PATH变量,添加"%JAVA_HOME%\bin;",如下

PTAH=%JAVA_HOME%\bin;原变量

注意:我在第一次使用jbuilder的jdk1.3时,服务器不能正常工作,我只是发觉这么一回事,具体原因与本文无关而没有进行了解,请谅。

2.2. 安装VC6

VC6按常规方式安装,注意的是:在本文测试用的电脑上安装在如下位置

C:\Program Files\Microsoft Visual Studio

2.3. 安装omniORB

从 http://www.uk.research.att.com/omniORB/doc/3.0 下载omniORB3.0 ( 本文测试所下载的文件是omniORB_304_x86_win32.zip )。

用WINZIP进行解压omniORB_304_x86_win32.zip到omniORB_304_x86_win32目录,目录内存在omni目录,复制omni目录内的文件到你把想存放的位置。

测试电脑安装在C:\omni

根据C:\omni\README.win32 文档进行设定,由于运行程序及命令行在控制台进行,所以本次测试并不根据文档要求去设定环境变量,而是编写了一个omni.bat,在使用控制台时,首先运行。

本测试电脑omni.bat内容如下

set TOP=c:\omni

set path=%TOP%\bin\x86_win32;%path%

set LIB=%TOP%\bin\x86_win32;%LIB%

set INCLUDE=%TOP%\include;%INCLUDE%

set VcOsDir=

set VSCommonDir=

如果你的电脑VC的环境变量已经设定在你的环境变量中,那么C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT 就可以不运行。否则运行omni.bat前要首先运行VCVARS32.BAT。

3. 实践过程

约定所有编写的文件保存在D:\mywork\t1中,omni.bat也在这个目录内

3.1. 编写SysProp.idl,功能是返回系统属性

interface SysProp

{ string getProperty(in string name);

};

3.2. 编写JAVA的服务器

3.2.1. 把IDL文件转化为JAVA编程语言代码存根类及helper类。

执行如下命令

idlj -fall SysProp.idl

在正常的情况下D:\mywork\t1 目录内将生成以下文件,否则请检查你的执行程序及文件

SysProp.java

SysPropHelper.java

SysPropHolder.java

SysPropOperations.java

_SysPropImplBase.java

_SysPropStub.java

3.2.2. 编写 SysPropServer.java

import org.omg.CosNaming.*;

import org.omg.CORBA.*;

//编写相对应的服务,一定要从 _类名ImplBase继承,并实现相应的方法

class SysPropS extends _SysPropImplBase //具体的服务实现

{ public String getProperty(String key)

{

System.out.println("调用"+key);

String S;

S=System.getProperty(key);

if (S==null) { S="null"; }

System.out.println(key+"="+S);

return S;

}

public class SysPropServer //起动服务的程序

{ public static void main(String args[])

{ try

{ System.out.println("创建和初始化 ORB ");

ORB orb = ORB.init(args, null);

System.out.println("创建服务对象并将其向 ORB 注册 ");

SysPropS impl = new SysPropS();

orb.connect(impl);

//打印IOR字符串

System.out.println(orb.object_to_string(impl));

org.omg.CORBA.Object namingContextObj =orb.resolve_initial_references("NameService");

NamingContext namingContext= NamingContextHelper.narrow(namingContextObj);

NameComponent[] path = {new NameComponent("SysProp", "")};

System.out.println("绑定服务...SysPropS");

namingContext.rebind(path, impl);

System.out.println("等待调用...SysPropS");

java.lang.Object sync = new java.lang.Object();

synchronized (sync)

{ sync.wait();

}

catch (Exception e)

{ System.err.println("Error: " + e);

e.printStackTrace(System.out);

}

}

}

3.3. 编写JAVA的客户机

3.3.1. 编写 SysPropClient.java 使用IOR字符串的方式

注意在代码内有一段注解掉的代码,用"//使用ORB的方法的开始"开始,用"//使用ORB的方法的结束"结束。这段代码是使用ORB方法的代码,如果在代码中"//使用IOR的方法开始"前一行添加"/*",在"//使用IOR的方法结束"后一行添加"*/",而把"//使用ORB的方法的开始"前面的"/*"去掉,把"//使用ORB的方法的结束"后面的"*/"去掉,就是使用ORB方法的代码,程序运行时就是" SysPropClient [环境变量] "的方式。以下是具体代码:

import org.omg.CosNaming.*;

import org.omg.CORBA.*;

public class SysPropClient

{

public static void main(String args[])

{

try{

String SetInfo,ReturnInfo,ref;

org.omg.CORBA.Object objRef;

SysProp syspropRef;

ORB orb = ORB.init(args, null);

//使用IOR的方法开始

if (args.length=1)

{

ref=args[0];

}

else

{

System.out.println("SysPropClient [环境变量]");

return;

}

objRef = orb.string_to_object(ref);

syspropRef = SysPropHelper.narrow(objRef);

//使用IOR的方法结束

/*

//使用ORB的方法的开始

objRef = orb.resolve_initial_references("NameService");

NamingContext ncRef = NamingContextHelper.narrow(objRef);

// 进行服务定位

NameComponent nc = new NameComponent("SysProp", "");

NameComponent path[] = {nc};

syspropRef = SysPropHelper.narrow(ncRef.resolve(path));

//使用ORB的方法的开始结束

*/

if (args.length1)

{

SetInfo=args[1];

}

else

{

SetInfo="java.home";

}

System.out.println("开始调用");

ReturnInfo = syspropRef.getProperty(SetInfo);

System.out.println(SetInfo+"="+ReturnInfo);

} catch (Exception e) {

System.out.println("ERROR : " + e) ;

}

}

}

3.3.2. 编译程序,在文件目录内执行如下命令

jAVAC *.JAVA

3.4. 进行测试

第1控制台,执行

tnameserv

测试时

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有