JAVA RMI使用

Java RMI 指的是遠程方法調用 (Remote Method Invocation)。它是一種機制,能夠讓在某個 Java 虛擬機上的對象調用另一個 Java 虛擬機中的對象上的方法

Java RMI概念

在Java中,只要一個類繼承了java.rmi.Remote接口,即可成爲存在於服務器端的遠程對象,供客戶端訪問並提供一定的服務。JavaDoc描述:Remote 接口用於標識其方法可以從非本地虛擬機上調用的接口。任何遠程對象都必須直接或間接實現此接口。只有在“遠程接口”(擴展 java.rmi.Remote 的接口)中指定的這些方法纔可遠程使用。

編寫一個RMI的步驟

  1. 定義一個遠程接口,此接口需要繼承Remote
  2. 開發遠程接口的實現類
  3. 創建一個server並把遠程對象註冊到端口
  4. 創建一個client查找遠程對象,調用遠程方法

那就先從HelloWorld開始,先看下代碼結構

  1. 服務端
    這裏寫圖片描述
  2. 客戶端
    這裏寫圖片描述
    客戶端與服務端在兩個不同的工程,用於模擬兩個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負責。調用遠程計算機上的對象就像本地對象一樣方便。

  1. 面向對象: RMI可將完整的對象作爲參數和返回值進行傳遞,而不僅僅是預定義的數據類型。也就是說,可以將類似Java Hash表這樣的複雜類型作爲一個參數進行傳遞。
  2. 安全性: RMI使用Java內置的安全機制保證下載執行程序時用戶系統的安全。RMI使用專門爲保護系統免遭惡意小程序侵害而設計的安全管理程序。
  3. 跨平臺:RMI可將屬性從客戶機移動到服務器,或者從服務器移動到客戶機。

缺點:

  1. 只支持JAVA語言,不支持不同開發語言系統間的遠程調用。
  2. RMI對服務器的IP地址和端口依賴很緊密,但是在開發的時候不知道將來的服務器IP和端口如何,但是客戶端程序依賴這個IP和端口。這也是RMI的侷限性之一。這個問題有兩種解決途徑:一是通過DNS來解決,二是通過封裝將IP暴露到程序代碼之外。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章