遠程代理模式-Remote Proxy 服務端通過rmi將對象註冊到遠程服務, 客戶端使用時, 只需要通過rmi協議獲取即可, 只要介面統一, 即可不需要知道內部具體實現, 直接調用使用. CompareHelper介面 這裡就是客戶端和服務端統一的介面, 只需要服務端根據這個介面實現相應的功能, ...
遠程代理模式-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方法來進行相應服務的獲取和調用.