|
一.实验目的
- 掌握组件化开发的概念,了解CORBA模型及ORB机制;
2.掌握CORBA组件编程方法。
二、实验内容
1.配制环境JDK环境。
2.编写编译IDL接口。
3.编写编译服务端程序。
4.编写编译客户端程序。
5.运行测试与调试。
三、题目分析、组件实现及运行结果
Sample文件中六个文件:
(1)HelloWorld.java:此接口包含IDL接口的Java版本。它继承自org.omg.CORBA.Object,提供标准的CORBA对象功能。
(2)HelloWorld Helper.java : 此类提供辅助功能,Helper类负责读写数据类型到CORBA流,以及插入和提取数据类型。
(3)HelloWorldHolder.java : 此类是一个终态类,其中含有HelloWorld类型的公有数据成员。
(4)HelloWorldOperations.java:这是一个接口类,其中含有在HelloWorld.idl文件中编写的接口方法。
(5)HelloWorldPOA.java : 此抽象类是基于流的服务器Skeleton,为服务器提供基本的CORBA功能。它继承org.omg.PortableServer.Servant, 实现了InvokeHandler接口和HelloWorldOperations接口。以后编写的服务器类要继承HelloWorldPOA。
(6)_ HelloWorldStub.java : 此类是客户端stub,为客户端提供CORBA功能。它继承org.omg.CORBA.Object,提供标准CORBA对象功能。还扩展了 HelloWorldOperations接口和org.omg.CORBA.portable.IDLEntity接口。
_HelloWorldStub.java、HelloWorld.java、HelloWorldHelper.java、HelloWorldHolder.java、HelloWorldOperations.java是client需要的代码;HelloWorld.java、HelloWorldOperations.java、HelloWorldPOA.java是server需要的代码。
题目1.Java版CORBA程序1——HelloWorld
首先,为远程对象编写IDL接口定义文件HelloWorld.idl,内容为接口HelloWorld声明和接口中say Hello方法的定义,因为输出内容中含字符串,因此CORBA处理字符串使用wstring类型;编译IDL接口:X:\corba>idlj –fall HelloWorld.idl,生成sample包里面包含相关支持文件;服务端HelloWorldServant继承HelloWorldPOA,HelloServer中指定ORB端口号且接口实现注册到ORB中,并启动监听,等待client调用;当服务端的实现与监听实现后,需要用客户端调用服务端方法,实现类方法;最后分别启动Dos命令提示符界面,端口为1050。启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050启动服务端程序:X:\corba >java HelloWorldServer -ORBInitialPort 1050
输出:HelloWorld is running启动客户端程序:X:\corba >java HelloWorldClient -ORBInitialPort 1050。

源代码
HelloWorld.Idl
module sample{
interface HelloWorld{
wstring sayHello(); }; //处理多字节的字符串
};
服务端:HElloWorldServer.java
import sample.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;
class HelloWorldServant extends HelloWorldPOA{ //对象实现类
public String sayHello(){
return "\nHello World! 张敏敏 软件工程1班\n";}
}
public class HelloWorldServer{ //服务程序
public static void main(String args[]){
try{//初始化ORB
ORB orb = ORB.init(args, null);
//取根POA的引用
org.omg.CORBA.Object poaobj = orb.resolve_initial_references ("RootPOA");
org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow(poaobj);
org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();
HelloWorldServant objRef = new HelloWorldServant();//创建伺服对象
HelloWorld obj = objRef._this(orb);
//绑定命名服务
NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
ncRef.rebind(path, obj); //激活POA管理器
manager.activate();//等待处理客户程序的请求
System.out.println("HelloWorld is running!");
orb.run();
}catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out); }
}
}
客户端
import sample.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class HelloWorldClient {
public static void main(String args[]) {
try{
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
NameComponent nc = new NameComponent("Hello","");
NameComponent path[] = {nc};
HelloWorld helloWorld = HelloWorldHelper.narrow(ncRef.resolve(path));
String hello = helloWorld.sayHello();
System.out.println(hello);
} catch (Exception e) {
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
}
}
启动名字服务器

启动服务端

启动客户端

实现“Hello,World!+班级+中文姓名”字符串。

题目2.JAVA版CORBA程序2——Counter
要求:编写实现连加、连减和加减混合等数学++/- -运算,并进行测试。
在counter.idl文件中定义方法inc()和dec(),类CounterImpl继承CounterPOA,实现加法、减法及结果方法;分别编写并编译服务端Server.java、客户端Client.java。

counter.idl:
module CounterApp{
interface Counter{
readonly attribute long value;
void inc();
void dec(); };
};
CounterImpl.java
import CounterApp.*;
public class CounterImpl extends CounterPOA {
private int count;
public CounterImpl(){
count = 0; }
public void inc(){
count++; }
public void dec(){
count - -; }
public int value(){
return count; }
启动服务端

启动客户端,实现加减

四、经验总结
基本了解CORBA模型及ORB机制。Corba上服务用idl描述,提供公用消息传递接口,不同类型的对象可以进行传递消息;idl分为客户端和服务端。服务端编写对象实现,客户端访问服务端对象,两者通过ORB实现。客户端通过对象定位、确定请求定向到服务端。用法明确,便于扩充和修改,可用性高。 |