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. nunit单元测试详解

    在粗略看了代码后,下面就详细说明相应的测试标记(属性)的用法. [TestFixture(arguments)]属性标记类为测试类,若没有填写参数,则测试类必须含有无参构造函数,否则需要相应的有参构造 ...

  2. python--使用双向队列结构检查回文

    这个简单,队列可两边进两边出. # coding = utf-8 # 双向进出队列 class Deque: def __init__(self): self.items = [] def is_em ...

  3. 转:ubuntu-E:Encountered a section with no Package: header的解决办法

    http://blog.csdn.net/hs794502825/article/details/7835902 blog.csdn.net/lixiang0522/article/details/7 ...

  4. Android 开发随笔

    1 获取屏幕尺寸 WindowManager wm = this.getWindowManager();viewWidth = wm.getDefaultDisplay().getWidth();vi ...

  5. window与linux文件共享解决方案

    我的系统是windows7 x64,虚拟机上的linux系统是centos6.5 方法一: 1.在win7系统上建立一个用户 2.在f盘建立一个文件夹linuxshare,然后右击-属性-共享-高级共 ...

  6. sql 表值函数-将一个传入的字符串用2中分隔符拆分成临时表

    USE [tms]GO/****** Object: UserDefinedFunction [dbo].[fn_StrToTable_Double] Script Date: 2017/4/26 9 ...

  7. 三级区域jquery插件

    /*! * Distpicker v1.0.4 * https://github.com/fengyuanchen/distpicker * * Copyright (c) 2014-2016 Fen ...

  8. Azkaban

    Azkaban安装部署 https://azkaban.github.io/azkaban/docs/2.5/ 安装Azkaban ) 在/opt/module/目录下创建azkaban目录 [kri ...

  9. Practice| 数组

    /* 从键盘确定班级的组号,在从键盘输入每一组的人数,并输入每一个学员的成绩,并求出,每一组的平均分, 全部的平均分,每一组的最高分,全部的最高分,并显示结果. */ class Test3{ pub ...

  10. waf python build 工具使用流程

    waf python build 工具使用流程 waf 的 build 理念 build 了之后,可以跟踪到 ${SRC} 和 ${TGT} 有关联的文件,只有 ${SRC} 被修改过,在下次buil ...