JAVA的Corba客户端 - 服务端 通信实现

IDE:Eclipse 3.4.1

先在Eclipse建立两个Java Project

JAVA的Corba客户端 - 服务端 通信实现

1.然后定义 IDL .

JAVA的Corba客户端 - 服务端 通信实现

 

JAVA的Corba客户端 - 服务端 通信实现

内容如下:

 

module helloapp {

    interface Hello {

        string sayHello();

        oneway void shutdown();

    };

};

 

 

 

**这里注意, } 后面的 ";"一定要写上,不然会编译错误

 

2. 右键这个HelloApp.idl文件

JAVA的Corba客户端 - 服务端 通信实现

点击,Change to parent folder in Shell

JAVA的Corba客户端 - 服务端 通信实现

点击OK , Eclipse会打开Shell视图,是命令行视图,其实和CMD是一个作用.

JAVA的Corba客户端 - 服务端 通信实现

这里我们执行命令 : idlj -fall HellApp.idl

 

3. 然后我们到项目目录(H:\DEVELOPING\UMM\workspace\testCorbaServer\src\server)下就能看到多生成了一个文件夹 -- helloapp

打开里面试一些java接口类

JAVA的Corba客户端 - 服务端 通信实现

4.在服务端建立一个package 名字跟 idl内容里的module相同,这里我们是 ' helloapp '

  然后把类复制到这个包下面

JAVA的Corba客户端 - 服务端 通信实现

 

 

---------------------------------------

---------------------------------------

第二部分 实现IDL生成的类的接口

1.实现服务端 如图

JAVA的Corba客户端 - 服务端 通信实现

 内容如下:

package server;





import org.omg.CORBA.ORB;



import helloapp.HelloPOA;



public class HelloImpl extends HelloPOA {



    private ORB orb;



    public void setOrb(ORB orb) {

        this.orb = orb;

    }



    @Override

    public String sayHello() {

        return "\nHello World!!\n";

    }



    @Override

    public void shutdown() {

        orb.shutdown(false);

    }



}


 

以上,服务端的"服务"就写好了, 下面还要在服务端写一个入口类,把你的服务"注册"上.

JAVA的Corba客户端 - 服务端 通信实现

 

 内容如下:

 

package server;



import helloapp.Hello;

import helloapp.HelloHelper;



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;



public class Main {

    public static void main(String[] args) {

        try {

            // 创建一个ORB实例

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



            // 得到一个RootPOA的引用,并激活POAManager

            POA rootpoa = POAHelper.narrow(orb

                    .resolve_initial_references("RootPOA"));

            rootpoa.the_POAManager().activate();

            

            // create servant and register it with ORB

            // 创建一个HelloImpl实例(servant),并注册到ORB上

            HelloImpl helloImpl = new HelloImpl();

            helloImpl.setOrb(orb);

            

            // 在服务中得到对象的引用

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

            Hello href = HelloHelper.narrow(ref);

            

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

            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); 

             

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

            String name = "Hello";

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

            ncRef.rebind(path, href);

            

            System.out.println("HelloServer ready and waiting ..."); 



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

            orb.run(); 

        } catch (InvalidName e) {

            e.printStackTrace();

        } catch (AdapterInactive e) {

            e.printStackTrace();

        } catch (ServantNotActive e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (WrongPolicy e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

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

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (NotFound e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (CannotProceed e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        

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

    }

}

 

 

 

注意 :这里虽然是入口,可是不能直接右键run as - > Java Application

 

 

---------------------------------------

 

---------------------------------------

 

 实现客户端

1.要把服务端生成的工具类复制到客户端(最好包结构一致) 如图

JAVA的Corba客户端 - 服务端 通信实现

2.编写客户端调用.

JAVA的Corba客户端 - 服务端 通信实现

内容如下:

package client;



import helloapp.Hello;

import helloapp.HelloHelper;



import org.omg.CORBA.ORB;

import org.omg.CosNaming.NamingContextExt;

import org.omg.CosNaming.NamingContextExtHelper;



public class HelloClient {

    static Hello helloImpl;

    

    public static void main(String[] args) {

        try {

            // 创建一个ORB实例

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

            

            // 获取根名称上下文

            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); 

            

            // 从上下文中获取接口实现对象

            String name = "Hello";

            helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

            System.out.println(helloImpl.sayHello()); 

            System.out.println("asdfasdfdasf"); 

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

 

这样 客户端就完成调用了.  下面就是如何 运行起来了.

 

1. 运行CORBA服务 (直接CMD运行即可)

orbd -ORBInitialPort 1053 -ORBInitialHost 192.168.1.42

注: 192.168.1.42是我自己的本地IP地址  1053是端口

CORBA服务独立于客户端和服务端,相当于一条桥梁.

 

这个窗口不要关掉,光标会一直闪.

 

2.启动服务端

启动服务端需要main函数传递参数,所以我们要先配一些main函数的参数. 如图:

JAVA的Corba客户端 - 服务端 通信实现

 

 

点开:

JAVA的Corba客户端 - 服务端 通信实现

 

Main就是我们服务端的入口函数.  之前有说过.

 

然后在arguments的program arguments: 写入

 

-ORBInitialPort 1053    

 

 

 

端口1053是与之前的CORBA服务的端口对应的

 

 

 

服务端就配好了.   运行服务端.

JAVA的Corba客户端 - 服务端 通信实现

 

不要关闭服务端. 

 

3.启动客户端

JAVA的Corba客户端 - 服务端 通信实现

 

这里我不用多说了,然后启动运行,就可以看到运行结果了.

JAVA的Corba客户端 - 服务端 通信实现

 

说明:  依照原文,可能环境不同会出些奇怪的问题,希望读者先仔细检查是否和原文有出入,或者检查异常,还是不行的话,欢迎留言一起讨论.

 CORBA的客户端-服务端建立确实比较麻烦,不过如果之前已经搭建一套框架的话,开发以来也是事半功倍的.  

你可能感兴趣的:(corba)