關鍵詞:RMI RPC CORBA
簡 介:本篇文章重點闡述RMI,附帶介紹RPC和CORBA
Java遠程方法調用(Java RMI)是一組實現了遠程方法調用(rmi)的API。
- java RMI是遠程過程調用(RPC)的面向對象版等價概念,它還支持序列化的java類的直接轉換以及分布式的垃圾回收(DGC)。
-
換句話說,java RMI是面向對象的遠程調用,屬於PRC的一種特例。
-
RMI的最初實現依賴於java虛擬機的類展現機制,故其只支持從一個JVM到另一個JVM的調用。底層協議只支持java實現就是java遠程方法協議(JRMP)
- 為了支持運行在一個非JVM上下文的代碼,開發人員后來開發了一個CORBA版本(javax.rmi.CORBA)
java1.2移除了skeleton對象
下面是一個java RMI的例子:

import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.rmi.registry.*; public class RmiServer extends UnicastRemoteObject implements RmiServerIntf { public static final String MESSAGE = "Hello World"; public RmiServer() throws RemoteException { super(0); // required to avoid the 'rmic' step, see below } public String getMessage() { return MESSAGE; } public static void main(String args[]) throws Exception { System.out.println("RMI server started"); try { //special exception handler for registry creation LocateRegistry.createRegistry(1099); //一個JVM可以創建一個記錄器 System.out.println("java RMI registry created."); } catch (RemoteException e) { //do nothing, error means registry already exists System.out.println("java RMI registry already exists."); } //Instantiate RmiServer RmiServer obj = new RmiServer(); // Bind this object instance to the name "RmiServer" Naming.rebind("//localhost/RmiServer", obj);//通過Naming源碼可知,rebind方法將RmiServer類型的對象記錄到了本地記錄器 System.out.println("PeerServer bound in registry"); } }

import java.rmi.Remote; import java.rmi.RemoteException; /** *這個接口需要提供給客戶端,也就是提供服務getMessasge() */ public interface RmiServerIntf extends Remote { public String getMessage() throws RemoteException; }

import java.rmi.Naming; /** *這個就是客戶端 */ public class RmiClient { public static void main(String args[]) throws Exception { //客戶端運用了服務器暴露的接口,也叫stub(存根) RmiServerIntf obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer"); System.out.println(obj.getMessage()); } }
***stub,存根,這個詞有點像會計學里的術語,想想坐公交、飛機,售票員總會留個底,你持有票據的另一半,這樣雙方就不會引起誤會扯皮了。服務器提供的這個存根也是同理,就相當於一層協議,好讓客戶端請求服務器提供的服務。當然了,除了核心機制,計算機和現實的售票存在較大差異。
上面的例子,我是運行在了一台機器上,大家可以試試多台機器的遠程調用,或者多個JVM之間進行調用。