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

RMI 實戰入門:基於 Thinking in Java 的完整時間服務示例

     編輯:J2EE

示例架構

四個文件構成極簡 RMI 服務:

  1. PerfectTimeI.java — 遠程接口
  2. PerfectTime.java — 服務端實現
  3. DisplayPerfectTime.java — 客戶端調用
  4. registerit.policy — 安全策略文件

完整源碼

PerfectTimeI.java (Remote Interface)

import java.rmi.*;

public interface PerfectTimeI extends Remote {
    long getPerfectTime() throws RemoteException;
}

PerfectTime.java (Server Implementation)

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;

public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {
    public long getPerfectTime() throws RemoteException {
        return System.currentTimeMillis();
    }

    public PerfectTime() throws RemoteException {
        super(); // 必須拋出 RemoteException
    }

    public static void main(String[] args) throws Exception {
        PerfectTime pt = new PerfectTime();
        Naming.rebind("/PerfectTime", pt); // 註冊到 RMI Registry
        System.out.println("Ready to do time");
    }
}

DisplayPerfectTime.java (Client)

import java.rmi.*;
import java.rmi.registry.*;

public class DisplayPerfectTime {
    public static void main(String[] args) throws Exception {
        System.setSecurityManager(new RMISecurityManager()); // 必須設置
        PerfectTimeI t = (PerfectTimeI) Naming.lookup("/PerfectTime");
        for (int i = 0; i < 10; i++) {
            System.out.println("Perfect time = " + t.getPerfectTime());
        }
    }
}

registerit.policy (Security Policy)

grant {
    permission java.security.AllPermission;
};

編譯與運行步驟 (Windows CMD)

F:\rmi> javac *.java
F:\rmi> rmic PerfectTime          // 生成 Stub/Skeleton
F:\rmi> start rmiregistry         // 新窗口啟動 RMI Registry (默認 1099 端口)
F:\rmi> java PerfectTime          // 啟動服務端
Ready to do time

另開一個 CMD 窗口:
F:\rmi> java -Djava.security.policy=registerit.policy DisplayPerfectTime
Perfect time = 1011585443953
Perfect time = 1011585443968
...
Perfect time = 1011585444062

關鍵點總結

  1. 遠程接口 必須 extends java.rmi.Remote,方法拋出 RemoteException。
  2. 實現類 繼承 UnicastRemoteObject,構造器拋出 RemoteException。
  3. rmic 生成存根/骨架(Java 1.2+ 僅需 Stub,Skeleton 由反射替代)。
  4. rmiregistry 必須在 CLASSPATH 能找到 Stub 類的目錄下啟動,或設置 java.rmi.server.codebase。
  5. 客戶端 必須安裝 RMISecurityManager 並指定 policy 文件,否則下載 Stub 時會被安全管理器阻擋。
  6. ClassPath 陷阱: 若 rmic 報找不到類,請將工作目錄加入 CLASSPATH:set CLASSPATH=.;%CLASSPATH%。

進階擴展方向

  • 使用 java.rmi.activation.Activatable 實現服務激活/持久化。
  • 整合 SSL (RMIClientSocketFactory/RMIServerSocketFactory) 實現傳輸加密。
  • 集群/負載均衡:JNDI + RMI 實現服務發現與故障轉移。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved