Java RMI的轻量级实现 - LipeRMI

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之类的操作。

猜你喜欢

转载自www.cnblogs.com/fanghao/p/8982121.html