RMI (Remote Method Invocation) 讓 Java 物件能透過網路無縫調用遠端 JVM 中的物件方法,如同本地調用般自然。本文完整示範從遠程介面定義、伺服端實作、Stub/Skeleton 生成、註冊服務、客戶端查找調用,到安全策略與 HTTP 代碼下載的完整部署流程。
java.rmi.Remote,定義可遠程調用的方法,所有方法必須拋出 RemoteExceptionUnicastRemoteObject 實作遠程介面bind/lookup/rebind 操作
import java.rmi.*;
public interface Product extends Remote {
String getDescription() throws RemoteException;
}
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;
}
}
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();
}
}
}
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();
}
}
}
javac *.javarmic ProductImpl → 產生 ProductImpl_Stub.classrmiregistry (需在類別路徑可見處執行)https://server/download/)start java -Djava.rmi.server.codebase=https://91.1.1.119/download/ ProductServer
codebase 指定客戶端下載 Stub 的 HTTP 路徑client.policy):
grant {
permission java.net.SocketPermission "91.1.1.119:1024-65535", "connect";
permission java.net.SocketPermission "91.1.1.119:80", "connect";
};
start java -Djava.security.policy=client.policy ProductClient
Serializable (或為基本類型/遠程介面)codebase URL 下載RMISecurityManager 並授權網路連線權限限制:純 Java 環境,異構語言互通需使用 CORBA (IIOP) 或 Web Services (SOAP/REST)。RMI-IIOP 結合了 RMI 程式模型與 CORBA 互通性,是遷移過渡的選擇。