複製鏈接
請複製以下鏈接發送給好友

JavaRMI

鎖定
RMI(Remote Method Invocation,遠程方法調用)是用Java在JDK1.2中實現的,它大大增強了Java開發分佈式應用的能力。Java作為一種風靡一時的網絡開發語言,其巨大的威力就體現在它強大的開發分佈式網絡應用的能力上,而RMI就是開發百分之百純Java的網絡分佈式應用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC並不能很好地應用於分佈式對象系統。而Java RMI 則支持存儲於不同地址空間的程序級對象之間彼此進行通信,實現遠程對象之間的無縫遠程調用。
外文名
JavaRMI
運行平台
使用Java遠程消息交換協議JRMP
優    勢
用Java 編寫的組件的連接
計算途徑
RMI為採用Java對象的分佈式計算
性能優越
允許您使用Java編寫分佈式對象
連接方便
用Java本機方法接口JNI與現

JavaRMI定義

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

JavaRMI工作方式

JavaRMI運行平台

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的優點以及如何將其連接到現有的和原有的系統中,以及與。

JavaRMI計算途徑

提供了簡單而直接的途徑。這些對象可以是新的Java對象,也可以是圍繞現有API的簡單的Java包裝程序。Java體現了“編寫一次就能在任何地方運行的模式。而RMI可將Java模式進行擴展,使之可在任何地方運行”。
因為RMI是以Java為核心的,所以,它將Java的安全性和可移植性等強大功能帶給了分佈式計算。您可將代理和業務邏輯等屬性移動到網絡中最合適的地方。如果您要擴展Java在系統中的使用,RMI將使您充分利用其強大功能。
RMI還可利用標準JDBC包與現有的關係數據庫連接。RMI/JNI和RMI/JDBC相結合,可幫助您利用RMI與目前使用非Java語言的現有服務器進行通信,而且在您需要時可擴展Java在這些服務器上的使用。RMI可幫助您在擴展使用時充分利用Java的強大功能。

JavaRMIRMI客户機類

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);
}
}

JavaRMI編譯代碼與運行系統

在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