zoukankan      html  css  js  c++  java
  • Java RMI的轻量级实现

    Java RMI的轻量级实现 - LipeRMI

    之前博主有记录关于Java标准库的RMI,后来发现问题比较多,尤其是在安卓端直接被禁止使用,于是转向了第三方的LipeRMI

    注意到LipeRMI的中文教程比较少,这里记录一个demo,供自己复习,如果能帮到有需要的人那就更好了

    LipeRMI优点

    • 提供一个简单,可扩展框架和API
    • 非常轻量级不依赖任何第三方包
    • 安全可靠
    • 提供类似于RMI的API,让程序只需做少量调整,就能够将RMI替换为LipeRMI
    • 优化带宽使用率
    • 优化客户端与服务器的通信(复用相同的socket并保持alive)
    • 当面向连接的事件发生时,将触发预定的动作

    架构

    工程结构

    ➜  hellormi tree
    .
    ├── HelloClient.java
    ├── HelloImpl.java
    ├── HelloServer.java
    └── IHello.java
    
    0 directories, 4 files
    

    公用接口声明

    IHello.java

    package hellormi;
    
    import java.util.Date;
    
    public interface IHello {
        String sayHello(String name);
        Date getDate();
    }
    

    服务端实现类

    HelloImpl.java

    package hellormi;
    
    import java.util.Date;
    
    public class HelloImpl implements IHello {
    
        @Override
        public String sayHello(String name) {
            return "Hello " + name;
        }
    
        @Override
        public Date getDate() {
            return new Date();
        }
    }
    

    服务端开启服务主类

    HelloServer.java

    package hellormi;
    
    import net.sf.lipermi.exception.LipeRMIException;
    import net.sf.lipermi.handler.CallHandler;
    import net.sf.lipermi.net.Server;
    
    import java.io.IOException;
    
    public class HelloServer {
        public static void main(String[] args) {
            // 远程实例
            IHello proxy = new HelloImpl();
            CallHandler callHandler = new CallHandler();
            // 注册服务
            try {
                callHandler.registerGlobal(IHello.class, proxy);
            } catch (LipeRMIException e) {
                e.printStackTrace();
            }
            Server server = new Server();
            // 绑定端口和服务
            int port = 8888;
            try {
                server.bind(port, callHandler);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    客户端调用类

    HelloClient.java

    package hellormi;
    
    import net.sf.lipermi.handler.CallHandler;
    import net.sf.lipermi.net.Client;
    
    import java.io.IOException;
    
    public class HelloClient {
    
    
        public static void main(String[] args) {
            // 建立连接
            CallHandler callHandler = new CallHandler();
            String remoteHost = "127.0.0.1";
            int port = 8888;
            Client client = null;
            try {
                client = new Client(remoteHost, port, callHandler);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            // 获取远程实例,测试方法
            assert client != null;
            IHello remoteObj = (IHello) client.getGlobal(IHello.class);
            System.out.println(remoteObj.sayHello("Tomcat"));
            System.out.println(remoteObj.getDate());
        }
    }
    

    测试结果

    先在服务端开启服务,然后本地运行HelloClient.java

    Hello Tomcat
    Wed May 02 19:39:15 HKT 2018
    

    小结

    LipeRMI使用体验和Java标准库里的rmi类似,但依赖比较少,便于移植。也比较轻量独立,不用进行像原生rmi还要设置系统ip之类的操作。

  • 相关阅读:
    软件的概念
    打开别人Android项目的方法
    软件工程
    数据预处理技术
    机器学习之监督学习
    C语言指针与二维数组
    徐涛政治押题
    求二叉树的宽度
    解决在某些IE浏览器下字符乱码的问题
    mac系统不能使用127.0.0.2的解决方案
  • 原文地址:https://www.cnblogs.com/fanghao/p/8982121.html
Copyright © 2011-2022 走看看