• 远程代理模式-Remote Proxy(Java实现)


    远程代理模式-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方法来进行相应服务的获取和调用.

  • 相关阅读:
    python笔记01
    【工具大道】ssh登录Linux服务器,并显示图形化界面
    【夯实PHP基础】PHP常用类和函数总结
    【开发软件】 在Mac下配置php开发环境:Apache+php+MySql
    【工具大道】UML的点点滴滴
    【ctags/cscope/project安装使用】给神编辑器vim添加新的翅膀
    PHP程序员的技术成长规划
    【夯实PHP基础】PHPUnit -- PHP测试框架
    【夯实PHP基础】PHP多进程-- pcntl_fork实现
    【工匠大道】升级Mac下的svn,解决命令行不能使用svn的问题
  • 原文地址:https://www.cnblogs.com/noKing/p/9069888.html
Copyright © 2020-2023  润新知