一、RMI概述

RMI(Remote Method Invoke)-远程调用方法,是java的一组用户开发分布式应用程序的API。通过该RMI机制,可以实现程序组件在不同操作系统之间的通信。它是一种被EJB使用的更底层的协议,比如:一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。

RMI使用了序列化方式在客户端和服务器端传递数据, 这样,我们就可以在远程方式下编写和使用对象,而不必知道它们实际上是远程的对象。

目标:

*无缝地支持在不同的Java虚拟机上的远程对象的使用。

*支持服务器到客户机的回调。

*用一种自然的方式在Java语言中集成分布对象模型,同时保持Java语言中的对象的主要语法

*使编写可靠的分布应用程序尽可能的简单。

*保持Java运行环境所提供的安全性。

二、RMI组成

一个正常工作的RMI系统由下面几个部分组成:

*远程服务的接口定义

*远程服务接口的具体实现

*桩(Stub)和框架(Skeleton)文件

*一个运行远程服务的服务器

*一个RMI命名服务,它允许客户端去发现这个远程服务

*类文件的提供者(一个HTTP或者FTP服务器)

*一个需要这个远程服务的客户端程序

三、原理示意图

方法调用从客户对象经占位程序(Stub)、远程引用层(RemoteReference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。

要完成以上步骤主要需要有以下几个步骤:

1、 生成一个远程接口

IHello.java代码如下:

import java.rmi.Remote;public interface IHello extends Remote {public String Hello(String name) throws java.rmi.RemoteException;}

2、 实现远程对象(服务器端程序)

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements IHello {// 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常  protected HelloImpl() throws RemoteException {super();}/*** 说明清楚此属性的业务含义*/private static final long serialVersionUID = 4077329331699640331L;public String Hello(String name) throws RemoteException {return "Hello " + name ;}public static void main(String[] args) {try {IHello hello = new HelloImpl();java.rmi.Naming.rebind("rmi://******/hello", hello);   //发布地址System.out.print("Ready");} catch (Exception e) {e.printStackTrace();}}
}

3、 生成占位程序和骨干网(服务器端程序)

4、 编写服务器程序

5、 编写客户程序

import java.rmi.Naming;
public class Hello_RMI_Client {public static void main(String[] args) {try {IHello hello = (IHello) Naming.lookup("rmi://*******/hello");   //同服务端,发布地址System.out.println(hello.Hello("杨晓敏"));} catch (Exception e) {e.printStackTrace();}}
}

6、 注册远程对象

7、 启动远程对象

四、优点

RMI以Java为核心,可与采用本机方法与现有系统相连接。这就是说,RMI可采用自然、直接和功能全面的方式为您提供分布式计算技术,而这种技术可帮助您以不断递增和无缝的方式为整个系统添加Java功能。

1、面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。

2、可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。

 3、设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型——就会失去设计方式上所提供的优点。

4、安全性:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。 RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。

5、便于编写和使用:RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。

远程接口实际上就是Java接口。 为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将作为远程对象引用。

【J2EE浅析】——RMI相关推荐

  1. CORBA/DCOM使用协议

    在TCP/IP之上,CORBA采用GIOP/IIOP协议,所有CORBA服务器以IIOP通信,形成了ORB软件通道;J2EE的RMI曾经采用独立的通信协议,目前已经改为RMI/IIOP,体现了J2EE ...

  2. WebService 与 DCOM / Corba 是什么关系?

    首先,COM/DCOM是组件/分布式组件模型标准,CORBA是分布式应用的服务标准.CORBA和DCOM为分布式应用程序建立服务和服务对象来执行客户端调用的服务.而SOAP是基于XML和HTTP的分布 ...

  3. 分布式系统之通信技术学习

    2019独角兽企业重金招聘Python工程师标准>>> 分布式系统之通信技术学习(导师leaderus) 1,几种常见的通信技术 1,RPC RPC是建立在socket通信基础之上的 ...

  4. SOA系列之 什么是SOA?

    什么是SOA?为什么要SOA? 任何一种新事物的出现都是为了达到一定目的的,提供一定的价值,这也就是其产生和发展的意义所在.弄清楚了这点,也就弄清楚了其本质. 一.IT:英文的全称为Informati ...

  5. 什么是SOA?为什么要SOA?

    任何一种新事物的出现都是为了达到一定目的的,提供一定的价值,这也就是其产生和发展的意义所在.弄清楚了这点,也就弄清楚了其本质. 一.IT:英文的全称为Information Techology,中文翻 ...

  6. 分布式系统架构的应用

    提到分布式计算技术的应用和工具,目前成熟的技术包括J2EE, CORBA和.NET(DCOM),这些技术牵扯的内容非常广,相关的书籍也非常多,本文不介绍这些技术的内容,也没有涉及这些技术的细节,只是从 ...

  7. java rmi 原理和使用浅析

    目录 定义 RMI远程调用步骤 JAVA RMI简单示例 定义 RMI: 远程方法调用(Remote Method Invocation),它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远 ...

  8. rmi远程代码执行漏洞_WebSphere 远程代码执行漏洞浅析(CVE20204450)

    作者:beijixiong404    文章来源:先知社区 漏洞简介 WebSphere是IBM的软件平台,它包含了编写.运行和监视全天候的工业强度的随需应变 Web 应用程序和跨平台.跨产品解决方案 ...

  9. J2EE开发平台:Eclipse之Appfuse浅析

    很久没来更新过Blog了,工作忙啊,从J2ME转换到J2EE,需要学习的东西好好多啊,再加上这两年纷至沓来的各种框架,简直让人有点目不暇接啊,但是,没办法啊,所有的用人单位都需要你这个的会,那个也得会 ...

最新文章

  1. 颠覆arXiv等传统论文平台?谷歌大牛强推的Distill进展如何?
  2. 1.7(java学习笔记)package和import
  3. redis集群搭建(基于docker)
  4. (转)完美画质 3D游戏反锯齿技术浅析 .
  5. 计算最后一个单词的字符串长度
  6. SpringBoot+Shiro+ehcache实现登录失败超次数锁定帐号
  7. 将linux系统分区变成逻辑卷,linux运维基础知识-系统分区及LVM逻辑卷的创建
  8. [网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
  9. Web后端开发入门(1)
  10. How to work with Ant
  11. 用opencv实现连连看外挂
  12. 去年做路由器的那帮兄弟都去哪儿了?
  13. gdal切火星偏移的瓦片
  14. 连续复利怎么用计算机算,请问银行的连续复利计算公式
  15. 戴尔Win10笔记本连接wifi后显示“无internet,安全”但可正常上网
  16. linux 磁盘空间查询
  17. C# XmlDocument处理XML元素节点
  18. python取数组的一列,numpy取数组前几列 怎样取numpy数组指定行列
  19. 为你解析--音视频会议系统
  20. 红外测试操作步骤_傅里叶红外测试步骤

热门文章

  1. 豆瓣api之OAuth认证
  2. 华为HubSpoke实验
  3. Unreal Engine 4 画线DrawLines 画轨道
  4. python 之 *args 和 **kwargs的区别
  5. (附源码)基于springboot的家政系统 毕业设计201524
  6. (附源码)springboot旅游公司网站设计 毕业设计110929
  7. 综合评价与决策方法(五)——主成分分析法
  8. 工业品电商进入中场,四大阵营谁将异军突起
  9. 解决Win10系统更新报0x800f0922错误代码,点关机却重启等问题
  10. window小皮composer安装laravel9