定義
RMI(Remote Method Invocation,遠程方法調用)是用Java在JDK1.2中實現的,它大大增強了Java開發分散式套用的能力。Java作為一種風靡一時的網路開發語言,其巨大的威力就體現在它強大的開發分散式網路套用的能力上,而RMI就是開發百分之百純Java的網路分散式套用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC並不能很好地套用於分散式對象系統。而Java RMI 則支持存儲於不同地址空間的程式級對象之間彼此進行通信,實現遠程對象之間的無縫遠程調用。
工作方式
運行平台
RMI目前(Java Remote Messaging Protocol)進行通信。JRMP是專為Java的遠程對象制定的協定。因此,Java RMI具有Java的"Write Once,Run Anywhere"的優點,是分散式套用系統的百分之百純Java解決方案。用Java RMI開發的套用系統可以部署在任何支持JRE(Java Run Environment Java,運行環境)的平台上。但由於JRMP是專為Java對象制定的,因此,RMI對於用非Java語言開發的套用系統的支持不足。不能與用非Java語言書寫的對象進行通信。
Java Remote Method Invocation (RMI -- Java遠程方法調用)。下面將介紹RMI的優點以及如何將其連線到現有的和原有的系統中,以及與。
計算途徑
提供了簡單而直接的途徑。這些對象可以是新的Java對象,也可以是圍繞現有API的簡單的Java包裝程式。Java體現了“編寫一次就能在任何地方運行的模式。而RMI可將Java模式進行擴展,使之可在任何地方運行”。
因為RMI是以Java為核心的,所以,它將Java的安全性和可移植性等強大功能帶給了分散式計算。您可將代理和業務邏輯等屬性移動到網路中最合適的地方。如果您要擴展Java在系統中的使用,RMI將使您充分利用其強大功能。
RMI可利。RMI還可利用標準JDBC包與現有的關係資料庫連線。RMI/JNI和RMI/JDBC相結合,可幫助您利用RMI與目前使用非Java語言的現有伺服器進行通信,而且在您需要時可擴展Java在這些伺服器上的使用。RMI可幫助您在擴展使用時充分利用Java的強大功能。
RMI客戶機類
RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠程主機上查找RMI服務對象,若找到就把它轉換成本地接口RMIOperate類型。它與CORBA不同之處在於RMI客戶機必須知道提供RMI服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略連線埠號,就默認使用1099。
Java.rmi.Naming.lookup()方法可能產生三個異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、 MalformedURLException,異常都需要捕獲。
HelloClient.java
/*
* @author javamxj (CSDN Blog) 創建日期 2004-12-27
*/
import java.rmi.*;
public class HelloClient {
public static void main(String[] args) {
// 在伺服器端設定安全機制
/*
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
*/
/* 默認為本地主機和默認連線埠 */
String host = "localhost:1099";
/* 帶輸入參數時,將host設定為指定主機 */
if (args.length > 0)
host = args[0];
try {
/* 根據指定的URL定位遠程實現對象 */
/* “h”是一個標識符,我們將用它指向實現“Hello”接口的遠程對象 */
Hello h = (Hello) Naming.lookup("rmi://" + host + "/HelloService");
System.out.println("實現“Hello”接口的遠程對象: " + h);
System.out.println("我在客戶端,開始調用RMI伺服器端的'sayHello'方法");
System.out.println("歡迎, " + h.sayHello("javamxj blog"));
} catch (Exception ex) {
System.out.println("錯誤 " + ex);
}
}
編譯代碼與運行系統
在MS-DOS環境下,創建一個D:\RMISample目錄,把上面4個檔案複製到這個目錄下,然後在此目錄下新建兩個資料夾:client和server(把它們分別看作是客戶端與服務端)。
(1).編譯所有的原始碼
D:\RMISample> javac ja(2).生成客戶端存根和伺服器框架
D:\RMISample> rmic HelloImpl
這將生成HelloImpl_Stub.class和HelloImpl_Skel.class。
( 註:如果需要查看這兩個類的原始碼,可以使用“ rmic -keep HelloImpl”語句)
(3).把Hello.class、HelloClient.class、HelloImpl_Stub.class複製到client目錄;
把Hello.class、HelloServer.class、HelloImpl_Skel.class、HelloImpl_Stub.class 複製到server目錄。
(4).啟動RMI註冊
D:\RMISample\server>rmiregistry
(註: 我是在命令控制台下運行這個系統的,必須開啟三個控制台視窗,一個運行RMIRegistry,一個運行伺服器,還有一個運行客戶端。)
(5).運行和調用
● 在伺服器上執行HelloServer
D:\RMISample\server>java HelloServer
● 在本地客戶機上運行HelloClient
D:\RMISample\client>java HelloClient
● 在遠程客戶機上運行HelloClient(須指明RMI伺服器主機名或IP位址)
java HelloClient 222.222.34.34
運行rmiregistry和server後的結果:
再運行Client後的結果:
還有一點要注意,在上面的例子中我注釋了安全管理的代碼,如果把注釋去掉,那么需要建立一個安全策略檔案,比如其檔案名稱為 policy.txt,內容如下:
grant {
permission java.security.AllPermission "", "";
};
這是一條簡單的安全策略,它允許任何人做任何事,對於你的更加關鍵性的套用,你必須指定更加詳細安全策略。把這個檔案複製到Client和Server目錄,然後如下運行:
D:\RMISample\server>java -Djava.security.policy=policy.txt HelloServer
D:\RMISample\client>java -Djava.security.policy=policy.txt HelloClient