JavaRMI
JavaRMI
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客戶使用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
import java.rmi.*;
public class HelloClient {
// 在伺服器端設置安全機制
String host = "localhost:1099";
if (args.length > 0)
host = args[0];
try {
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