遠程方法調用
遠程方法調用
遠程方法調用(Remote Method Invocation,RMI)是用Java在JDK1.1中實現的,它大大增強了Java開發分散式應用的能力。Java作為一種風靡一時的網路開發語言,其巨大的威力就體現在它強大的開發分散式網路應用的能力上,而RMI就是開發百分之百純Java的網路分散式應用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC並不能很好地應用於分散式對象系統。而Java RMI 則支持存儲於不同地址空間的程序級對象之間彼此進行通信,實現遠程對象之間的無縫遠程調用。
程消息交換協議( Protocol)進行通信。JRMP是專為Java的遠程對象制定的協議。因此,Java RMI具有Java的"Write Once,Run Anywhere"的優點,是分散式應用系統的百分之百純Java解決方案。用Java RMI開發的應用系統可以部署在任何支持JRE(Java Run Environment Java,運行環境)的平台上。但由於JRMP是專為Java對象制定的,因此,RMI對於用非Java語言開發的應用系統的支持不足。不能與用非Java語言書寫的對象進行通信。
( -- 程調)允您編布式。介紹優及連系統,及 編組件連。
采布式計算提供簡單途徑。,圍繞API的簡單的Java包裝程序。Java體現了“編寫一次就能在任何地方運行的模式。而RMI可將Java模式進行擴展,使之可在任何地方運行”。
因為RMI是以Java為核心的,所以,它將Java的安全性和可移植性等強大功能帶給了分散式計算。您可將代理和梢?務邏輯等屬性移動到網路中最合適的地方。如果您要擴展Java在系統中的使用,RMI將使您充分利用其強大功能。
RMI可利用標準Java本機方法介面JNI與現有的和原有的系統相連接。RMI還可利用標準JDBC包與現有的關係資料庫連接。RMI/JNI和RMI/JDBC相結合,可幫助您利用RMI與目前使用非Java語言的現有伺服器進行通信,而且在您需要時可擴展Java在這些伺服器上的使用。RMI可幫助您在擴展使用時充分利用Java的強大功能。
一、RMI(遠程方法調用)的組成
一個正常工作的RMI系統由下面幾個部分組成:
·遠程服務的介面定義 ·遠程服務介面的具體實現 ·樁(Stub)和框架(Skeleton)文件 ·一個運行遠程服務的伺服器 ·一個RMI命名服務,它允許客戶端去發現這個遠程服務 ·類文件的提供者(一個HTTP或者FTP伺服器) ·一個需要這個遠程服務的客戶端程序
二、RMI(遠程方法調用)的工作原理
RMI系統結構,在客戶端和伺服器端都有幾層結構。
rmi結構圖
方法調用從客戶對象經佔位程序(Stub)、遠程引用層(Remote Reference Layer)和傳輸層(Transport Layer)向下,傳遞給主機,然後再次經傳 輸層,向上穿過遠程調用層和骨幹網(Skeleton),到達伺服器對象。佔位程序扮演著遠程伺服器對象的代理的角色,使該對象可被客戶激活。遠程引用層處理語義、管理單一或多重對象的通信,決定調用是應發往一個伺服器還是多個。傳輸層管理實際的連接,並且追追蹤可以接受方法調用的遠程對象。伺服器端的骨幹網完成對伺服器對象實際的方法調用,並獲取返回值。返回值向下經遠程引用層、伺服器端的傳輸層傳遞迴客戶端,再向上經傳輸層和遠程調用層返回。最後,佔位程序獲得返回值。
要完成以上步驟需要有以下幾個步驟:
1、生成一個遠程介面 2、實現遠程對象(伺服器端程序) 3、生成佔位程序和骨幹網(伺服器端程序) 4、編寫伺服器程序 5、編寫客戶程序 6、註冊遠程對象 7、啟動遠程對象
具體實現如下:
1、生成一個遠程介面 package c15.ptime; import java.rmi.*;
public interface PerfectTimeI extends Remote { long getPerfectTime() throws RemoteException; }
2、實現遠程對象(伺服器端程序) package c15.ptime; import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; import java.net.*;
public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI { public long getPerfectTime() throws RemoteException { return System.currentTimeMillis(); }
public PerfectTime() throws RemoteException { super(); }
public static void main(String[] args) { System.setSecurityManager( new RMISecurityManager()); try { PerfectTime pt = new PerfectTime(); Naming.rebind( "//zhouty:2005/PerfectTime" , pt); System.out.println("Ready to do time"); } catch(Exception e) { e.printStackTrace(); } } }
4、編譯遠程對象(伺服器端程序) javac -classpath . -d . PerfectTime.java
5、生成根和干(佔位程序和骨幹程序) rmic -classpath . -d . c15.ptime.PerfectTime
6、註冊遠程對象 start rmiregistry 2005
7、啟動伺服器端程序 java -Djava.rmi.server.codebase=file:///d:/TestRMI/ c15.ptime.Per fectTime
8、編寫客戶端程序 package c15.ptime; import java.rmi.*; import java.rmi.registry.*;
public class DisplayPerfectTime { public static void main(String[] args) { System.setSecurityManager( new RMISecurityManager()); try { PerfectTimeI t = (PerfectTimeI)Naming.lookup( "192.168.0.171:2005/PerfectTime"); for(int i = 0 ; i < 10; i++) System.out.println("Perfect time =" + t.getPerfectTime()); } catch(Exception e) { e.printStackTrace(); } } }
9、編譯客端程序 javac -classpath . -d . DisplayPerfectTime.java
10、修改JVM的配置文件(客戶機和伺服器的都需要經過修改) %JRE_HOME%policytool.exe
11、啟動客戶程序 java -classpath . c15.ptime.DisplayPerfectTime
12、返回結果
Perfect time =967274884390 Perfect time =967274884450 Perfect time =967274884450 Perfect time =967274884450 Perfect time =967274884500 Perfect time =967274884500 Perfect time =967274884560 Perfect time =967274884610 Perfect time =967274884610 Perfect time =967274884610
三、RMI(遠程方法調用)的優點
從最基本的角度看,RMI是Java的遠程過程調用(RPC)機制。與傳統的RPC系統相比,RMI具有若干優點,因為它是Java面向對象方法的一部分。傳統的RPC系統採用中性語言,所以是最普通的系統--它們不能提供所有可能的目標平台所具有的功能。
RMI以Java為核心,可與採用本機方法與現有系統相連接。這就是說,RMI可採用自然、直接和功能全面的方式為您提供分散式計算技術,而這種技術可幫助您以不斷遞增和無縫的方式為整個系統添加Java功能。
RMI的主要優點如下:
面向對象:RMI可將完整的對象作為參數和返回值進行傳遞,而不僅僅是預定義的數據類型。也就是說,您可以將類似Java哈希表這樣的複雜類型作為一個參數進行傳遞。而在目前的RPC系統中,您只能依靠客戶機將此類對象分解成基本數據類型,然後傳遞這些數據類型,最後在伺服器端重新創建哈希表。RMI則不需額外的客戶程序代碼(將對象分解成基本數據類型),直接跨網傳遞對象。
可移動屬性:RMI可將屬性(類實現程序)從客戶機移動到伺服器,或者從伺服器移到客戶機。例如,您可以定義一個檢查僱員開支報告的介面,以便察看僱員是 袷亓斯灸殼笆敵械惱摺T誑Пǜ媧唇ê螅突Щ突崬臃衿鞫嘶竦檬迪指媒涌詰畝韻蟆H綣叻⑸浠衿鞫司突崢擠禱厥褂昧誦掄叩母媒涌詰牧硪桓鍪迪殖絛頡D槐卦謨沒低成習滄叭魏渦碌娜砑湍茉誑突Ф思觳橄拗鋪跫?--從而向用戶提供爍?快的反饋,並降低伺服器的工作量。這樣就能具備最大的靈活性,因為政策改變時只需要您編寫一個新的Java類,並將其在伺服器主機上安裝一次即可。
設計方式:對象傳遞功能使您可以在分散式計算中充分利用面向對象技術的強大功能,如二層和三層結構系統。如果您能夠傳遞屬性,那麼您就可以在您的解決方案中使用面向對象的設計方式。所有面向對象的設計方式無不依靠不同的屬性來發揮功能,如果不能傳遞完整的對象--包括實現和類型--就會失去設計方式上所提供的優點。
安 全:RMI使用Java內置的安全機制保證下載執行程序時用戶系統的安全。RMI使用專門為保護系統免遭惡意小應用程序侵害而設計的安全管理程序,可保護您的系統和網路免遭潛在的惡意下載程序的破壞。在情況嚴重時,伺服器可拒絕下載任何執行程序。
便於編寫和使用:RMI使得Java遠程服務程序和訪問這些服務程序的Java客戶程序的編寫工作變得輕鬆、簡單。遠程介面實際上就是Java介面。服務程序大約用三行指令宣布本身是服務程序,其它方面則與任何其它Java對象類似。這種簡單方法便於快速編寫完整的分散式對象系統的服務程序,並快速地製做軟體的原型和早期版本,以便於進行測試和評估。因為RMI程序編寫簡單,所以維護也簡單。
可連接現有/原有的系統:RMI可通過Java的本機方法介面JNI與現有系統進行進行交互。利用RMI和JNI,您就能用Java語言編寫客戶端程序,還能使用現有的伺服器端程序。在使用RMI/JNI與現有伺服器連接時,您可以有選擇地用Java重新編寫服務程序的任何部分,並使新的程序充分發揮Java的功能。類似地,RMI可利用JDBC、在不修改使用資料庫的現有非Java源代碼的前提下與現有關係資料庫進行交互。
編寫一次,到處運行:RMI是Java“編寫一次,到處運行”方法的一部分。任何基於RMI的系統均可100%地移植到任何Java虛擬機上,RMI/JDBC系統也不例外。如果使用RMI/JNI與現有系統進行交互工作,則採用JNI編寫的代碼可與任何Java虛擬機進行編譯、運行。
分散式垃圾收集:RMI採用其分散式垃圾收集功能收集不再被網路中任何客戶程序所引用的遠程服務對象。與Java 虛擬機內部的垃圾收集類似,分散式垃圾收集功能允許用戶根據自己的需要定義伺服器對象,並且明確這些對象在不再被客戶機引用時會被刪除。
并行計算:RMI採用多線程處理方法,可使您的伺服器利用這些Java線程更好地并行處理客戶端的請求。Java分散式計算解決方案:RMI從JDK 1.1開始就是Java平台的核心部分,因此,它存在於任何一台1.1 Java虛擬機中。所有RMI系統均採用相同的公開協議,所以,所有Java 系統均可直接相互對話,而不必事先對協議進行轉換。
四、RMI與CORBA的關係
RMI 和 CORBA 常被視為相互競爭的技術,因為兩者都提供對遠程分散式對象的透明訪問。但這兩種技術實際上是相互補充的,一者的長處正好可以彌補另一者的短處。RMI 和 CORBA 的結合產生了 RMI-IIOP,RMI-IIOP 是企業伺服器端 Java 開發的基礎。
1997 年,IBM 和 Sun Microsystems啟動了一項旨在促進 Java 作為企業開發技術的發展的合作計劃。兩家公司特別著力於如何將 Java 用作伺服器端語言,生成可以結合進現有體系結構的企業級代碼。所需要的就是一種遠程傳輸技術,它兼有 Java 的 RMI(Remote Method Invocation,遠程方法調用)較少的資源佔用量和更成熟的 CORBA(Common Object Request Broker Architecture,公共對象請求代理體系結構)技術的健壯性。出於這一需要,RMI-IIOP問世了,它幫助將 Java 語言推向了目前伺服器端企業開發的主流語言的領先地位。 (來源:sun;matrix.org.cn)
RMI被實現為三層:
• 客戶與伺服器關係客戶端的一個存根程序和伺服器端的一個對應的綱要。存根把調用程序表現成被一個服務調用的程序。(SUN把代理作為存根的一個同義字)。
• 一個能夠根據調用程序傳遞的參數以不同方式運轉的遠程引用層。舉例來說,這層能決定在一個多點傳送中請求是否是呼叫一個單一遠程服務或多個遠程程序。建立和處理請求的傳輸連接層。
• 一個單一請求在一台算機上的層之間向下傳播,在另一端的計算機的層之間向上傳播。
RMI被提供作為太陽微系統公司的Java開發工具包(JDK)的一部份。