使用J2SE1.4开发CORBA程序(三)

原创 2004年05月12日 17:11:00

编程实例:数组相加

本程序是一个数组相加程序:由客户端提供两个数组,然后服务器将它们相加并将结果返回给客户端。

数组相加:暂时服务

开发任何CORBA应用程序首先都要使用OMG的接口定义语言(IDL)定义接口。数组相加程序的IDL接口定义如下面代码所示。在这我们定义了一个名为ArithApp的模块(相当于Java中的包);一个名为Add的接口,包含了一个常量,一个新的数据类型array(定义成long类型的一个数组),还有addArrays操作,它将两个数组作为参数输入(用关键字in指定),另一个数组作为输出(用关键字out指定)。

代码示例1Add.idl

module ArithApp {<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

   interface Add {

      const unsigned short SIZE=10;

      typedef long array[SIZE];

      void addArrays(in array a, in array b,

        out array result);

   };

};

现在你可以编译这个IDL接口生成Java程序,生成程序骨干和框架。这可以通过idlj编译器实现。当你编译时,你可以指定是只生成客户端框架还是服务端框架或者两者同时生成。在这你需要同时生成客户端和服务端框架。使用下面的命令:

prompt> idlj -fall Add.idl

编译将生成许多文件,你可以观察一下生成了哪些文件。你可以发现一个名为ArithApp的新子目录被创建了。这是由于OMG IDL中的模块就对应于Java中的包。

注意J2SE1.4中的idlj编译器对服务器端生成的是轻便对象适配器(POA)。但你可以使用-oldImplBase参数编译使用J2SE1.3或更早版本编写的CORBA程序,从而生成与早期版本一致的文件。注意新版本程序就不再生成这些现在已不被提倡使用的服务器端映射了。

下一步就是要实现代码1中所定义的IDL接口。代码示例2就展示了这样的一个实现。AddImpl类是AddPOA的子类,AddPOA类是由idlj编译器从IDL接口生成的。注意addArrays函数的第三个参数。在这我们只是简单的使用了一个数组保持器,因为在前面我们已经使用了out参数指定了输出数组的类型。

代码示例2AddImpl.java

import ArithApp.*;

import org.omg.CORBA.*;

 

class AddImpl extends AddPOA {

  private ORB orb;

 

  public AddImpl(ORB orb) {

    this.orb = orb;

  }

 

  // implement the addArrays() method

  public void addArrays(int a[], int b[],

    ArithApp.AddPackage.arrayHolder result) {

 

    result.value = new int[ArithApp.Add.SIZE];

 

    for(int i=0; i<ArithApp.Add.SIZE; i++) {

      result.value[i] = a[i] + b[i];

    }

  }  

}

接着就要开发服务器端程序了。代码示例3中展示了一个示例程序。服务器要执行下列任务:

n         新建和初始化ORB

n         为接口实现生成实例并在ORB上注册。

n         获取对RootPOA的引用,启动POAManager

n         获取对服务端的对象引用。

n         从名称服务中获取根元素名称上下文,在Add名称下注册新对象。

n         等待客户端的调用。

代码示例3AddServer.java

import ArithApp.*;

import org.omg.CORBA.*;

import org.omg.CosNaming.*;

import org.omg.PortableServer.*;

import org.omg.PortableServer.POA;

import org.omg.CosNaming.NamingContextPackage.*;

 

public class AddServer {

 

  public static void main(String args[]) {

    try{

      // create and initialize the ORB

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

 

      // create an implementation and register it with the ORB

      AddImpl impl = new AddImpl(orb);

 

      // get reference to rootpoa & activate the POAManager

      POA rootpoa = POAHelper.narrow(

        orb.resolve_initial_references("RootPOA"));

      rootpoa.the_POAManager().activate();

 

      // get object reference from the servant

      org.omg.CORBA.Object ref =

        rootpoa.servant_to_reference(impl);

      Add href = AddHelper.narrow(ref);

        

      // get the root naming context

      // NameService invokes the name service

      org.omg.CORBA.Object objRef =

        orb.resolve_initial_references("NameService");

      // Use NamingContextExt which is part of the Interoperable

      // Naming Service (INS) specification.

      NamingContextExt ncRef =

        NamingContextExtHelper.narrow(objRef);

 

      // bind the Object Reference in Naming

      String name = "Add";

      NameComponent path[] = ncRef.to_name( name );

      ncRef.rebind(path, href);

 

      System.out.println("AddServer

        ready to add up your arrays ....");

 

      // wait for invocations from clients

      orb.run();

    } catch (Exception e) {

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

        e.printStackTrace(System.out);

    }

    System.out.println("AddServer Exiting ....");

  }

}

现在要实现客户端。客户端的实现如代码示例4所示。客户端要执行下面的操作:

n         生成并初始化ORB

n         获取对根元素名称上下文的引用。

n         在名称上下文中查找Add对象,获取对它的引用。

n         调用addArrays方法,输出结果。

代码示例4AddClient.java

import ArithApp.*;

import org.omg.CORBA.*;

import org.omg.CosNaming.*;

import org.omg.CosNaming.NamingContextPackage.*;

 

public class AddClient {

  public static void main(String args[]) {

    try {

      // create and initialize the ORB

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

 

      // get the root naming context

      org.omg.CORBA.Object objRef =

        orb.resolve_initial_references("NameService");

 

      // Use NamingContextExt instead of NamingContext. This is

      // part of the Interoperable Naming Service. 

      NamingContextExt ncRef =

        NamingContextExtHelper.narrow(objRef);

 

      // resolve the Object Reference in Naming

      String name = "Add";

      Add impl = AddHelper.narrow(ncRef.resolve_str(name));

 

      System.out.println("Handle obtained on server object: " + impl);

 

      // the arrays to be added

      int a[] = {3, 7, 6, 9, 2, 5, 0, 1, 4, 8};

      int b[] = {8, 2, 1, 7, 4, 9, 3, 5, 0, 6};

       

      // the result will be saved in this new array

      ArithApp.AddPackage.arrayHolder c =

        new ArithApp.AddPackage.arrayHolder();

 

      // invoke the method addArrays()

      impl.addArrays(a, b, c);

      // print the new array

      System.out.println("The sum of the two arrays is: ");

      for(int i=0;i<ArithApp.Add.SIZE;i++) {

        System.out.println(c.value[i]);

      }

    } catch (Exception e) {

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

        e.printStackTrace(System.out);

    }

  }

}

现在可以编译AddImplAddServerAddClient类,以及由idlj编译器生成的框架文件。可以使用如下的javac命令进行编译:

prompt> javac *.java ArithApp/*.java

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

运行该程序:

1.启动orbd名称服务。

prompt> orbd -ORBInitialPort 2500

2500是你想要orbd运行的端口号。要注意需要-ORBInitialPort作为命令行参数指定。

2.启动AddServer

prompt> java AddServer -ORBInitialPort 2500

在本例中我们将AddServerorbd运行在同一主机上。如果orbd服务运行在另一台主机上,那么就要使用-ORBInitialHost参数告知服务器到哪去寻找orbd服务。

3.启动AddClient

prompt> java AddClient -ORBInitialPort 2500

我们可以看到数组相加的运行结果。

使用J2SE1.4开发CORBA程序(二)

使用POA编程创建和使用POA的方法根据要开发程序的类型不同也会有些差异。一个典型POA程序的编写过程包含了以下几步:1.获得POA根元素首先要获取POA根元素,它由ORB管理,使用初始对象名“Roo...
  • freewind88
  • freewind88
  • 2004年05月09日 11:16
  • 908

使用J2SE1.4开发CORBA程序(五)

最后是实现客户端。如代码7所示。客户端完成以下任务:n         创建和初始化ORB。n         使用通用名称服务corbaname的URL解析AddServant。使用该URL查找在本...
  • freewind88
  • freewind88
  • 2004年05月12日 17:06
  • 926

使用J2SE1.4开发CORBA程序(四)

ORBD名称服务CORBA通用对象服务(或称COS名称服务)提供了对象引用的树型目录,就像文件系统提供的文件目录一样。在JDK的早期版本中由tnameserv提供类似服务。tnameserv是暂时名称...
  • freewind88
  • freewind88
  • 2004年05月09日 11:16
  • 1002

使用J2SE1.4开发CORBA程序(一)

使用J2SE1.4开发CORBA程序Java2的J2SE1.4版本为通用对象请求代理结构(CORBA)引入了许多新的特性和改进。新的特性和改进不仅体现在对标准CORBA规范的修改,而且也表现在对已有特...
  • freewind88
  • freewind88
  • 2004年05月12日 17:05
  • 828

Eclipse下搭建Corba开发环境+HelloWorld实现过程

前言 本人小白一枚,适逢学校要求用Corba实现一个简单的项目,经过数日蛋疼菊紧的琢磨后,结合网上查阅到的材料进行增删查改作一篇总结文当做CSDN博客处女作,贡献给需要简单配置使用CORBA的骚年们。...
  • Swortain
  • Swortain
  • 2015年07月05日 20:18
  • 1615

C++、CORBA版HelloWorld程序

环境:Windows XP, MICO2.3.12, Visual Studio 2003 开发步骤: A 编译MICO B 设置VC开发环境 C 编写编译IDL接口 D 编写编译服务端程序...
  • u012719556
  • u012719556
  • 2014年01月23日 13:53
  • 1449

CORBA中间件的开发过程

上一篇博客我们介绍了CORBA规范和CORBA中间件中涉及的几个基本概念,例如OMG是什么。OMA参考模型怎么理解,其中的对象请求代理ORB又发挥了什么作用等。本篇博客我们分析CORBA中间件的开发过...
  • u010928470
  • u010928470
  • 2015年03月08日 22:01
  • 771

Corba开发之基于Java实现Service与Client

1      概述 CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范...
  • vtopqx
  • vtopqx
  • 2015年11月15日 14:25
  • 1568

jacorb 的使用(三)启动通知服务

1. 查看 bin 目录下 ntfy.bat 文件,内容如下: @echo off rem Starts the JacORB Notification Service rem set CLASSPA...
  • njchenyi
  • njchenyi
  • 2011年01月10日 14:09
  • 1867

对象中间件--CORBA开发练习

通过实例掌握CORBA的开发过程:主要包括:接口定义;接口的对象实现;服务器端代码编写;客户端代码编写;CORBA Server/Client的编译与运行; 1)基于CORBA技术开发一个考试成绩查询...
  • u011402642
  • u011402642
  • 2015年06月11日 14:39
  • 1301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用J2SE1.4开发CORBA程序(三)
举报原因:
原因补充:

(最多只允许输入30个字)