1. Java RMI介绍

RMI:远程方法调用(Remote Method Invocation)。能够让在某个java虚拟机上的对象像调用本地对象方法一样调用另一个java 虚拟机中的对象上的方法。

1.RMI远程调用步骤

  1. 客户对象调用客户端辅助对象上的方法
  2. 客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象
  3. 服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
  4. 调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象
  5. 服务端辅助对象将结果打包,发送给客户端辅助对象
  6. 客户端辅助对象将返回值解包,返回给客户对象
  7. 客户对象获得返回值

2.RMI优缺点

  • 优点: 移植性好,服务器代码可移植到客户端;
  • 缺点: 服务端和客户端都需要是Java。

对于客户对象来说,步骤2-6是完全透明的。

以上简明扼要的介绍了什么是RMI和调用步骤,接下来,说说在程序中是如何使用rmi的。

2. 仅在jdk下程序中的使用

1. RMI服务端

1.创建一个服务端项目rmi-server

2.创建远程方法接口,该接口需要实现Remote接口

public interface IHelloService extends Remote {

    public String sayHello(String name) throws RemoteException;

    public int sum(int a, int b) throws RemoteException;
}

3.创建远程方法接口实现类,然后执行main方法就等于启动了rmi服务端了

public class HelloServiceImpl extends UnicastRemoteObject implements IHelloService {

    public HelloServiceImpl() throws RemoteException {
super();
}
@Override
public String sayHello(String name) throws RemoteException {
return "hello: " + name;
} @Override
public int sum(int a, int b) throws RemoteException {
return a + b;
} public static void main(String args[]) {
try {
//创建一个远程对象
IHelloService helloService = new HelloServiceImpl();
//生成远程对象注册表Registry的实例,并指定端口为8888(默认端口是1099)
LocateRegistry.createRegistry(8888); //把远程对象注册到RMI注册服务器上,并命名为RHello
//绑定的URL标准格式为:rmi://host:port/name(协议名可以省略,下面两种写法都可以)
Naming.bind("rmi://127.0.0.1:8888/HelloService", helloService); System.out.println(">>INFO:远程IHello对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
}
}
}

2. RMI客户端

1.新建一个客户端项目rmi-client

2.复制服务端的远程方法接口IHelloService,注意,包名要一致

3.测试类调用RMI服务

public class HelloServiceClientTest {
@Test
public void testSayHello() {
try {
// 在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法
IHelloService rhello = (IHelloService) Naming.lookup("rmi://127.0.0.1:8888/HelloService");
System.out.println(rhello.sayHello("world"));
System.out.println(rhello.sum(454, 5457));
} catch (Exception e) {
e.printStackTrace();
}
}
}

2. 在spring封装下程序中的使用

1. RMI服务端

1.创建一个基于Sringboot的项目rmi-server

2.创建一个远程方法接口

package com.wp.learn.spring.remoting;

import java.rmi.Remote;
import java.rmi.RemoteException; public interface IHelloService extends Remote { public String sayHello(String name) throws RemoteException; public int sum(int a, int b) throws RemoteException;
}

3.实现远程方法接口

package com.wp.learn.spring.remoting.impl;

import com.wp.learn.jdk.remoting.IHelloService;
import org.springframework.stereotype.Service; import java.rmi.RemoteException; @Service
public class HelloServiceImpl implements IHelloService { @Override
public String sayHello(String name) throws RemoteException {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "hello: " + name;
} @Override
public int sum(int a, int b) throws RemoteException {
return a + b;
}
}

4.rmi相关配置

@Configuration
public class RMIConfig { @Autowired
@Qualifier("helloServiceImpl")
private HelloServiceImpl helloService; @Bean
public RmiServiceExporter initRmiServiceExporter(){
RmiServiceExporter exporter=new RmiServiceExporter();
exporter.setServiceInterface(IHelloService.class);
exporter.setServiceName("HelloService");
exporter.setService(helloService);
exporter.setRegistryPort(10086);
return exporter;
}
}

2. RMI客户端

1.创建一个基于springboot的项目rmi-client

2.创建和服务端一样的远程方法接口,注意包名一致

3.rmi配置

@Configuration
public class RMIClientConfig { @Bean(name = "helloService")
public RmiProxyFactoryBean initRmiProxyFactoryBean() {
RmiProxyFactoryBean factoryBean = new RmiProxyFactoryBean();
factoryBean.setServiceUrl("rmi://127.0.0.1:10086/HelloService");
factoryBean.setServiceInterface(IHelloService.class);
factoryBean.setLookupStubOnStartup(false);
factoryBean.setRefreshStubOnConnectFailure(true);
// lookupStubOnStartup : 这个属性是表示,不在容器启动的时候创建与Server端的连接;
// refreshStubOnConnectFailure : 这个属性是表示是否连接出错时自动重连;
// registryClientSocketFactory : 这个是客户端与服务端创建SOCKECT的一个工厂。
return factoryBean;
}
}

4.调用接口测试

@RestController
@RequestMapping(value = "/v1/")
public class RMIClientController { // @Autowired
// @Qualifier(value = "helloService")
// IHelloService helloService; @Autowired
IHelloService helloService; @RequestMapping(value = "/test")
public String test1() {
// IHelloService helloService = (IHelloService) factoryBean.getObject();
try {
System.out.println(helloService.sayHello("小青"));
System.out.println("----------------------------------");
System.out.println(helloService.sum(132, 355));
} catch (RemoteException e) {
e.printStackTrace();
}
return "123";
}
}

大功告成!源码地址: https://gitee.com/wangpinggs/learn/tree/master

相关博客:

http://www.blogjava.net/zhenyu33154/articles/320245.html

http://elf8848.iteye.com/blog/1961205

Java RMI使用的更多相关文章

  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 ...

  10. JAVA RMI helloworld入门

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

随机推荐

  1. MVC和MTV设计模式

    1.MVC MVC最初是由施乐公司旗下的帕罗奥多研究中心中的一位研究人员给 smalltalk语言发明的一中软件设计模式. MVC概述:MVC全名是ModelViewController,是模型(mo ...

  2. 清除celery 任务队列

    celery 有密码的时候 清除任务 redis-cli -h host -p port -a password -n 11 ltrim transcode 0 196 没有密码的时候 redis-c ...

  3. 阅读笔记—JSP

    JSP页面概述 JSP(JavaServer Page)是一种动态页面技术,它在java web应用中主要实现表现逻辑.JSP页面是在HTML页面中嵌入JSP元素的动态Web页面,一般来说JSP页面中 ...

  4. 【习题 8-9 1613】 K-Graph Oddity

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 感觉最大度数|1就是最多需要的个数了. 就贪心一下. 然后模拟染色的过程就可以了. (贪心染色就可以了 (看看周围哪个颜色没有,就用 ...

  5. wordpress 加速主题的静态资源

    wordpress 加速主题的静态资源(固定的CSS.JS和图片等) wordpress 中用函数 get_stylesheet_directory_uri() 生成当前主题的 URL , 格式如 h ...

  6. 将 php 转换/编译为 EXE

    将 php 转换/编译为 EXE 本文仅仅是将原文用谷歌作了翻译,原文来源于 http://stackoverflow.com 资料来源  http://stackoverflow.com/quest ...

  7. android图像处理系列之五--给图片添加边框(中)

    前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...

  8. 2.2 Consumer API官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ 2.2 Consumer API 2.2.消费者API 随着0..0版本,我们已经增 ...

  9. POJ——T2271 Guardian of Decency

    http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   A ...

  10. 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)

    poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...