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

Java RMI 遠程方法調用:從原理到實戰完整指南

     編輯:Java 程式設計入門

RMI 核心概念

RMI (Remote Method Invocation) 將面向對象思想延伸至分佈式環境:調用對象可在本機,亦可在遠程主機。

  • 客戶/服務器:發起調用為客戶對象,被調用為服務器對象
  • 服務器程序:創建服務器對象、註冊命名,供客戶查找
  • 遠程接口:定義服務器可執行的方法,客戶端必須可見
  • 客戶存根:代理服務器對象,處理請求編碼/傳輸/解碼,對程序員透明

開發步驟實戰

1. 定義遠程接口

import java.rmi.*;

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

關鍵規則:

  1. 繼承 java.rmi.Remote
  2. 所有方法拋出 RemoteException(網絡不可靠性)

2. 實現服務器對象

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

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

    public ProductImpl(String name) throws RemoteException {
        this.desc = name;
    }

    public String getDescription() throws RemoteException {
        return "This is " + desc + " product";
    }
}

繼承 UnicastRemoteObject 即可獲得 RMI 服務器能力,業務邏輯與本地對象無異。

3. 編寫服務器啟動程序

import java.rmi.*;

public class ProductServer {
    public static void main(String[] args) {
        try {
            System.out.println("Constructing server implementations...");
            ProductImpl p1 = new ProductImpl("toaster");
            ProductImpl p2 = new ProductImpl("microwave");

            System.out.println("Binding to registry...");
            Naming.rebind("toaster", p1);
            Naming.rebind("microwave", p2);

            System.out.println("Waiting for clients...");
        } catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }
}

Naming.rebind() 將對象綁定至 RMI 註冊表,客戶端通過名稱查找。

關鍵技術細節

  • Stub 生成:無需手寫,使用 rmic 工具自動生成(rmic ProductImpl)
  • 註冊表啟動:服務器啟動前需運行 rmiregistry(默認端口 1099)
  • 安全策略:客戶端/服務器需適當的 java.security.policy 文件授予權限
  • 序列化:參數/返回值必須實現 Serializable

完整部署清單

  1. 編譯所有 Java 文件
  2. 運行 rmic 生成 Stub/Skeleton
  3. 啟動 rmiregistry
  4. 啟動服務器程序 (ProductServer)
  5. 運行客戶端程序(通過 Naming.lookup() 獲取遠程引用)

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