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

Java RMI 遠程方法調用入門:從接口定義到客戶端調用完整實例

     編輯:Java 綜合教學

Java RMI 遠程方法調用入門完整實例

RMI (Remote Method Invocation) 是 Java 核心 API,允許運行在不同 JVM(甚至不同物理機)上的對象互相調用方法。本文通過一個文件狀態查詢示例,演示 RMI 服務端註冊與客戶端調用全流程。

核心組件

  1. 遠程接口:繼承 java.rmi.Remote,方法拋出 RemoteException。
  2. 遠程對象實現:繼承 UnicastRemoteObject 實現接口。
  3. 服務端啟動類:創建 Registry、綁定遠程對象。
  4. 客戶端調用類:通過 Naming.lookup 獲取代理調用。

1. 定義遠程接口

package com.tc.remote;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RMIQueryStatus extends Remote {
    RMIFileStatus getFileStatus(String filename) throws RemoteException;
}

2. 定義傳輸數據對象(需實現 Serializable)

package com.tc.remote;
import java.io.Serializable;

public class RMIFileStatus implements Serializable {
    private String filename;
    // 構造器、getter、toString 省略
}

3. 實現遠程接口

package com.tc.remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class RMIQueryStatusImpl extends UnicastRemoteObject implements RMIQueryStatus {
    public RMIQueryStatusImpl() throws RemoteException { }
    @Override
    public RMIFileStatus getFileStatus(String filename) throws RemoteException {
        return new RMIFileStatus(filename);
    }
}

4. 服務端啟動並註冊

package com.tc.remote;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class RMIQueryStatusServer {
    public static final String RMI_URL = "rmi://localhost:8888/RHello";
    public static void main(String[] args) {
        try {
            RMIQueryStatusImpl impl = new RMIQueryStatusImpl();
            LocateRegistry.createRegistry(8888); // 創建註冊表
            Naming.rebind(RMI_URL, impl);        // 綁定(rebind 覆蓋模式)
            System.out.println(">>> RMI 服務啟動成功!");
        } catch (Exception e) { e.printStackTrace(); }
    }
}

5. 客戶端調用

package com.tc.remote;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class RMIQueryStatusClient {
    public static void main(String[] args) {
        try {
            RMIQueryStatus stub = (RMIQueryStatus) Naming.lookup(RMIQueryStatusServer.RMI_URL);
            RMIFileStatus status = stub.getFileStatus("爆炸");
            System.out.println("遠程調用結果:" + status);
        } catch (Exception e) { e.printStackTrace(); }
    }
}

6. 運行步驟與驗證

  1. 先啟動 RMIQueryStatusServer main 方法,控制台輸出啟動成功。
  2. 再啟動 RMIQueryStatusClient,輸出遠程返回對象信息。

服務端運行截圖 客戶端調用截圖

7. 關鍵注意點

  • 防火牆/網絡:確保 8888 端口可通,跨機器需配置 java.rmi.server.hostname。
  • 序列化版本:傳輸對象建議顯式聲明 serialVersionUID。
  • 安全管理器:舊版本需配置 java.security.policy,JDK 8+ 通常無需額外配置。
  • URL 耦合:客戶端硬編碼服務端 URL,生產環境建議引入註冊中心(如 Zookeeper、Nacos)解耦。

參考資源

Oracle 官方 RMI 指南:RMI Documentation

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