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