遠程代理模式-Remote Proxy
服務端通過rmi將對象注冊到遠程服務, 客戶端使用時, 只需要通過rmi協議獲取即可, 只要接口統一, 即可不需要知道內部具體實現, 直接調用使用.
CompareHelper接口
這里就是客戶端和服務端統一的接口, 只需要服務端根據這個接口實現相應的功能, 然后注冊上去, 客戶端就可以根據這個接口來使用相應的功能.
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; }
IntegerCompareHelper類
CompareHellper接口的其中一種實現. 用於處理Integer類型.
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()); } }
StringCompareHelper類
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; } }
Server類
用於注冊服務到遠程服務上.
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(); } } }
Client類
用於調用遠程服務.
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方法來進行相應服務的獲取和調用.