Java RMI的轻量级实现 - LipeRMI

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

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

LipeRMI优点

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

架构

Java RMI的轻量级实现 - LipeRMI-LMLPHP

工程结构

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

05-11 13:41