国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

利用RMI實(shí)現(xiàn)JAVA分布式應(yīng)用

2019-11-18 13:54:56
字體:
供稿:網(wǎng)友

  java RMI (Remote Method Invocation 遠(yuǎn)程方法調(diào)用)是用Java在JDK1.1中實(shí)現(xiàn)的,它大大增強(qiáng)了Java開發(fā)分布式應(yīng)用的能力。Java作為一種風(fēng)靡一時的網(wǎng)絡(luò)開發(fā)語言,其巨大的威力就體現(xiàn)在它強(qiáng)大的開發(fā)分布式網(wǎng)絡(luò)應(yīng)用的能力上,而RMI就是開發(fā)百分之百純Java的網(wǎng)絡(luò)分布式應(yīng)用系統(tǒng)的核心解決方案之一。其實(shí)它可以被看作是RPC的Java版本。但是傳統(tǒng)RPC并不能很好地應(yīng)用于分布式對象系統(tǒng)。而Java RMI 則支持存儲于不同地址空間的程序級對象之間彼此進(jìn)行通信,實(shí)現(xiàn)遠(yuǎn)程對象之間的無縫遠(yuǎn)程調(diào)用。RMI目前使用Java遠(yuǎn)程消息交換協(xié)議JRMP(Java Remote Messaging PRotocol)進(jìn)行通信。JRMP是專為Java的遠(yuǎn)程對象制定的協(xié)議。因此,Java RMI具有Java的"Write Once,Run Anywhere"的優(yōu)點(diǎn),是分布式應(yīng)用系統(tǒng)的百分之百純Java解決方案。用Java RMI開發(fā)的應(yīng)用系統(tǒng)可以部署在任何支持JRE(Java Run Environment Java,運(yùn)行環(huán)境)的平臺上。但由于JRMP是專為Java對象制定的,因此,RMI對于用非Java語言開發(fā)的應(yīng)用系統(tǒng)的支持不足。不能與用非Java語言書寫的對象進(jìn)行通信。本文擬從程序的角度舉例介紹怎樣利用RMI實(shí)現(xiàn)Java分布式應(yīng)用。

  一、RMI系統(tǒng)運(yùn)行機(jī)理

  RMI應(yīng)用程序通常包括兩個獨(dú)立的程序:服務(wù)器程序和客戶機(jī)程序。典型的服務(wù)器應(yīng)用程序?qū)?chuàng)建多個遠(yuǎn)程對象,使這些遠(yuǎn)程對象能夠被引用,然后等待客戶機(jī)調(diào)用這些遠(yuǎn)程對象的方法。而典型的客戶機(jī)程序則從服務(wù)器中得到一個或多個遠(yuǎn)程對象的引用,然后調(diào)用遠(yuǎn)程對象的方法。RMI為服務(wù)器和客戶機(jī)進(jìn)行通信和信息傳遞提供了一種機(jī)制。

  在與遠(yuǎn)程對象的通信過程中,RMI使用標(biāo)準(zhǔn)機(jī)制:stub和skeleton。遠(yuǎn)程對象的stub擔(dān)當(dāng)遠(yuǎn)程對象的客戶本地代表或代理人角色。調(diào)用程序?qū)⒄{(diào)用本地stub的方法,而本地stub將負(fù)責(zé)執(zhí)行對遠(yuǎn)程對象的方法調(diào)用。在RMI中,遠(yuǎn)程對象的stub與該遠(yuǎn)程對象所實(shí)現(xiàn)的遠(yuǎn)程接口集相同。調(diào)用stub的方法時將執(zhí)行下列操作:(1) 初始化與包含遠(yuǎn)程對象的遠(yuǎn)程虛擬機(jī)的連接;(2) 對遠(yuǎn)程虛擬機(jī)的參數(shù)進(jìn)行編組(寫入并傳輸);(3) 等待方法調(diào)用結(jié)果;(4) 解編(讀取)返回值或返回的異常;(5) 將值返回給調(diào)用程序。為了向調(diào)用程序展示比較簡單的調(diào)用機(jī)制,stub將參數(shù)的序列化和網(wǎng)絡(luò)級通信等細(xì)節(jié)隱藏了起來。在遠(yuǎn)程虛擬機(jī)中,每個遠(yuǎn)程對象都可以有相應(yīng)的skeleton(在JDK1.2環(huán)境中無需使用skeleton)。Skeleton負(fù)責(zé)將調(diào)用分配給實(shí)際的遠(yuǎn)程對象實(shí)現(xiàn)。它在接收方法調(diào)用時執(zhí)行下列操作:(1) 解編(讀取)遠(yuǎn)程方法的參數(shù);(2) 調(diào)用實(shí)際遠(yuǎn)程對象實(shí)現(xiàn)上的方法;(3) 將結(jié)果(返回值或異常)編組(寫入并傳輸)給調(diào)用程序。stub和skeleton由rmic編譯器生成。

  利用RMI編寫分布式對象應(yīng)用程序需要完成以下工作:(1) 定位遠(yuǎn)程對象。應(yīng)用程序可使用兩種機(jī)制中的一種得到對遠(yuǎn)程對象的引用。它既可用RMI的簡單命名工具rmiregistry來注冊它的遠(yuǎn)程對象,也可以將遠(yuǎn)程對象引用作為常規(guī)操作的一部分來進(jìn)行傳遞和返回。(2)與遠(yuǎn)程對象通信。遠(yuǎn)程對象間通信的細(xì)節(jié)由RMI處理,對于程序員來說,遠(yuǎn)程通信看起來就像標(biāo)準(zhǔn)的Java方法調(diào)用。(3)給作為參數(shù)或返回值傳遞的對象加載類字節(jié)碼。因?yàn)镽MI答應(yīng)調(diào)用程序?qū)⒓僇ava對象傳給遠(yuǎn)程對象,所以,RMI將提供必要的機(jī)制,既可以加載對象的代碼又可以傳輸對象的數(shù)據(jù)。在RMI分布式應(yīng)用程序運(yùn)行時,服務(wù)器調(diào)用注冊服務(wù)程序以使名字與遠(yuǎn)程對象相關(guān)聯(lián)。客戶機(jī)在服務(wù)器上的注冊服務(wù)程序中用遠(yuǎn)程對象的名字查找該遠(yuǎn)程對象,然后調(diào)用它的方法。

  二、對象序列化

  在RMI分布式應(yīng)用系統(tǒng)中,服務(wù)器與客戶機(jī)之間傳遞的Java對象必須是可序列化的對象。不可序列化的對象不能在對象流中進(jìn)行傳遞。對象序列化擴(kuò)展了核心Java輸入/輸出類,同時也支持對象。對象序列化支持把對象編碼以及將通過它們可訪問到的對象編碼變成字節(jié)流;同時,它也支持流中對象圖形的互補(bǔ)重構(gòu)造。序列化用于輕型持久性和借助于套接字或遠(yuǎn)程方法調(diào)用(RMI)進(jìn)行的通信。序列化中現(xiàn)在包括一個 API(application Programming Interface,應(yīng)用程序接口),答應(yīng)獨(dú)立于類的域指定對象的序列化數(shù)據(jù),并答應(yīng)使用現(xiàn)有協(xié)議將序列化數(shù)據(jù)域?qū)懭肓髦谢驈牧髦凶x取,以確保與缺省讀寫機(jī)制的兼容性。

  為編寫應(yīng)用程序,除多數(shù)瞬態(tài)應(yīng)用程序外,都必須具備存儲和檢索 Java對象的能力。以序列化方式存儲和檢索對象的要害在于提供重新構(gòu)造該對象所需的足夠?qū)ο鬆顟B(tài)。存儲到流的對象可能會支持 Serializable(可序列化)或 Externalizable(可外部化)接口。對于Java對象,序列化形式必須能標(biāo)識和校驗(yàn)存儲其內(nèi)容的對象所屬的 Java類,并且將該內(nèi)容還原為新的實(shí)例。對于可序列化對象,流將提供足夠的信息將流的域還原為類的兼容版本。對于可外部化對象,類將全權(quán)負(fù)責(zé)其內(nèi)容的外部格式。序列化 Java 對象的目的是:提供一種簡單但可擴(kuò)充的機(jī)制,以序列化方式維護(hù) Java對象的類型及安全屬性;具有支持編組和解編的擴(kuò)展能力以滿足遠(yuǎn)程對象的需要;具有可擴(kuò)展性以支持 Java 對象的簡單持久性;只有在自定義時,才需對每個類提供序列化自實(shí)現(xiàn);答應(yīng)對象定義其外部格式。

  三、分布式應(yīng)用的實(shí)現(xiàn)和運(yùn)行步驟

  編寫Java RMI分布式應(yīng)用程序的步驟主要包括以下幾步:

  (1) 將遠(yuǎn)程類的功能定義為Java接口。在Java中,遠(yuǎn)程對象是實(shí)現(xiàn)遠(yuǎn)程接口的類的實(shí)例。在遠(yuǎn)程接口中聲明每個要遠(yuǎn)程調(diào)用的方法。遠(yuǎn)程接口具有如下特點(diǎn):1) 遠(yuǎn)程接口必須聲明為public。假如不這樣,則除非客戶端與遠(yuǎn)程接口在同一個包內(nèi),否則當(dāng)試圖裝入實(shí)現(xiàn)該遠(yuǎn)程接口的遠(yuǎn)程對象時會得到錯誤結(jié)果。2) 遠(yuǎn)程對象擴(kuò)展java.rmi.Remote接口。3) 除了所有應(yīng)用程序特定的例外之外,每個方法還必須拋出java.rmi.RemoteException例外。4) 任何作為參數(shù)或返回值傳送的遠(yuǎn)程對象的數(shù)據(jù)類型必須聲明為遠(yuǎn)程接口類型,而不是實(shí)現(xiàn)類。



上一篇:純Java周歷的寫法

下一篇:返回對象

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平阳县| 余江县| 安庆市| 新田县| 竹山县| 九龙坡区| 德格县| 桃园县| 佛冈县| 南乐县| 诸城市| 裕民县| 凤庆县| 常德市| 金阳县| 新津县| 东乡族自治县| 南皮县| 邢台县| 湖北省| 绥化市| 宜兰县| 永年县| 增城市| 如东县| 紫金县| 扎囊县| 庄河市| 济南市| 禹城市| 云阳县| 西峡县| 樟树市| 公主岭市| 海盐县| 平定县| 仙居县| 祁门县| 克什克腾旗| 九龙县| 韩城市|