组件化开发方法

论坛 期权论坛 脚本     
匿名技术用户   2021-1-6 16:55   27   0

一.实验目的

  1. 掌握组件化开发的概念,了解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实现。客户端通过对象定位、确定请求定向到服务端。用法明确,便于扩充和修改,可用性高。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP