Java RMI 指的是遠程方法調用 (Remote Method Invocation)。它是一種機制,可以讓在某個 Java 虛擬機上的對象調用另外一個Java 虛擬機中的對象上的方法。能夠用此方法調用的任何對象必須實現該遠程接口。
Java RMI不是什麼新技術(在Java1.1的時代都有了),但倒是是很是重要的底層技術。
大名鼎鼎的EJB都是創建在rmi基礎之上的,如今還有一些開源的遠程調用組件,其底層技術也是rmi。
在大力鼓吹Web Service、SOA的時代,是否是每一個應用都應該選用笨拙的Web Service組件來實現,經過對比測試後,RMI是最簡單的,在一些小的應用中是最合適的。 java
下面經過一個簡單的例子來講明RMI的原理和應用,下面這個例子是一個簡單HelloWorld,但已涵蓋RMI的核心應用與開發模式。 服務器
package com.jason.rmi; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote{ public String sayHello() throws RemoteException; public String sayHelloToSomeOne(String someOneName) throws RemoteException; }
package com.jason.rmi; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class HelloImpl extends UnicastRemoteObject implements Hello { /** * */ private static final long serialVersionUID = 1L; public HelloImpl() throws RemoteException { super(); // TODO Auto-generated constructor stub } @Override public String sayHello() throws RemoteException { // TODO Auto-generated method stub return "HelloJasonlee"; } @Override public String sayHelloToSomeOne(String someOneName) throws RemoteException { // TODO Auto-generated method stub return "你好!"+someOneName; } }
package com.jason.rmi.test; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import com.jason.rmi.Hello; import com.jason.rmi.HelloImpl; public class RmiServer { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { //建立一個遠程對象 Hello hello = new HelloImpl(); //本地主機上的遠程對象註冊表Registry的實例,並指定端口爲8888,這一步必不可少(Java默認端口是1099),必不可缺的一步,缺乏註冊表建立,則沒法綁定對象到遠程註冊表上 LocateRegistry.createRegistry(8888); //把遠程對象註冊到RMI註冊服務器上,並命名爲Hello //綁定的URL標準格式爲:rmi://host:port/name(其中協議名能夠省略,下面兩種寫法都是正確的) Naming.bind("rmi://localhost:8888/Hello",hello); // Naming.bind("//localhost:8888/Hello",hello); System.out.println(">>>>>INFO:遠程Hello對象綁定成功!"); } catch (RemoteException e) { System.out.println("建立遠程對象發生異常!"); e.printStackTrace(); } catch (AlreadyBoundException e) { System.out.println("發生重複綁定對象異常!"); e.printStackTrace(); } catch (MalformedURLException e) { System.out.println("發生URL畸形異常!"); e.printStackTrace(); } } }
package com.jason.rmi.test; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import com.jason.rmi.Hello; public class RmiClient { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { // 在RMI服務註冊表中查找名稱爲Hello的對象,並調用其上的方法,在服務端實際引用的對象是HelloImpl對象; Hello hello = (Hello) Naming.lookup("rmi://localhost:8888/Hello"); System.out.println(hello.sayHello()); System.out.println(hello.sayHelloToSomeOne("傑森")); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
在eclipse下的環境以下: eclipse
在eclipse下的運行結果以下: ide