服務端經過rmi將對象註冊到遠程服務, 客戶端使用時, 只須要經過rmi協議獲取便可, 只要接口統一, 便可不須要知道內部具體實現, 直接調用使用.java
這裏就是客戶端和服務端統一的接口, 只須要服務端根據這個接口實現相應的功能, 而後註冊上去, 客戶端就能夠根據這個接口來使用相應的功能.app
import java.rmi.RemoteException; import java.rmi.*; /** * 定義一個遠程接口,必須繼承Remote接口,其中須要遠程調用的方法須拋出RemoteException異常 */ public interface CompareHelper<T> extends Remote { /** * 比較 object1 和 object2 的大小, * 若是object1大, 那麼返回true * 若是object2大, 那麼返回false */ boolean compare(T object1, T object2) throws RemoteException; /** * 將object2的值鏈接到object1的後面 */ T append(T object1, T object2) throws RemoteException; }
CompareHellper接口的其中一種實現. 用於處理Integer類型.ide
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class IntegerCompareHelper extends UnicastRemoteObject implements CompareHelper<Integer> { protected IntegerCompareHelper() throws RemoteException { } @Override public boolean compare(Integer object1, Integer object2) throws RemoteException { return object1 - object2 > 0; } @Override public Integer append(Integer object1, Integer object2) throws RemoteException { return Integer.valueOf(object1.toString() + object2.toString()); } }
CompareHellper接口的其中一種實現. 用於處理String類型.測試
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class StringCompareHelper extends UnicastRemoteObject implements CompareHelper<String> { protected StringCompareHelper() throws RemoteException { } @Override public boolean compare(String object1, String object2) throws RemoteException { return object1.compareTo(object2) > 0; } @Override public String append(String object1, String object2) throws RemoteException { return object1 + object2; } }
用於註冊服務到遠程服務上..net
import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; /** * 建立RMI註冊表,啓動RMI服務,並將遠程對象註冊到RMI註冊表中。 */ public class Server { private static final String HOST = "localhost"; private static final int PORT = 9090; public static void main(String args[]) { try { //建立2個對象, 準備將這個兩個對象做爲遠程對象註冊 CompareHelper stringCompareHelper = new StringCompareHelper(); CompareHelper integerCompareHelper = new IntegerCompareHelper(); LocateRegistry.createRegistry(PORT); //綁定的URL標準格式爲:rmi://host:port/name(其中協議名能夠省略,下面兩種寫法都是正確的) // 本例子中就是 "rmi://localhost:9090/XXXXXXCompareHelper" Naming.bind("rmi://" + HOST + ":" + PORT + "/StringCompareHelper", stringCompareHelper); Naming.bind("//" + HOST + ":" + PORT + "/IntegerCompareHelper", integerCompareHelper); System.out.println("---->遠程對象綁定成功!"); } 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(); } } }
用於調用遠程服務.代理
import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; /** * 客戶端測試,在客戶端調用遠程對象上的遠程方法,並返回結果。 */ @SuppressWarnings("unchecked") public class Client { public static void main(String args[]) { try { CompareHelper compareHelper; compareHelper = (CompareHelper) Naming.lookup("rmi://localhost:9090/StringCompareHelper"); System.out.println(compareHelper.append("你好", "哈哈哈")); System.out.println(compareHelper.compare("abc", "ioi")); compareHelper = (CompareHelper) Naming.lookup("rmi://localhost:9090/IntegerCompareHelper"); System.out.println(compareHelper.append(6379, 8080)); System.out.println(compareHelper.compare(435, 666)); } catch (NotBoundException | MalformedURLException | RemoteException e) { e.printStackTrace(); } } }
先運行Server.java裏的main方法來註冊服務, 再運行Client.java裏的main方法來進行相應服務的獲取和調用.orm