四個文件構成極簡 RMI 服務:
PerfectTimeI.java — 遠程接口PerfectTime.java — 服務端實現DisplayPerfectTime.java — 客戶端調用registerit.policy — 安全策略文件import java.rmi.*;
public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}
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");
}
}
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());
}
}
}
grant {
permission java.security.AllPermission;
};
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
java.rmi.Remote,方法拋出 RemoteException。UnicastRemoteObject,構造器拋出 RemoteException。java.rmi.server.codebase。RMISecurityManager 並指定 policy 文件,否則下載 Stub 時會被安全管理器阻擋。rmic 報找不到類,請將工作目錄加入 CLASSPATH:set CLASSPATH=.;%CLASSPATH%。java.rmi.activation.Activatable 實現服務激活/持久化。RMIClientSocketFactory/RMIServerSocketFactory) 實現傳輸加密。