天天看點

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

啟動服務氣端,運作用戶端。