【CORBA示例】

如果想开发一个CORBA的Helloworld,基本上有以下几个步骤:

1.使用idl语言开发idl文件,这个文件中描述了接口的定义

module:对应了java中的package

interface:对应了java中的interface,HelloWorld即接口名称

sayHello:对应了java中interface声明的方法

string:对应了java中方法的返回值



 

2.使用java中的idlj命令,将idl语言翻译成java语言,并生成java代码

idlj -fall m.idl 

idlj:java自带的工具

-fall:生成server和client端代码,也可以单独生成server或client

下面包含了6个java源文件,分述如下: 

HelloPOA POA指的是Portable Object Adapter(轻便对象适配器)。这个抽象类是一个基于流的服务器端骨架,提供了服务器端基本的CORBA功能。

_HelloSutb 客户端的存根类,为客户端提供了CORBA功能。

Hello 这是java版的Hello接口,它提供了标准的CORBA对象功能。

HelloHelper 这是一个辅助类,负责向CORBA流中写入或读取对象。

HelloHolder 这是一个final类,它持有一个public的Hello实例变量。它用来操作CORBA输入输出流的参数。

HelloOperations 这个类才是我们所预想的那个接口,只包含我们定义的那个方法,不包含CORBA的任何东西。

3、开发server端的代码

实现是在server端的,需要继承自的HelloWorldPOA

copy六个存根文件到Server项目中

1)接口实现类

package server;  

  

import helloworld.HelloWorldPOA;  

/** 

 * 服务器端的实现代码 

 * 

 */  

public class HelloWorldImpl extends HelloWorldPOA {  

  

    @Override  

    public String sayHello() {  

          

        return "Hello World!12333";  //服务器端的实现代码

    }  

  

}  

2)服务类

package server;

import org.omg.CORBA.ORB;

import org.omg.CORBA.ORBPackage.InvalidName;

import org.omg.CosNaming.NameComponent;

import org.omg.CosNaming.NamingContextExt;

import org.omg.CosNaming.NamingContextExtHelper;

import org.omg.CosNaming.NamingContextPackage.CannotProceed;

import org.omg.CosNaming.NamingContextPackage.NotFound;

import org.omg.PortableServer.POA;

import org.omg.PortableServer.POAHelper;

import org.omg.PortableServer.POAManagerPackage.AdapterInactive;

import org.omg.PortableServer.POAPackage.ServantNotActive;

import org.omg.PortableServer.POAPackage.WrongPolicy;

import helloworld.HelloWorld;

import helloworld.HelloWorldHelper;

public class HelloServer {  

    public static void main(String[] args) throws ServantNotActive, WrongPolicy, InvalidName, AdapterInactive, org.omg.CosNaming.NamingContextPackage.InvalidName, NotFound, CannotProceed {  

        //指定ORB的端口号 -ORBInitialPort 1050  

        args = new String[2];  

        args[0] = "-ORBInitialPort";  

        args[1] = "1050";  

           

        //创建一个ORB实例  

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

           

        //拿到RootPOA的引用,并激活POAManager,相当于启动了server  

        org.omg.CORBA.Object obj=orb.resolve_initial_references("RootPOA");  

        POA rootpoa = POAHelper.narrow(obj);  

        rootpoa.the_POAManager().activate();  

           

        //创建一个HelloWorldImpl实例  

        HelloWorldImpl helloImpl = new HelloWorldImpl();  

          

        //从服务中得到对象的引用,并注册到服务中  

        org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);  

        HelloWorld href = HelloWorldHelper.narrow(ref);  

           

        //得到一个根名称的上下文  

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

        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);  

          

        //在命名上下文中绑定这个对象  

        String name = "Hello";  

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

        ncRef.rebind(path, href);  

          

        //启动线程服务,等待客户端调用  

        orb.run();  

          

        System.out.println("server startup...");  

    }  

}  

4、开发client端的代码

server端的实现与服务监听都已经做完,现在需要写一个client来调用server的方法

copy六个存根文件到client项目中

package client;

import helloworld.HelloWorld;  

import helloworld.HelloWorldHelper;  

  

import org.omg.CORBA.ORB;  

import org.omg.CORBA.ORBPackage.InvalidName;  

import org.omg.CosNaming.NamingContextExt;  

import org.omg.CosNaming.NamingContextExtHelper;  

import org.omg.CosNaming.NamingContextPackage.CannotProceed;  

import org.omg.CosNaming.NamingContextPackage.NotFound;  

  

  

public class HelloClient {  

    static HelloWorld helloWorldImpl;  

       

    static {  

        System.out.println("client开始连接server.......");  

           

        //初始化ip和端口号,-ORBInitialHost 127.0.0.1 -ORBInitialPort 1050  

        String args[] = new String[4];  

        args[0] = "-ORBInitialHost";  

        //server端的IP地址,在HelloServer中定义的  

        args[1] = "127.0.0.1";  

        args[2] = "-ORBInitialPort";  

        //server端的端口,在HelloServer中定义的  

        args[3] = "1050";  

           

        //创建一个ORB实例  

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

           

        // 获取根名称上下文  

        org.omg.CORBA.Object objRef = null;  

        try {  

        objRef = orb.resolve_initial_references("NameService");  

        } catch (InvalidName e) {  

            e.printStackTrace();  

        }  

        NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);  

           

        String name = "Hello";  

        try {  

              

            //通过ORB拿到了server实例化好的实现类  

            helloWorldImpl = HelloWorldHelper.narrow(neRef.resolve_str(name));  

        } catch (NotFound e) {  

            e.printStackTrace();  

        } catch (CannotProceed e) {  

            e.printStackTrace();  

        } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {  

            e.printStackTrace();  

        }  

           

        System.out.println("client connected server.......");  

    }  

       

    public static void main(String args[]) throws Exception {  

        sayHello();  

    }  

       

    //调用实现类的方法  

    public static void sayHello() {  

        String str = helloWorldImpl.sayHello();  

        System.out.println(str);  

    }  

}  

5.启动orbd服务

仅仅创建了server和client的代码还不足以跑起来一个HelloWorld,还需要启动一个orbd服务,orbd包含自启动服务、透明的命名服务、持久化命名服务和命名管理器的后台处理进程。

orbd -ORBInitialPort 1050 -ORBInitialHost 127.0.0.1  

6、启动server服务

7.启动client

猜你喜欢

转载自gaojingsong.iteye.com/blog/2380682