Java RMI 指的是遠程方法調用 (Remote Method Invocation)。它是一種機制,能夠讓在某個 Java 虛擬機上的對象調用另一個 Java 虛擬機中的對象上的方法
Java RMI概念
在Java中,只要一個類繼承了java.rmi.Remote接口,即可成爲存在於服務器端的遠程對象,供客戶端訪問並提供一定的服務。JavaDoc描述:Remote 接口用於標識其方法可以從非本地虛擬機上調用的接口。任何遠程對象都必須直接或間接實現此接口。只有在“遠程接口”(擴展 java.rmi.Remote 的接口)中指定的這些方法纔可遠程使用。
編寫一個RMI的步驟
- 定義一個遠程接口,此接口需要繼承Remote
- 開發遠程接口的實現類
- 創建一個server並把遠程對象註冊到端口
- 創建一個client查找遠程對象,調用遠程方法
那就先從HelloWorld開始,先看下代碼結構
- 服務端
- 客戶端
客戶端與服務端在兩個不同的工程,用於模擬兩個JVM,有條件的可以試試位於兩臺不同電腦。這兩個工程都是maven工程,方便jar包管理。
接下來上代碼;
服務端:
遠程調用的接口類與實現類
public interface RemoteHelloWord extends Remote{
String sayHello() throws RemoteException;
}
public class RemoteHelloWordImpl implements RemoteHelloWord{
@Override
public String sayHello() throws RemoteException {
// TODO Auto-generated method stub
return "Hello World";
}
}
服務發佈類 導出遠程對象,並註冊遠程對象到指定端口。
public class RMIServer {
public static void main(String[] args) {
try {
RemoteHelloWord hello=new RemoteHelloWordImpl();
RemoteHelloWord stub=(RemoteHelloWord)UnicastRemoteObject.exportObject(hello, 9999);
LocateRegistry.createRegistry(1099);
Registry registry=LocateRegistry.getRegistry();
registry.bind("helloword", stub);
System.out.println("綁定成功!");
} catch (RemoteException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}
客戶端調用類 獲取遠程對象並調用
public class RMIClient {
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("localhost");
RemoteHelloWord hello = (RemoteHelloWord) registry.lookup("helloword");
String ret = hello.sayHello();
System.out.println(ret);
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
執行程序,遠程調用成功
代碼就貼到這邊了,這裏只是簡單介紹RMI的使用,更多rmi請網上查詢資料
下面分析下RMI的優劣勢
優勢:這種機制給分佈計算的系統設計、編程都帶來了極大的方便。只要按照RMI規則設計程序,可以不必再過問在RMI之下的網絡細節了,如:TCP和Socket等等。任意兩臺計算機之間的通訊完全由RMI負責。調用遠程計算機上的對象就像本地對象一樣方便。
- 面向對象: RMI可將完整的對象作爲參數和返回值進行傳遞,而不僅僅是預定義的數據類型。也就是說,可以將類似Java Hash表這樣的複雜類型作爲一個參數進行傳遞。
- 安全性: RMI使用Java內置的安全機制保證下載執行程序時用戶系統的安全。RMI使用專門爲保護系統免遭惡意小程序侵害而設計的安全管理程序。
- 跨平臺:RMI可將屬性從客戶機移動到服務器,或者從服務器移動到客戶機。
缺點:
- 只支持JAVA語言,不支持不同開發語言系統間的遠程調用。
- RMI對服務器的IP地址和端口依賴很緊密,但是在開發的時候不知道將來的服務器IP和端口如何,但是客戶端程序依賴這個IP和端口。這也是RMI的侷限性之一。這個問題有兩種解決途徑:一是通過DNS來解決,二是通過封裝將IP暴露到程序代碼之外。