遠程代理模式-Remote Proxy(Java實現)

遠程代理模式-Remote Proxy

服務端經過rmi將對象註冊到遠程服務, 客戶端使用時, 只須要經過rmi協議獲取便可, 只要接口統一, 便可不須要知道內部具體實現, 直接調用使用.java

CompareHelper接口

這裏就是客戶端和服務端統一的接口, 只須要服務端根據這個接口實現相應的功能, 而後註冊上去, 客戶端就能夠根據這個接口來使用相應的功能.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;
}

IntegerCompareHelper類

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());
    }
}

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類

用於註冊服務到遠程服務上..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();
        }
    }
}

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方法來進行相應服務的獲取和調用.orm

相關文章
相關標籤/搜索