首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java RMI 遠程方法調用完整入門:從介面定義到跨機器部署

     編輯:Java 相關知識

RMI (Remote Method Invocation) 讓 Java 物件能透過網路無縫調用遠端 JVM 中的物件方法,如同本地調用般自然。本文完整示範從遠程介面定義、伺服端實作、Stub/Skeleton 生成、註冊服務、客戶端查找調用,到安全策略與 HTTP 代碼下載的完整部署流程。

一、核心概念與角色

  • 遠程介面:繼承 java.rmi.Remote,定義可遠程調用的方法,所有方法必須拋出 RemoteException
  • 遠程物件實作:繼承 UnicastRemoteObject 實作遠程介面
  • 伺服端程式:建立遠程物件實例,綁定至 RMI Registry (命名服務)
  • 客戶端 Stub:客戶端的本地代理,負責參數編碼 (Marshalling)、網路傳輸、結果解碼 (Unmarshalling)
  • RMI Registry:命名服務,預設埠 1099,提供 bind/lookup/rebind 操作

二、逐步實作範例

1. 定義遠程介面


import java.rmi.*;

public interface Product extends Remote {
    String getDescription() throws RemoteException;
}

2. 實作遠程物件


import java.rmi.*;
import java.rmi.server.*;

public class ProductImpl extends UnicastRemoteObject implements Product {
    private String description;

    public ProductImpl(String name) throws RemoteException {
        this.description = "This is " + name + " product";
    }

    public String getDescription() throws RemoteException {
        return description;
    }
}

3. 編寫伺服端啟動程式


import java.rmi.*;

public class ProductServer {
    public static void main(String[] args) {
        try {
            ProductImpl toaster = new ProductImpl("toaster");
            ProductImpl microwave = new ProductImpl("microwave");

            Naming.rebind("toaster", toaster);
            Naming.rebind("microwave", microwave);

            System.out.println("Server ready, waiting for clients...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 編寫客戶端程式


import java.rmi.*;

public class ProductClient {
    public static void main(String[] args) {
        System.setSecurityManager(new RMISecurityManager());
        String url = "rmi://91.1.1.119:1099/"; // 伺服器 IP:Port

        try {
            Product toaster = (Product) Naming.lookup(url + "toaster");
            Product microwave = (Product) Naming.lookup(url + "microwave");

            System.out.println(toaster.getDescription());
            System.out.println(microwave.getDescription());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、編譯、生成 Stub 與部署步驟

  1. 編譯所有類別:javac *.java
  2. 生成 Stub:rmic ProductImpl → 產生 ProductImpl_Stub.class
  3. 啟動 RMI Registry:rmiregistry (需在類別路徑可見處執行)
  4. 啟動 HTTP 服務:提供介面類與 Stub 類下載 (如 https://server/download/)
  5. 啟動伺服端:
    start java -Djava.rmi.server.codebase=https://91.1.1.119/download/ ProductServer
    
    codebase 指定客戶端下載 Stub 的 HTTP 路徑
  6. 配置客戶端安全策略 (client.policy):
    
    grant {
        permission java.net.SocketPermission "91.1.1.119:1024-65535", "connect";
        permission java.net.SocketPermission "91.1.1.119:80", "connect";
    };
    
  7. 啟動客戶端:
    
    start java -Djava.security.policy=client.policy ProductClient
    

四、關鍵技術細節

  • 序列化要求:遠程方法參數/回傳值必須實作 Serializable (或為基本類型/遠程介面)
  • Stub 下載機制:客戶端首次查找時,若本地無 Stub 類,從 codebase URL 下載
  • 安全管理器:客戶端必須安裝 RMISecurityManager 並授權網路連線權限
  • 防火牆/NAT:RMI 使用動態埠,穿透防火牆需額外配置 (如固定埠、SOCKS 代理)

五、RMI 的限制與替代方案

限制:純 Java 環境,異構語言互通需使用 CORBA (IIOP) 或 Web Services (SOAP/REST)。RMI-IIOP 結合了 RMI 程式模型與 CORBA 互通性,是遷移過渡的選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved