基于Java IDL的分布式程序設(shè)計(jì)
發(fā)表時(shí)間:2024-02-24 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本文轉(zhuǎn)載自軟件工程專(zhuān)家網(wǎng)www.21cmm.comJava IDL介紹 JavaIDL是Java 2開(kāi)發(fā)平臺(tái)中的CORBA功能擴(kuò)展。在Java 2中引入JavaIDL,使得利用OMG IDL能夠定義服務(wù)對(duì)象的基本功能,并且將IDL根據(jù)CORBA規(guī)范的要求,映射到Java語(yǔ)言,并以此開(kāi)發(fā)出標(biāo)準(zhǔn)的...
本文轉(zhuǎn)載自軟件工程專(zhuān)家網(wǎng)www.21cmm.com
Java IDL介紹
JavaIDL是Java 2開(kāi)發(fā)平臺(tái)中的CORBA功能擴(kuò)展。在Java 2中引入JavaIDL,使得利用OMG IDL能夠定義服務(wù)對(duì)象的基本功能,并且將IDL根據(jù)CORBA規(guī)范的要求,映射到Java語(yǔ)言,并以此開(kāi)發(fā)出標(biāo)準(zhǔn)的具有互操作性和可連接性的分布式應(yīng)用。JavaIDL使分布式、支持Web的Java應(yīng)用可以基于IIOP協(xié)議透明地調(diào)用遠(yuǎn)程服務(wù)。
JavaIDL運(yùn)行期(Runtime)組件包括一個(gè)全兼容的對(duì)象請(qǐng)求代理——Java ORB,用于基于IIOP協(xié)議實(shí)現(xiàn)分布式對(duì)象之間的通信。該ORB支持瞬態(tài)CORBA對(duì)象和瞬態(tài)名字服務(wù)器,并且ORB生存期受運(yùn)行ORB進(jìn)程生存期的限制。
在程序設(shè)計(jì)中,首先對(duì)要實(shí)現(xiàn)的服務(wù)對(duì)象功能進(jìn)行系統(tǒng)分析,并創(chuàng)建IDL接口描述文件對(duì)功能進(jìn)行描述。然后利用JavaIDL提供的IDL到Java語(yǔ)言的映射工具將IDL文件映射為客戶端樁(Stub)文件和服務(wù)器骨架(Skeleton)文件。
在實(shí)現(xiàn)的客戶端應(yīng)用程序中,包括對(duì)遠(yuǎn)程對(duì)象的引用、服務(wù)功能請(qǐng)求的發(fā)送以及服務(wù)對(duì)象返回結(jié)果的解析處理等功能。通常,客戶端應(yīng)用程序利用命名服務(wù)實(shí)現(xiàn)對(duì)遠(yuǎn)程對(duì)象的綁定,并通過(guò)客戶端ORB將客戶端與服務(wù)對(duì)象聯(lián)系起來(lái),實(shí)現(xiàn)方法的遠(yuǎn)程調(diào)用。
在服務(wù)器端,ORB利用服務(wù)對(duì)象骨架將調(diào)用請(qǐng)求和參數(shù)的數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換,把遠(yuǎn)程調(diào)用轉(zhuǎn)換為對(duì)本地對(duì)象中方法的調(diào)用。當(dāng)方法返回時(shí),骨架對(duì)計(jì)算結(jié)果進(jìn)行轉(zhuǎn)換和封裝,通過(guò)ORB把結(jié)果返回給客戶機(jī)。
建立CORBA應(yīng)用程序的過(guò)程
分布式應(yīng)用程序設(shè)計(jì)的主要問(wèn)題是確定建立在對(duì)象級(jí)上的客戶與服務(wù)對(duì)象的關(guān)系,從其最根本的功能來(lái)講,服務(wù)對(duì)象提供遠(yuǎn)程接口,客戶對(duì)象調(diào)用遠(yuǎn)程接口,客戶對(duì)象不需要了解遠(yuǎn)程CORBA對(duì)象的位置以及實(shí)現(xiàn)細(xì)節(jié),也不需要了解哪個(gè)ORB 用于對(duì)象之間的交互。
按照實(shí)現(xiàn)的基本過(guò)程,CORBA對(duì)象服務(wù)的實(shí)現(xiàn)方式分為兩種: 對(duì)象的命名引用方式和字符串化對(duì)象引用方式。CORBA創(chuàng)建分布式應(yīng)用程序的過(guò)程大體如下:
● 進(jìn)行系統(tǒng)分析,確定服務(wù)對(duì)象需要實(shí)現(xiàn)的功能;
● 根據(jù)系統(tǒng)分析結(jié)果,編寫(xiě)IDL接口說(shuō)明文件;
● 編譯接口說(shuō)明文件,產(chǎn)生服務(wù)對(duì)象的骨架與客戶對(duì)象的樁(可選);
● 基于客戶對(duì)象的樁,編寫(xiě)客戶對(duì)象程序;
● 基于服務(wù)對(duì)象的骨架或者動(dòng)態(tài)請(qǐng)求實(shí)現(xiàn),編寫(xiě)服務(wù)對(duì)象程序;
● 分別編譯客戶對(duì)象和服務(wù)對(duì)象程序;
● 啟動(dòng)服務(wù)對(duì)象程序;
● 啟動(dòng)客戶對(duì)象程序。
分布式應(yīng)用程序示例
以下用一個(gè)例程說(shuō)明建立分布式應(yīng)用程序的過(guò)程:
1. 對(duì)象功能描述和系統(tǒng)簡(jiǎn)要設(shè)計(jì)
在服務(wù)對(duì)象端將一個(gè)字符串對(duì)象賦值,客戶端通過(guò)調(diào)用服務(wù)對(duì)象方法獲取該字符串的值。根據(jù)對(duì)象功能的說(shuō)明,用UML描述出服務(wù)對(duì)象需要實(shí)現(xiàn)的功能:
getIt() : String[]
2. 服務(wù)對(duì)象接口定義
根據(jù)系統(tǒng)分析結(jié)果,用IDL編寫(xiě)出服務(wù)對(duì)象方法描述程序getMessage.idl:
module getMessage
{ interface getIt
{ string returnObject();
};
};
3. 編譯getMessage.idl
idltojava -fno-cpp getMessage.idl。
4. 編寫(xiě)客戶端程序
//引入相關(guān)類(lèi)庫(kù)
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
//客戶端對(duì)象方法
public class client
{ public static void main(String args[])
{ // 創(chuàng)建和初始化ORB
ORB orb = ORB.init(args, null);
// 獲取根命名服務(wù)上下文對(duì)象
org.omg.CORBA.Object naming =
orb.resolve_initial_references(“NameService”);
NamingContext namingContext = NamingContextHelper.narrow(naming);
//解析命名中的對(duì)象引用
NameComponent nc = new NameComponent(“getMessage”, “”);
NameComponent path[] = {nc};
getMessage.getIt method =getMessage-
Helper.narrow(namingContext.resolve(path));
// 調(diào)用服務(wù)對(duì)象方法
String result=method.returnObject();
}
}
5. 編寫(xiě)服務(wù)對(duì)象程序
// 引入相關(guān)類(lèi)庫(kù)
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContext
Package.*;
import org.omg.CORBA.*;
//服務(wù)方法
class returnMethod extends _getMessage-
ImplBase
{ public String getIt()
{ String result =“How about it”;
return result;
}
}
//服務(wù)器端方法
public class server
{ public static void main(String args[])
{ // 創(chuàng)建和初始化ORB
ORB orb = ORB.init(args, null);
// 創(chuàng)建服務(wù)對(duì)象并將其向ORB注冊(cè)
returnMethod obj=new returnMethod();
orb.connect(returnMethod);
// 獲取根命名上下文
org.omg.CORBA.Object objRef =
orb.resolve_initial_references
(“NameService”);
NamingContext ncRef = Naming
ContextHelper.narrow(objRef);
// 綁定命名中的對(duì)象引用
NameComponent nc = new NameComponent(“getMessage”, “”);
NameComponent path[] = {nc};
ncRef.rebind(path, objRef);
// 等待來(lái)自客戶機(jī)的調(diào)用
java.lang.Object sync=new java.lang
.Object();
synchronized (sync)
{ sync.wait();
}
}
}
6. 分別編譯服務(wù)器端和客戶端程序
。1)編譯服務(wù)器端程序:
javac getMessage\server.java
。2)編譯客戶端程序:
javac getMessage\client.java
7. 運(yùn)行
。1)打開(kāi)一個(gè)仿真終端窗口,啟動(dòng)命名服務(wù),其中3388為通信端口號(hào):
tnameserv -ORBInitialPort 3388
。2)在另一個(gè)窗口中輸入以下命令,運(yùn)行服務(wù)端程序:
java server -ORBInitialPort 3388
(3)在另一個(gè)窗口中輸入以下命令,運(yùn)行客戶端程序:
java client -ORBInitialPort 3388