一、题目分析
要求掌握:
- 掌握组件化开发的概念,了解CORBA模型及ORB机制;
- 掌握CORBA组件编程方法。
解决步骤:
- 配制环境JDK环境。
- 编写编译IDL接口。
- 编写编译服务端程序。
- 编写编译客户端程序。
- 运行测试与调试。
- 完成报告。
二、CORBA模型分析
2.1、介绍CORBA模型前先说一下ORB(对象请求代理)
对象请求代理是对象总线,它可以让对象透明的向本地或远程的其他对象发送请求或从那里接受响应。ORB 使对象可以在运行时相互发现和调用对方的服务。本次实验就是通过ORB实现HelloWorldServer.java和HelloWorldClient.java相互调用对方的服务。
ORB 是对象间建立客户 / 服务器关系的中间件。通过使用 ORB,一个客户对象可以透明的调用服务器对象的方法。客户 / 服务器的角色仅仅是用于协调两个对象之间的交互。ORB 的对象根据场合的不同既可以充当客户,也可以充当服务器。
2.2、再说一下CORBA ORB 的客户端和服务器端工作
客户端:
客户端 IDL 存根为对象服务器提供静态的接口。这些预编译的存根定义了客户如何调用服务器上的相应服务。从客户的角度来看,存根像是一个本地调用,它是一个远程服务器对象的本地代理。服务由 IDL 定义,而客户和服务器的存根都由 IDL 编译器生成。对于它所使用的服务器上的每一个接口,客户都必须有一个 IDL 存根。本程序首先创建一个编写IDL接口HelloWorld.idl
module sample{
interface HelloWorld{
string sayHello();
};
};
接口池 API 允许获得和修改所有有关已注册的组件接口以及它们支持的方法和它们所需的参数的描述。CORBA 称这些描述为方法标记。可以把接口池看作是一个动态的 ORB 元数据池。
ORB 接口由一些 API 组成,这些 API 用于定位可能与应用程序有关的本地服务。
服务器端:
服务器 IDL 存根为每一个服务区输出的服务提供静态接口。由 IDL 编译器创建。
在jkd安装包下面存在的idlj.exe就是用来编译idl接口的。
生成以下文件
编译结果生成sample包,生成下述文件
_HelloWorldStub.java
HelloWorld.java
HelloWorldHelper.java
HelloWorldHolder.java
HelloWorldOperations.java
HelloWorldPOA.java
ORB 接口由一些 API 组成,用于定位本地服务。
2.3、总结一下
按照我的理解,CORBA 是一种技术,可以让你在一台机器上,通过 CORBA 进行远程调用。例如我在机器 A 上写了一个函数,实现 a+b,然后通过 CORBA 发布我的接口;那么在机器 B 上,通过 CORBA 相关接口,可以调用机器 A 上的实现。
2.4、组建结构图
三、组件实现
3.1、Java版CORBA程序1——HelloWorld
1、编写IDL接口HelloWorld.idl:
module sample{
interface HelloWorld{
wstring sayHello();
};
};
说明:CORBA处理字符串有:String和wstring两种类型,string类型主要用于处理ASCII类型的字符串,wstring用于处理多字节的字符串,例如:中文。
里面包含中文必须使用我wstring
2、编译IDL接口:X:\corba>idlj –fall HelloWorld.idl
3、 编写并编译服务端程序:HelloWorldServer.java
4、 编写并编译客户端程序: HelloWorldClient.java
5、 运行
启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
启动服务端程序:X:\corba >java HelloWorldServer -ORBInitialPort 1050
注意:执行启动服务端程序之前要先执行javac HelloWorldServer.java生成HelloWorldServer.class文件,不然会报以下错误
生成class文件就不会报报错了,如下图所示
启动客户端程序:X:\corba >java HelloWorldClient -ORBInitialPort 1050
输出:Hello World!
同样启动客户端程序之前要先执行javac HelloWorldClient.java生成class文件才能执行上面的语句
3.2、JAVA版CORBA程序2——Counter(原理同题目一)
编写实现连加、连减和加减混合等数学++/- -运算,并进行测试。
实现详解:
1、 编写IDL接口counter.idl
module CounterApp{
interface Counter{
readonly attribute long value;
void inc();
void dec();
};
};
2、 编译IDL接口:X:\corba>idlj –fall counter.idl
3、 编写并编译对象实现代码:CounterImpl.java
4、 编写并编译服务端程序: Server.java
5、 编写并编译客户端程序: Client.java
5 运行
启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
启动服务端程序:X:\corba >java Server -ORBInitialPort 1050
输出:Server started. Stop: Ctrl-c
启动客户端程序:X:\corba >java Client -ORBInitialPort 1050
四、测试、调试及运行结果
启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
编译IDL接口:X:\corba>idlj –fall HelloWorld.idl
启动服务端程序:X:\corba >java HelloWorldServer -ORBInitialPort 1050
启动客户端程序:X:\corba >java HelloWorldClient -ORBInitialPort 1050
编写实现显示“Hello,World!+班级+中文姓名”字符串。
编译IDL接口:X:\corba>idlj –fall counter.idl
启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
启动服务端程序:X:\corba >java Server -ORBInitialPort 1050
启动客户端程序:X:\corba >java Client -ORBInitialPort 1050
编写实现连加、连减和加减混合等数学++/- -运算,并进行测试。
五、经验归纳
- 第一次接触CORBA模型及ORB机制,不知道从何入手,上机课干坐了两个小时,查阅了相关文档对CORBA和ORB有了初步的了解。用户可以定义模块、接口、属性、方法、输入输出参数,甚至异常等等。IDL 在不同的语言下都有相应的实现,可以把 IDL 描述的接口编译为目标语言,包括客户端代理和服务器端框架,以及相应的帮助类等等。
- Java 中提供的 idlj 命令编译。CORBA 的分布式对象调用能力依赖于 ORB,而 ORB 之间进行通信是通过 GIOP 协议完成的。GIOP 定义了 ORB 之间- 互操作的传输语法和标准消息格式,比如请求头、请求体所包含的字段和长度。
- 了解到在服务端和客户端交互的时候先启动名字服务器才能进行后续操作,在启动服务端才能进行客户端的操作。
- 在编译执行java命令之前要先生成对应的class文件,才能启动java程序,不然会显示无法加载主类的情况,在最后启动客户端程序的时候一直显示乱码的问题,然后修改了HelloWorldServer.java的保存方式为“UTF-8”还是不行,这是因为虽然保存的文件是以“UTF-8”的格式,但是在执行javac命令的时候windows还是以windows默认的GBK编码方式执行的,所以在java中要想实现命令行编译的时候以某个编码个是编译的话就应该在执行javac命令的时候使用-encoding “UTF-8”指定编码方式。