用RMI開發(fā)基于-Java分布式應(yīng)用_杜風雷_第1頁
用RMI開發(fā)基于-Java分布式應(yīng)用_杜風雷_第2頁
用RMI開發(fā)基于-Java分布式應(yīng)用_杜風雷_第3頁
用RMI開發(fā)基于-Java分布式應(yīng)用_杜風雷_第4頁
用RMI開發(fā)基于-Java分布式應(yīng)用_杜風雷_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、-用 RMI 開發(fā)基于 Java 的分布式應(yīng)用杜風雷( 警官職業(yè)學院, 310018)摘 要: 由于 Java 具有跨平臺、代碼可移植性、平安高效等廣泛而強大的功能, 因而在開發(fā)網(wǎng)絡(luò)分布式應(yīng)用的時候, 可以用它自身的機制實現(xiàn)分布式計算, 一種基于 Java 的遠程方法調(diào)用(RMI)為我們開發(fā)分布式應(yīng)用提供了行之有效的解決方案。關(guān)鍵詞: Java RMI, 分布式應(yīng)用中圖法: TP390 文獻標識碼: A 文章編號: 1000- 7180(2006)07- 004The Distributed Application Based on Java With RMIDU Feng-lei(Zheji

2、ang Police Vocational Academy, Hangzhou 310018 China)Abetract: Java can go beyond one platform, its codes can be replanted, and it is safe and efficient. So when weempolder the distributed application of Network, we can use its own mechanism to realize the distributed calculation. Akind of RMI based

3、 on Java provides an efficient resolvent to empolder the distributed application for us.Key words: Java RMI, Distributed application1 引言隨著信息化的開展, 各系統(tǒng)之間的數(shù)據(jù)的交換量大大增加, 但計算機網(wǎng)絡(luò)硬件設(shè)備與操作系統(tǒng)千差萬別, 因此需要使用遠程方法調(diào)用 RMI(RemoteMeth Invocation), 可以在不同的 Java 虛擬機(JVM)之間實現(xiàn)對象與對象的通信。JVM可以位于一樣或不同計算機上, 在多個 JVM中, 一個 JVM可以調(diào)用存儲在

4、其它 JVM的對象的方法。2 遠程方法調(diào)用(RMI)的特點2.1 RMI 編程的特點(1) 客戶機可以向本地方法一樣調(diào)用遠程效勞器上的方法;(2) 可以根據(jù)接口指定客戶機/效勞器編程合約;(3) 可以從效勞器對象缺省二進制類文件, 自動生成調(diào)動/反調(diào)動代碼;(4) 將 Java 編程模型擴展到機器邊界( 和 Java虛擬機(JVM)邊界之外), 不需要任何特殊語法;(5) 還可以和一個遠程方法調(diào)用中的數(shù)據(jù)同時傳輸行為(代碼)。2.2 RMI 與 CORBA作為分布式應(yīng)用程序框架的規(guī), COBRA 首當其沖, 它是由對象管理組織(OMG) 開發(fā)的。與CORBA 不同的是, CORBA 能夠利用不

5、同編程語言( 例如 C/C+、Basic 等) 開發(fā)實現(xiàn)分布式應(yīng)用, 而RMI 是一種純 Java 解決方案。在 RMI 中, 程序的所有局部都由 Java 語言編寫, 這樣, 開發(fā)出來的程序完全符合 Java 規(guī), 便于實現(xiàn)跨平臺、擴展和移植。按照筆者所在西北電力建立集團公司的情況看, 效勞器操作系統(tǒng)主要有 Linu* 和 Windows2000Server, 分別存在于公司和部門當中, 它們是不同的系統(tǒng)平臺; 同時, 公司下屬各個工程工程部又距離很遠, 近的幾十公里, 遠則到達上千公里甚至位于國外, 因此跨平臺和遠程這兩大功能在開發(fā)應(yīng)用系統(tǒng)時就必須考慮, 而 RMI 恰恰能夠用它的自身特點

6、來滿足編程需要。2.3 RMI 根本體系構(gòu)造簡介RMI 通過 TCP/IP 在部使用 Socket, 象其名稱暗示的那樣, 它能夠幫助我們查找并執(zhí)行遠程對象的方法。RMI 的目的是讓位于不同 JVM中的對象,在外觀及行為上都像是本地的對象。通常, 我們把調(diào)用這種遠程對象的 JVM, 稱為客戶機; 而把包括這種遠程對象的 JVM, 稱為效勞器。盡管對一個遠程對象的引用和獲得對本地對象的引用有所不同,但我們可以把遠程對象像本地對象一樣使用。應(yīng)用收稿日期: 2005-11-09程序并不知道一個對象是遠程的還是本地的。實際上, 遠程對象上被調(diào)用的方法與本地對象上調(diào)用的方法, 具有一樣的語法構(gòu)造。作為

7、RMI 的底層(會包含復雜的 Socket 操作),它會自動截獲方法調(diào)用, 找到遠程對象, 然后處理遠程請求。RMI 設(shè)計的重要之處, 就在于不但在設(shè)計上實現(xiàn)了遠程功能, 而且實現(xiàn)了設(shè)計的透明性。RMI 的根本體系構(gòu)造, 概括起來說, 由三個抽象層組成:(1) 存根/框架層(Stubs/Skeletons Layer)RMI 為我們引入了兩種特殊類型的對象, 稱為存根(Stub) 和框架(Skeleton) , 它們組成了 RMI 的第一層。在遠程通信的時候, 要利用 TCP/IP 協(xié)議,做很多底層數(shù)據(jù)的打包傳輸。運用 Java 技術(shù), 我們先要把數(shù)據(jù)或者對象轉(zhuǎn)換成字節(jié)流, 便于網(wǎng)絡(luò)傳輸, 這

8、個過程叫聚集; 當收到遠程傳來的字節(jié)流后, 我們要把流信息轉(zhuǎn)換成對象或者數(shù)據(jù), 這個過程叫解讀, 它與聚集剛好相反。Stub 和 Skeleton 層位于實際應(yīng)用程序之下, 建立在 Pro*y( 代理) 設(shè)計方案之上。Stub 類的作用是遠程效勞器實現(xiàn)的代理的角色, Stub 是客戶方對象; Skeleton 類用于幫助對象通過 RMI 與 Stub通信, 它從鏈路中讀取方法調(diào)用的參數(shù), 向遠程服務(wù)實現(xiàn)對象進展調(diào)用, 承受返回值, 然后再把返回值寫回到 Stub。(2) 遠程引用層遠程引用層定義和支持著 RMI 連接的調(diào)用語義。RMI 進展遠程要用到 JRMP (Java RemoteMeth

9、od Protocol, 即 Java 遠程方法協(xié)議), 這一層提供專用于 JRMP 的 RemoteRef 對象, 它位于 java.rmi.server 包, 代表著遠程對象的一個句柄。Re-moteRef 使用遠程引用來執(zhí)行遠程對象的一個遠程方法調(diào)用。(3) 傳輸層傳輸層在 JVM之間建立基于流的網(wǎng)絡(luò)連接, 并且負責設(shè)置和管理這些連接。這時候, RMI 使用一種線級協(xié)議進展基于 TCP/IP 的連接, 該協(xié)議就是Java 遠程方法協(xié)議(JRMP, 即 Java Remote MethodProtocol)。在 JDK 版本 1.2 開場, JRMP 不再需要Skeleton, 而是使用

10、reflection 來建立與遠程效勞的連接。為了生成 Stub, 我們須用 rmic。當前的 RMI 實現(xiàn)中, 傳輸層建立在 TCP/IP 根底上, 設(shè)計用于在客戶和效勞器之間建立一條連接(即使聯(lián)網(wǎng)有障礙)。2.4 開發(fā)的根本步驟使用 RMI 編寫 Client/Server 模式 ( 客戶/效勞器)應(yīng)用程序, 包括 6 個根本步驟:(1) 定義遠程接口;(2) 實現(xiàn)遠程接口;(3) 準備遠程調(diào)用的效勞器對象;(4) 生成殘根 Stub( 客戶代理) 和框架 Skeleton(效勞器實體);(5) 用 rmiregistry 找到遠程對象;(6) 運行測試 RMI 分布式應(yīng)用。2.5 開發(fā)信

11、息發(fā)布系統(tǒng)實例在開發(fā) RMI 進展分布式之前, 需要將各項功能模塊化, 即把實際應(yīng)用抽象成符合 Java 規(guī)的類和接口模型, 使這些類和接口之間互相協(xié)作, 能實現(xiàn)各自獨立的功能, 最后, 可以把它們組合成統(tǒng)一的網(wǎng)絡(luò)分布式系統(tǒng)?,F(xiàn)在, 以開發(fā)公司信息發(fā)布系統(tǒng)為例, 把主模塊( 主要的類文件) 的名稱定為信息發(fā)布效勞, 為了保持應(yīng)用開發(fā)的數(shù)據(jù)一致性和清晰度, 接下來涉及的其它模塊命名也將以這個模塊命名為基準。(1) 定義遠程接口Java RMI 運行環(huán)境要求任何可以遠程調(diào)用的方法必須放在遠程接口中。該遠程接口用來擴展java.rmi.Remote 接口, 在 Java API 中, 可以發(fā)現(xiàn)它沒有

12、任何方法, 只是個標志性接口, 這樣, 可以讓 Java運行環(huán)境(JRE) 認識每個接口的特殊屬性, 以便能夠遠程。因此, 按照信息發(fā)布效勞的命名, 首先須將信息發(fā)布效勞定義為遠程接口, 同時僅放入一個供測試的方法 getRemoteInfo()來實現(xiàn)編碼, 將所有模塊至于新建的 enterprise.distribute 包中, 代碼如下:/ - - - - - - - - InfoDistributeRemote. java- - - - - - - -package enterprise. distribute;import java.rmi.Remote;import java.rmi

13、.RemoteE*ception;public interface InfoDistributeRemote e*tends Remotepublic String getRemoteInfo( ) throws RemoteE*ception;(2) 實現(xiàn)遠程接口這是一個實現(xiàn)遠程對象的類。如果實現(xiàn)了遠程接口, 就能夠覆蓋該對象中的所有方法, 因此, 遠程對象的實現(xiàn)類將真正包含我們希望導出的方法的代碼。在遠程信息發(fā)布系統(tǒng)中, 我們至少實現(xiàn)一個遠程接口的對象, 它就是遠程可的對象。這里, 信息發(fā)布效勞類可以為我們生成遠程可對象的實例:/ - - - - - - - - - InfoDistrib

14、uteService. java- - - - - - -package enterprise. distribute;import java.rmi.RemoteE*ception;import java.rmi.server.UnicastRemoteObject;public class InfoDistributeServicee*tends UnicastRemoteObject implements InfoDistributeRemotepublic InfoDistributeService() throws RemoteE*ceptionsuper();/ The retur

15、n value of the method only for testing.public String getRemoteInfo()return“Hello! I am a remote object.;信 息 發(fā) 布 服 務(wù) 類 類 實 現(xiàn) 遠 程 接 口 InfoDis-teObject。由于符合 InfoDistributeRemote 接口, 因此該類除構(gòu)造方法之外, 還應(yīng)有 getRemoteInfo( )方法,而且必須將該方法實現(xiàn)。同時我們注意到, getRemoteInfo( )方法拋出了java.rmi.RemoteE*ception 異常。由于遠程方法調(diào)用過程中, 要進展

16、很多的低級網(wǎng)絡(luò)操作, 因此網(wǎng)絡(luò)錯誤可能在調(diào)用過程中隨時發(fā)生, 這樣, 遠程接口中的每個方法( 盡管這里只有一個 getRemoteInfo( )方法) 都必須拋出 RemoteE*ception 異常, 而且, java.rmi.RemoteE*ception 都要在代碼中顯式處理, 即將所有 RMI 活動涉及的代碼都放在 try- catch 塊中。(3) 準備供遠程調(diào)用的效勞器對象這是一個作為效勞器使用的類, 它是相對于要遠程方法的客戶端而言的。它存儲著綁定的字符串和對象。將遠程對象設(shè)置成承受遠程調(diào)用就像啟動了偵聽 ServerSocket 對象的 socket 效勞器。事實上在使用 RM

17、I 時, TCP/IP 協(xié)議的傳輸方式, 在幕后發(fā)生了很多底層網(wǎng)絡(luò)操作, 但是此刻, 用戶不需要知道這些細節(jié), 只需要逐步導出遠程對象:在 Java 開發(fā)工具的較新版本 JDK 1.4 中, 可以選 擇 java.rmi.UnicastRemoteObject 或 者 java.rmi.Activation.Activatable。其中, 更多用到的是 Unicas-tRemoteObject, 因為它顧名思義, 就是在客戶機與服務(wù)器對象實例之間建立一對一連接。(4) 生成 Stub 和 Skeleton由 RMI 生成的調(diào)動與反調(diào)動的遠程調(diào)動代碼也和 Java 的其它代碼一樣, 都包含在后綴

18、是.class的文件中。運用 RMI 之后, 在客戶機上生成的調(diào)動參數(shù)和反調(diào)動返回值的代碼稱為殘根(Stub), 效勞器上生成的反調(diào)動參數(shù)和進展實際方法調(diào)用調(diào)動返回值的代碼稱為框架 (Skeleton)??梢允褂?RMI自帶的命令行工具 rmic( 即 RMI piler), 先掃描遠程對象的.class 文件, 隨之生成殘根與框架代碼。(5) 遠程客戶端: 這是一個幫助我們遠程方法提供幫助的類, 它是最終用戶。rmic 調(diào)用如下(在當前目錄):我們有了遠程接口和實現(xiàn), 就可以用 rmic 對類進展編譯, 生成 Stub 和 Skeleton, 在命令行窗口中使用以下代碼行:/ pile al

19、l java source filesjavac enterprisedistribute*.java/ make stub and skeleton code運行完畢后, 在當前目錄生成以下文件( 即調(diào)動代碼):InfoDistributeService_Stub.classInfoDistributeService_Skel.class(6) 用 rmiregistry 找到遠程對象導出效勞器方的對象之后, 就可以遠程,但客戶機還要設(shè)法與這些遠程對象取得聯(lián)系。由于分布式應(yīng)用程序可能涉及許多不同機器, 因此通信的所有機器對之間需要建立初始連接, 換句話說,就是要設(shè)法找到初始遠程對象, 這項工

20、作通過rmiregistry 命令執(zhí)行。JDK 開發(fā)工具提供了實用程序 RMI Registry, 用來維護文本名和遠程對象之間的映射, 可以進展遠程。在客戶機方, RMI 注冊表可以通過同一 java.rmi.Naming 類的 lookup()靜態(tài)方法用程序。例如, 遠程主機為 iServer, 遠程對象實例為 InfoDis-tributeService 實例, 遠程端口號為 5678, 則客戶機如果查找遠程主機 iServer 中的遠程 InfoDistribute-Service 實例, 則引用實例時須使用遠程接口 In-foDistributeRemote, 代碼如下:InfoDi

21、stributeRemote iServer=( InfoDistributeRemote)Naming.lookup “(rmi:/iServer:5678/InfoDistribute Ser-vice);在效勞器方, 導出的遠程對象可以通過 java.rmi.Naming 類在本地注冊 rmiregistry 的運行實例。例如, 用 rebind()方法將 iService 中的 InfoDistribute-Service 的實例與名稱 InfoDistributeService 相關(guān)聯(lián)。完畢語本文以分布式虛擬靶試系統(tǒng)為例, 著重介紹了基于 HLA 的分布式仿真系統(tǒng)開發(fā)的方法和思路,給

22、出了系統(tǒng)的總體分析、開發(fā)環(huán)境, 及聯(lián)邦成員的功能實現(xiàn), 并對本例中聯(lián)邦成員的同步問題進展了討論。本系統(tǒng)較原先基于 DIS 的仿真系統(tǒng), 具有靈活性好, 網(wǎng)絡(luò)數(shù)據(jù)冗余低、易擴展等優(yōu)點, 為該系統(tǒng)的功能進一步擴展創(chuàng)造了條件。參考文獻1 周彥, 戴劍偉. 仿真程序設(shè)計 M. : 電子工業(yè)出版社, 20022 穎. 基于 HLA 的水下戰(zhàn)仿真系統(tǒng)研究J. 系統(tǒng)仿真學報, 2004.123 皓. 基于 HLA 的魚雷武器系統(tǒng)分布交互仿真研究D.: 西北工業(yè)大學. 20034 馬立元. 基于 HLA 的分布式交互仿真技術(shù)及其應(yīng)用J.計算機工程, 2003吳曉潔 女, (1983- ) , 碩士研究生。研究

23、方向為計算機應(yīng)用技術(shù)。翟正軍 男, (1965- ) , 教授, 碩士生導師。研究方向為計算機應(yīng)用技術(shù)。InfoDistributeService iService=newInfoDistributeService( );Naming.rebind“(/ InfoDistributeService,iService);綜 上 所 述 , InfoDistributeRemote 是 個 Java 接口, 因此 iServer 實際上是實現(xiàn) InfoDistributeRemote接口的本地對象實例, 它不在遠程, 而是遠程 In-foDistributeService 的本地表示。也就是說,

24、它是由前述 rmic 工具自動生成的殘根碼 InfoDistributeSer-vice_Stub.class 的本地實例。客戶機實現(xiàn)通過 iServer 變量維護遠程對象的調(diào)用。事實上, iServer 引用變量是實現(xiàn) InfoDistribute接口的對象的本地引用, 該對象是 InfoDistribute-Service 殘根實現(xiàn)。這個殘根和效勞器方的框架一起通過 InfoDistributeRemote 接口調(diào)動/反調(diào)動所有遠程調(diào)用。當我們把 InfoDistributeService 看成是實現(xiàn) In-foDistributeRemote 接口的本地實例的時候, 殘根代碼只在幕后進展

25、工作, 而實現(xiàn)這一切則變得非常透明。由上述原理, 可以進一步設(shè)計完善客戶機和服務(wù)器代碼, 進而編寫出完整的應(yīng)用程序。(7) 運行測試 RMI 分布式應(yīng)用在確認已經(jīng)設(shè)計好必須的幾大類模塊后, 我們開場按以下步驟, 運行并測試該信息發(fā)布系統(tǒng)的基本功能 ( 即僅僅實現(xiàn)遠程接口中聲明的 getRemote-Info( )方法)。在前面定義的包 enterprise.distribute 中, 執(zhí)行javac 命令編譯后綴為.java 的源文件。javac enter-prise/distribute/*.java接著, 用 RMIC 工具生成殘根與框架。編譯之后, 需要確定客戶機與效勞器發(fā)行版本的容。因此, 需用 jar 命令, 將客戶機與效勞器發(fā)行版本包裝成 .jar 文件。 其中, 包裝效勞器的文件命令如下:jar cvf InfoDistributeService.jarenterprisedistributeIn

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論