corba实例

1.编写idl程序,主要是希望完成什么功能。

 

module HelloApp{     
        interface Hello{     
                string sayHello();
		string sayBye();
                oneway void shutdown();     
        };     
};  

 进入cmd进行编译:idlj -fall HelloApp.idl,会生成HelloApp文件夹。

 

2.在Eclipse建立服务器端server_project。

  需要下载包:http://www.jacorb.org/releases/2.3.1/jacorb-2.3.1-bin.zip

  解压后需要:avalon_framework.jar,jacorb.jar,logkit.jar

  第一步骤生成的程序拷贝到项目中。

   a.实现功能

 

package com.corba;  
import org.omg.CORBA.ORB;

import HelloApp.HelloPOA;
public class HelloImpl extends HelloPOA{  
    private ORB orb;  
      
    public void setOrb(ORB orb) {  
        this.orb = orb;  
    }  
    public String sayHello() {  
        return "Hello ganliang!";  
    }  
    public void shutdown() {  
        orb.shutdown(false);  
    }
	@Override
	public String sayBye() {
		
		return "Bye ganliang";
	}  
}  

 b.建立伺服器

 

  package com.corba;

 
import java.util.Properties;

import org.omg.CORBA.ORB;
import org.omg.PortableServer.IdAssignmentPolicyValue;
import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.ServantRetentionPolicyValue;
public class HelloServer {
	//持久化的POA
	private static POA persistentPOA = null;
		
	public static void main(String[] args) {
		 //生成一个对象请求代理(ORB),并初始化  
        Properties props = new Properties();  
		//使用jacorb的CORBA实现方案
        props.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
        props.put("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
		//使用持久化IOR,必须指定持久化POA的实现名称,默认是"StandardImplName",
		//可以随便指定
        props.put("jacorb.implname", "StandardImplName");
		//这里是指定CORBA服务器端端口为固定端口,是CORBA的IOR固定不变的关键
        props.put("OAPort", "12500");
        //如果需要指定服务器端的ip地址,则需要使用下面这种方式,默认使用上面的方式//只指定端口即可,ip地址是服务器端程序所在机器的ip,注意这两种只能二选其一
        props.put("OAAddress", "iiop://192.168.10.4:10501");
		try{
			//创建ORB实例
			ORB orb = ORB.init(args, props);
			
			//得到一个 RootPOA引用
			POA rootPoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
			//指定创建持久化POA的策略,使用持久化POA必须指定以下三种策略
			 org.omg.CORBA.Policy[] policies = new org.omg.CORBA.Policy[3];
				//POA生命周期是持久化
		        policies[0] = rootPoa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT);
				//CORBA对象的标识符是用户指定的
		        policies[1] = rootPoa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID);
				//每次接到一个请求时,POA期望应用程序提供目标对象标识符作为
		        //查找伺服程序的索引
		        policies[2] = rootPoa.create_servant_retention_policy(ServantRetentionPolicyValue.RETAIN);
		        //创建持久化的POA
		        persistentPOA = rootPoa.create_POA("PersistentPOA", rootPoa.the_POAManager(), policies);
		        	//清除策略  
		        policies[0].destroy();
		        policies[1].destroy();
		        policies[2].destroy();
		        policies = null;
			
			//创建伺服程序并注册到ORB上
			HelloImpl helloImpl = new HelloImpl();
			helloImpl.setOrb(orb);
			
			//创建伺服程序标识符,因为使用IdAssignmentPolicyValue.USER_ID
			//策略,所有必须要指定伺服程序id
			byte[] servantId = "MyHelloImpl".getBytes();
			//将伺服程序标识符和服务器端CORBA对象关联起来并激活
			persistentPOA.activate_object_with_id(servantId, helloImpl);
			//激活POAManager
			rootPoa.the_POAManager().activate();
			//通过持久化POA获取CORBA对象
			org.omg.CORBA.Object ref = persistentPOA.servant_to_reference(helloImpl);
			//打印CORBA对象的IOR
			System.out.println("CORBA IOR is:" + orb.object_to_string(ref));
			
			System.out.println("HelloServer ready and waiting...");
			
			//启动线程服务,等待调用
			orb.run();
		}catch(Exception e){
			System.out.println("HelloServer occur error:" + e);
			e.printStackTrace(System.out);
		}
		System.out.println("HelloServer exiting ...");
	}
}

 运行此程序,注意生成的IOR 长串。以供客户端用。

 

2.在Eclipse建立客户端client_project。

同样需要第一步骤生成的文件拷贝进项目import org.omg.CORBA.ORB;

 

 import org.omg.CORBA.ORB;

import HelloApp.Hello;
import HelloApp.HelloHelper;
public class HelloClient {
	static Hello hello;
	public static void main(String[] args) {
		try {
			// 创建一个ORB实例
			ORB orb = ORB.init(args, null);
// 直接通过IOR向CORBA获取目标对象,IOR是服务器端生成的(自己实现时,第一次需要//拷贝服务器端生成的IOR),因为是固定不变的IOR,因为这里可以直接硬编码写死
			hello = HelloHelper.narrow(orb.string_to_object("IOR:000000000000001749444C3A48656C6C6F4170702F48656C6C6F3A312E30000000000001000000000000005C000102000000000D3139322E3136382E31302E34000029050000002A5374616E64617264496D706C4E616D652F50657273697374656E74504F412F4D7948656C6C6F496D706C0000000000010000000000000008000000004A414300"));
			// 调用接口对象的方法
			System.out.println("Get hello object from corba server:" + hello);
			System.out.println(hello.sayHello());
			System.out.println(hello.sayBye());
			//关闭CORBA服务
			//hello.shutdown();
		} catch (Exception e) {
			System.out.println("HelloClient occur error:" + e);
			e.printStackTrace(System.out);
		}
	}
}

 


启动服务气端,运行客户端。

 

你可能感兴趣的:(实例,corba)