一 關(guān)于環(huán)境問題
首先關(guān)于corba環(huán)境搭建可以參考我之前的文章【程序員筆記】Eclipse下搭建Corba開發(fā)環(huán)境,而對應的idlj是本身jdk自帶的jar包,不需要做更多的操作。
二 關(guān)于原理問題
通過idl編寫文檔需求說明,利用類似于腳手架一樣的東西快速的生成客戶端的樁代碼和服務器端的框架代碼,然后客戶通過自身需求去建立繼續(xù)編寫代碼,最后運行即可。
在本地調(diào)用遠程方法之后,在傳到對應的POA(對象適配器),對象適配器會根據(jù)客戶端的請求以及自身的POA策略找到適合的伺服對象,從而調(diào)用這個伺服對象上對應的方法,然后對應進行返回結(jié)果。
三 關(guān)于步驟問題
創(chuàng)建CORBA應用程序的過程大體如下:
● 編寫IDL接口定義文件;
● 將接口定義文件編譯為相應高級語言源代碼,產(chǎn)生服務器框架與客戶端存根;
● 基于服務器框架,編寫服務對象實現(xiàn)程序;
● 基于客戶端存根,編寫客戶對象調(diào)用程序;
● 分別編譯客戶對象和服務對象程序;
● 運行服務對象和客戶對象程序;
四 關(guān)于實戰(zhàn)問題
-
整體的項目結(jié)構(gòu)如下,中間的包中的文件都是通過編譯idl文件得到的,實際上需要我們自己動手編寫的只有最開始的idl文件和client還有server包里面的文件。
整體的項目結(jié)構(gòu) CorbaTestImpl
import CorbaTest.GoldbashPOA;
public class CorbaTestImpl extends GoldbashPOA {
public String checkNum(float a) {
for(int j=2;j<(a/2+1);j++){
if(isPrimeNum(j)&&isPrimeNum(a-j)){
return "the number is "+(j-0.0)+" and "+(a-j);
}
}
return "2332";
}
public Boolean isPrimeNum(float num){
for(int i=2;i<(num/2+1);i++){
if(num%i==0){
return false;
}
}
return true;
}
}
3 server
import org.omg.CORBA.ORB;
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.InvalidName;
import org.omg.CosNaming.NamingContextPackage.NotFound;
import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.AdapterAlreadyExists;
import org.omg.PortableServer.POAPackage.InvalidPolicy;
import org.omg.PortableServer.POAPackage.ObjectAlreadyActive;
import org.omg.PortableServer.POAPackage.ServantAlreadyActive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;
import CorbaTest.Goldbash;
import CorbaTest.GoldbashHelper;
public class Server {
public static void main(String[] args)throws ServantNotActive, WrongPolicy, InvalidName, AdapterInactive, org.omg.CosNaming.NamingContextPackage.InvalidName, NotFound, CannotProceed, org.omg.CORBA.ORBPackage.InvalidName, AdapterAlreadyExists, InvalidPolicy, ServantAlreadyActive, ObjectAlreadyActive {
args=new String[2];
args[0]="-ORBInitialPort";
args[1]="900";
//初始化orb
ORB orb = ORB.init(args, null);
// 取根POA的引用,并激活POAManager
org.omg.CORBA.Object obj=orb.resolve_initial_references("RootPOA");
POA rootpoa = POAHelper.narrow(obj);
//激活POAManager
rootpoa.the_POAManager().activate();
//創(chuàng)建一個Impl實例
CorbaTestImpl corbatestImpl = new CorbaTestImpl();
//從服務中獲得對象的引用
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(corbatestImpl);
Goldbash href = GoldbashHelper.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);
System.out.println("server start ");
//啟動等待客戶端系統(tǒng)調(diào)用
orb.run();
}
}
4 client
package client;
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;
import CorbaTest.Goldbash;
import CorbaTest.GoldbashHelper;
import server.CorbaTestImpl;
public class Client {
static Goldbash corbaTestImpl;
static {
System.out.println("client開啟連接server");
//初始化ip和端口號,-ORBInitialHost 127.0.0.1 -ORBInitialPort 900
String args[] = new String[4];
args[0] = "-ORBInitialHost";
//server端的IP地址,在HelloServer中定義的
args[1] = "127.0.0.1";
args[2] = "-ORBInitialPort";
//server端的端口,在HelloServer中定義的
args[3] = "900";
//創(chuàng)建一個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實例化好的實現(xiàn)類
corbaTestImpl = GoldbashHelper.narrow(neRef.resolve_str(name));
} catch (NotFound e) {
e.printStackTrace();
} catch (CannotProceed e) {
e.printStackTrace();
} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws Exception {
float a=12;
String str = corbaTestImpl.checkNum(a);
System.out.println(str);
}
}
5 比較重要的一點在于項目啟動順序
要先到自己的本機的jdk的bin目錄下執(zhí)行 tnameserv命令,當出現(xiàn)如下界面之后再依次啟動服務器端和客戶端。

五 關(guān)于idlj問題
這個和corba的整體流程幾乎是一樣的,只是在最開始編譯的時候不需要這么麻煩的設定各種位置,只要在項目的idl文件所在位置直接執(zhí)行
idlj idlname.idl
在當前目錄下就會有我們所需要的這幾個文件了,然后放到自己的項目目錄下即可。
