下面我將介紹一個完整的實例,讓初學者能快速體驗RMI的功用。
分爲如下四個步驟
1. 建立遠程接口及聲明遠程方法(HelloInterface.java)
2. 實現遠程接口及遠程方法(繼承UnicastRemoteObject)(Hello.java)
3. 啓動RMI註冊服務,並註冊遠程對象(HelloServer.java)
4. 客戶端查找遠程對象,並調用遠程方法(HelloClient)
5. 執行程序:啓動服務HelloServer;運行客戶端HelloClient進行調用java
具體代碼及對應步驟以下:
1. 建立遠程接口及聲明遠程方法(HelloInterface.java)設計模式
package cn.telling.rmi; import java.rmi.Remote; import java.rmi.RemoteException; /** * 遠程接口必須擴展接口java.rmi.Remote * * @ClassName: HelloInterface TODO * @author xingle * @date 2015-9-28 下午4:37:12 */ public interface HelloInterface extends Remote ,Serializable{ /** * 遠程接口方法必須拋出 java.rmi.RemoteException */ public String sayHello() throws RemoteException;; }
2. 實現遠程接口及遠程方法(繼承UnicastRemoteObject)HelloImpl.javaide
package cn.telling.rmi; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * 擴展了UnicastRemoteObject類,並實現遠程接口 HelloInterface * * @ClassName: HelloImpl TODO * @author xingle * @date 2015-9-28 下午4:38:47 */ public class HelloImpl extends UnicastRemoteObject implements HelloInterface { private String message; /** * 必須定義構造方法,即便是默認構造方法,也必須把它明確地寫出來,由於它必須拋出出RemoteException異常 * * @param msg * @throws RemoteException */ public HelloImpl(String msg) throws RemoteException { this.message = msg; } /** * * @Description: TODO * @return * @throws RemoteException * @author xingle * @data 2015-9-28 下午4:39:41 */ @Override public String sayHello() throws RemoteException { System.out.println("Called by HelloClient"); return message; } }
3. 啓動RMI註冊服務,並註冊遠程對象(HelloServer.java)this
package cn.telling.rmi; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; /** * * @ClassName: HelloServer TODO * @author xingle * @date 2015-9-28 下午4:41:47 */ public class HelloServer { public static void main(String[] args) { try { // 啓動RMI註冊服務,指定端口爲1099 (1099爲默認端口) // 也能夠經過命令 $java_home/bin/rmiregistry 1099啓動 // 這裏用這種方式避免了再打開一個DOS窗口 // 並且用命令rmiregistry啓動註冊服務還必須事先用RMIC生成一個stub類爲它所用 LocateRegistry.createRegistry(1099); // 建立遠程對象的一個或多個實例 // 能夠用不一樣名字註冊不一樣的實例 HelloImpl service = new HelloImpl("hello,world!"); // 若是要把hello實例註冊到另外一臺啓動了RMI註冊服務的機器上 // Naming.rebind("//192.168.1.105:1099/Hello",hello); Naming.rebind("Hello", service); System.out.println("Hello Server is ready."); } catch (RemoteException e) { System.out.println("Hello Server failed: " + e); e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } } }
4. 客戶端查找遠程對象,並調用遠程方法(HelloClient)spa
package cn.telling.rmi; import java.rmi.Naming; /** * * @ClassName: HelloClient TODO * @author xingle * @date 2015-9-28 下午4:54:51 */ public class HelloClient { public static void main(String[] argv) { try { HelloInterface hello = (HelloInterface) Naming.lookup("Hello"); // 若是要從另外一臺啓動了RMI註冊服務的機器上查找hello實例 // HelloInterface hello = // (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello"); // 調用遠程方法 System.out.println(hello.sayHello()); } catch (Exception e) { System.out.println("HelloClient exception: " + e); } } }
5. 執行程序:啓動服務HelloServer;運行客戶端HelloClient進行調用.net
執行結果:設計
服務端:3d
客戶端:code
JAVA RMI 實例orm