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);
}
}
}
啟動服務氣端,運作用戶端。