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

Java RMI的轻量级实现 - LipeRMI的更多相关文章

  1. Exception thrown by the agent : java.rmi.server.ExportException: Port already in use

    今天有个应用一直起不来,感觉配置都对啊,奇了怪了.看日志发现如下: STATUS | wrapper | 2017/01/04 08:09:31 | Launching a JVM...INFO | ...

  2. Java RMI之HelloWorld篇

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  3. 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099;

     错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099; nested exception is:  java ...

  4. JAVA RMI 实例

    下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用. 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java)2. 实现远程接口及远程方法(继承Unicas ...

  5. JAVA RMI例子

    RMI 是java语言的一个RPC框架,本文给出基础例子如下: 1.实现接口: public interface ICalc extends Remote { public int add(int p ...

  6. java.rmi.NoSuchObjectException: no such object in table

    jmx链接的时候,最简单的例子都行不通,郁闷,出现了: 参考:http://reiz6153.blog.163.com/blog/static/401089152009442723208/ 代码: M ...

  7. 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误:

  8. Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例

    RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网 ...

  9. Java学习笔记(十六)——Java RMI

    [前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...

随机推荐

  1. Android Studio编译OsmAnd出现警告:GeoPointParserUtil.java使用或覆盖了已过时的 API。有关详细信息请使用-Xlint:deprecation重新编译

    [背景] 之前折腾: [记录]Android Studio中导入OsmAnd并编译 期间,遇到了编译警告: 1 2 3 4 5 :OsmAnd-java:compileJava 注: E:\crifa ...

  2. 用vi编辑文件

    原文:https://www.ibm.com/developerworks/library/l-lpic1-103-8/index.html Overview In this article, lea ...

  3. Debug.Assert vs Exception Throwing(转载)

    来源 Q: I've read plenty of articles (and a couple of other similar questions that were posted on Stac ...

  4. CentOS7安装wps

    https://blog.csdn.net/u010445843/article/details/77828552

  5. 【bzoj2023/1630】[Usaco2005 Nov]Ant Counting 数蚂蚁 dp

    题解: 水题 f[i][j] 前i种用了j个,前缀和优化就可以了

  6. Spring boot国际化

    国际化主要是引入了MessageSource,我们简单看下如何使用,以及其原理. 1.1 设置资源文件 在 properties新建i18n目录 新建message文件: messages.prope ...

  7. laravel 错误 1071 Specified key was too long; max key length is 1000 bytes

    laravel 执行 php artisan migrate 安装数据库报 1071 Specified key was too long; max key length is 1000 bytes ...

  8. 51Nod1626 B君的梦境 状压dp 矩阵

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1626.html 题目传送门 - 51Nod1626 题意 题解 首先考虑形象的想象本题中的思维空间. ...

  9. Shell工具| 流程控制

    1. 流程控制 if 判断 ()[ 条件判断式 ],中括号和条件判断式之间必须有空格 ()if后要有空格 [kris@hadoop datas]$ vim if.sh #!/bin/bash -eq ...

  10. new Vue 发生了什么

    new Vue 发生了什么 new vue 我们从入口分析,我们new 一个实例化对象,是由Funcction实现的,来看一下源码,在src/core/instance/index.js 中. imp ...