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. windows10的文件浏览器中无法搜索文件内容

    系统:更新到最新的win10(2018年8月23日 23:54:31) 重现步骤:git clone一个项目,然后切换到它的另一个分支:打开文件夹浏览器(explorer),在右上角里输入想要查找的字 ...

  2. 函数函数sigaction、signal

    函数函数sigaction 1. 函数sigaction原型: int sigaction(int signum, const struct sigaction *act, struct sigact ...

  3. The authenticity of host 'slaver2 (192.168.199.132)' can't be established. RSA key fingerprint is cc:4e:23:01:ca:97:52:21:85:78:bc:29:ca:b3:12:52.

    1:ssh登录 The authenticity of host 192.168.199.132 can't be established. 的问题 问题出现了,总要解决吧,百度一下,详细介绍的很多, ...

  4. javaScript事件(九)事件类型之触摸与手势事件

    一.触摸事件 touchstart:当手指触摸屏幕时触发:即使已经有一个手指放在了屏幕上也会触发. touchmove:当手指在屏幕上滑动时连续地触发.在这个世界发生期间,调用preventDefau ...

  5. 最大子数组(I, II, III,IV,V)和最大子数组乘积 (动态规划)

    I 找一个连续最大子数组,sum加到nums[i], 如果前面子数组和<0则舍去,从头开始. class Solution { public: /** * @param nums: A list ...

  6. The connection string 'MysqlEF' in the application's configuration file does not contain the require异常

    在学习EF core first 对接mysql时,出现了这个异常. 原因是:连接字符串中缺少providerName="MySql.Data.MySqlClient" <a ...

  7. ssm又乱码

    以前用mybatis的时候是这样的 mysql.connection.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characte ...

  8. 【CF662C】Binary Table(FWT)

    [CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...

  9. Zabbix监控Low level discovery实时监控网站URL状态

    今天我们来聊一聊Low level discovery这个功能,我们为什么要用到loe level discovery这个功能呢? 很多时候,在使用zabbix监控一些东西,需要对类似于Itens进行 ...

  10. 048 SparkSQL自定义UDAF函数

    一:程序 1.需求 实现一个求平均值的UDAF. 这里保留Double格式化,在完成求平均值后与系统的AVG进行对比,观察正确性. 2.SparkSQLUDFDemo程序 package com.sc ...