CORBA Programming with TAO - 7.IIOP(体验IIOP--一个Java作客户端的例子)

来源:互联网 发布:犀牛软件模型 编辑:程序博客网 时间:2024/04/29 22:31

CORBA Programming with TAO - 7.IIOP(体验IIOP--一个Java作客户端的例子)

摘要:

CORBA2.0引入的IIOPInternet Inter-ORB Protocol)是GIOPGeneral Inter-ORB Protocol)针对TCP/IP协议的一个实现,IIOP使得不同ORB间可以相互访问,同时也使得基于不同ORB的复杂分布式应用成为可能。

一、简介

TAO是一个C++ ORB,因此,我们在没有其它附加“转接”模块的情况下,仅能使用C++来直接使用该ORB进行程序设计,但是,由于TAO同时也支持IIOPInternet Inter-ORB Protocol),因此,我们的客户程序并不一定要用C++来编写;反之,我们基于TAO的客户程序也可以与基于其它ORB实现的Server程序进行通信。

IIOP是不同ORB实现间进行交互的桥梁,由于这种支持是内建的,因此,对于应用程序来讲,并不需要为此额外做些什么。

Java1.3开始,提供了一个内建的ORB实现--Java IDL,该ORB被定义在org.omg.CORBA及其子包中。

本文中,我们将通过一个Java作客户端的例子向大家讲述如何在TAOJava IDL间进行通信。

二、实例

这里,我们尝试编写一个Java Client与上一篇中的echo服务程序(eg2_svr)进行通信。具体步骤如下:

1、在原echo工程目录下新建一个目录:java

2、到idl子工程目录下执行如下命令编译echo.idl,生成存根(Stub,桩)代码:

idlj -td ../java echo.idl

注:其中的-td用于将输出目录改为../java

通过编译,我们将得到如下几个.java文件:

Echo.java

接口类,从EchoOperations接口及org.omg.CORBA.Object等接口派生,从而保证其实现者除具有idl中定义的接口特性外,还具有org.omg.CORBA.Object所规定的特性。

EchoHelper.java

辅助支持类,为对Echo对象提供读写、类型检查等辅助支持。

EchoHolder.java

另一辅助支持类。

EchoOperations.java

idl直接映射的接口声明。

_EchoStub.java

这是一个stub类,为Client程序提供Echo接口的Stub实现。

 

对于我们的客户程序而言,我们一般仅需与Echo接口及EchoHelper类直接打交道。

下面是直接通过IOR访问TAO Server程序的代码:

 

// EchoClient_IOR.java

import org.omg.CORBA.*;

import org.omg.CosNaming.*;

 

public class EchoClient_IOR {

      public static void main(String args []) {

            if (args.length != 1) {

                  System.out.println("Usage: EchoClient_IOR svc_IOR_string");

                 

                  return;

            }

 

            try {

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

                  org.omg.CORBA.Object objRef = orb.string_to_object(args[0]);

                  Echo h = EchoHelper.narrow(objRef);

                 

                  System.out.println("This is a Java Client.");

                  System.out.println("Calling echoString...");

                  System.out.println("The server returns: " + h.echoString("Hello World!"));

            } catch (Exception e) {

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

                  e.printStackTrace(System.out);

            }

      }

}

 

启动eg1_svr后只需将程序输出的IOR拷贝传递给EchoClient_IOR即可。

同样,我们还可以通过访问TAO Naming Service来访问对应的服务程序。下面是Naming Service版本的EchoClient

 

import org.omg.CORBA.*;

import org.omg.CosNaming.*;

 

public class EchoClient_NS {

      public static void main(String args []) {

            try {

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

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

                  NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

 

                  String name = "test.my_context/Echo.Object";

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

 

                  for (int i = 0; i < path.length; i++) {

                        System.out.println(i + ": " + path[i].id + "." + path[i].kind);

                  }

 

                  Echo h = EchoHelper.narrow(ncRef.resolve(path));

 

                  System.out.println("This is a Java Client.");

                  System.out.println("Calling echoString...");

                  System.out.println("The server returns: " + h.echoString("Hello World!"));

            } catch (Exception e) {

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

                  e.printStackTrace(System.out);

            }

      }

}

 

由于我们启用的是Naming_Service,即TAONaming Service,因此,需要在启动Java客户程序时作一些额外的工作--指定Naming Service的相关信息,以下几种都是正确指定Naming Service的方法:

java EchoClient_NS -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:2809/NameService

java EchoClient_NS -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:2809

java EchoClient_NS -ORBInitRef NameService=corbaloc::localhost:2809

如果你的Echo ClientServer程序不在一台机器上,只需将localhost换成相应的主机IP即可。

 

当然,你也可以直接指定Naming_ServiceIOR,如:

java EchoClient_NS -ORBInitRef NameService=IOR:01000000xxxx

 

同样,你也可以尝试用TAO客户程序连接Java IDL服务程序,道理是一样的。

总的来看,由于各ORB实现均支持IIOP,同时,各种不同实现在使用上基本上是一致的,给我们实现分布式应用带来了极大的方便。

另附:

本系列源码包java目录下还有一个名为EchoServer.java的文件,这是一个Java IDL的服务程序实现(要编译EchoServer.java需先在java目录下运行命令:idlj -fall ../echo.idl生成POA代码),你可以分别尝试用IORName Service方式连接EchoServer。启动EchoServer前需要启动Java IDL Name Service: tnameservorbd,相应的启动EchoServer的命令是:

java EchoServer

启动EchoClient时也无需再额外指定初始化参数,只需执行:

java EchoClient

即可。

 

附:本文示例源代码

参考:

1.      Sun Microsystems. Java IDL Documentation. http://java.sun.com/j2se/1.4.2/docs/guide/idl/