遠程代理模式-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方法來進行相應服務的獲取和調用.
