JavaRMI

JavaRMI

RMI(Remote Method Invocation,遠程方法調用)是用Java在JDK1.2中實現的,它大大增強了Java開發分散式套用的能力。Java作為一種風靡一時的網路開發語言,其巨大的威力就體現在它強大的開發分散式網路套用的能力上,而RMI就是開發百分之百純Java的網路分散式套用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC並不能很好地套用於分散式對象系統。而Java RMI 則支持存儲於不同地址空間的程式級對象之間彼此進行通信,實現遠程對象之間的無縫遠程調用。

定義

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

相關詞條

熱門詞條

聯絡我們