这里简单说一下RMI和RPC的区别。

什么是RMI

RMI(Remote Method Invocation,远程方法调用),能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚拟机中的对象上的方法,是Java在JDK1.1中实现的,大大增强了Java开发分布式应用的能力,使用的代表是EJB。

RMI是Java的一组用户开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单来说,这样使得原来的程序在同一操作系统的方法调用变成了不同操作系统之间程序的方法调用。由于J2EE是分布式程序平台,它以RMI机制实现了程序组件在不同的操作系统之间的通信。比如一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。

RMI远程方法调用的步骤

1.客户对象调用客户端辅助对象stub上的方法。

2.客户端辅助对象stub打包调用信息(变量、方法名),通过网络发送给服务端辅助对象skeleton。

3.服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在的对象。

4.调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton。

5.服务端辅助对象将结果打包,发送给客户端辅助对象stub。

6.客户端辅助对象将返回值解包,返回给调用者。

7.客户对象获得返回值。

RMI的局限性

1.RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候却可能不知道将来的服务器IP和端口如何,而客户端程序调用是依赖这个IP和端口的。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。注意:我们在实际开发中,我们是知道服务器IP和端口的。

2.RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用WebService或者公用对象请求代理体系(CORBA)来实现。

什么是RPC

RPC(Remote Procedure Call Protocol,远程过程调用协议),是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,使用的代表是Dubbo。RPC不依赖于具体的网络传输协议,TCP、UDP等都可以。

由于存在各式各样的变换和细节差异,相应的RPC也派生出了各式远程过程通信协议。RPC是跨语言的通信标准,SUN和微软都有其实现。比如RMI可以被看作SUN对RPC的Java版本(实现),而微软的DCOM就是建立在ORPC协议之上的。简单理解就是,RPC是一个协议,无论是SUN的RMI还是微软的DCOM都是对该协议的不同实现,二者都为编程人员提供了应用RC技术的程序接口(API)。

RPC远程过程调用的步骤

1.执行客户端调用语句,传送参数。

2.调用本地系统发送网络消息。

3.消息传送到远程主机。

4.服务器得到消息并获得参数。

5.根据调用请求以及参数执行远程过程(服务)。

6.执行过程完毕后,将结果返回服务器句柄。

7.服务器句柄返回结果,调用远程主机的系统网络服务发送结果。

8.消息传回本地主机。

9.客户端句柄从本地主机的网络服务接收消息。

10.客户端接收到调用语句返回的结果数据。

RMI与RPC的区别

1.方法调用的方式不同

RMI调用方法是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(Stub对象)上,那么这个新方法就不能被RMI客户方所调用。简单理解就是,远程方法需要先在远程接口上注册才能使用。

RPC调用函数是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成【classname.*methodname(参数集)】的形式。这就向RPC服务器表明了,被请求的方法是在classname类中,方法名是methodname。然后RPC服务器就会去搜索与之相匹配的类和方法,并把它作为方法参数类型的输入。这里的参数类型是与PRC请求中的类型相匹配的,一旦匹配成功,这个方法就被调用了,并会将执行结果编码后通过网络协议发回。

2.适用语言的范围不同

RMI只适用于Java并支持传输对象。

PRC是基于C语言的,并不支持传输对象,是网络服务的协议,与操作系统和语言无关。

3.调用结果的返回形式不同

因为Java是面向对象的,所以RMI也是面向对象的,RMI的调用结果可以是对象类型或者是基本数据类型。

PRC的返回结果统一由外部数据表示(External Data Representation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异,只有由XDR定义的数据类型才能被传递,可以说RMI是面向对象方式的Java RPC。

扩展阅读

Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实RMI可以被看作是RPC的Java版本(实现)。

传统RPC并不能很好地应用于分布式对象系统,而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

RMI目前使用Java远程消息交换协议(JRMP,Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,Java RMI具有Java的【Write Once,Run Anywhere】的优点,是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,Java运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。

"我再也遇不到第二个你。"

rmi与rpc的区别的更多相关文章

  1. Java RMI与RPC的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html  一:RPC 远程过程调用 RPC(Remote Procedure Call Prot ...

  2. 面试题思考:Java RMI与RPC,JMS的比较

    RPC:(Remote Procedure Call)  被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异. 支持多语言 RMI:(Remote Method Invo ...

  3. RPC、RMI、REST的区别

    初入职场,接触了不少企业常用的技术,与学校实训使用的技术有很大差异,在这里记录一下RPC.RMI与REST的区别. 概念 RPC(Remote Procedure Call,远程过程调用) 一种通过从 ...

  4. SOA,Webservice,SOAP,REST,RPC,RMI,JMS的区别与联系(转载)

    原文地址:http://blog.csdn.net/pcceo1/article/details/51245249 SOA面向服务的软件架构(Service Oriented Architecture ...

  5. 转 RMI、RPC、SOAP通信技术介绍及比对

    http://www.open-open.com/home/space.php?uid=37924&do=blog&id=8974 1.RMI 使用java的程序员,对于RMI(Rem ...

  6. RMI、RPC、SOAP通讯技术介绍及比对 - XML/SOAP

    RMI.RPC.SOAP通信技术介绍及比对 1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方 ...

  7. RMI、RPC、SOAP通信技术介绍及比对

    1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方便调用远程对象,java提供了RMI的API ...

  8. RMI,RPC,SOAP对比分析

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp60   1.RMI     使用java的程序员,对于RMI(Remot ...

  9. MQ & RPC 消息队列与RPC的区别与使用场景

    MQ:  区别:面向数据.生产者与消费者.有缓冲节点.异步.系统级/模块级通信 选型:RabbitMQ.ActiveMQ/Apollo.ZeroMQ.memcacheQ.Redis.MSMQ.kafk ...

随机推荐

  1. CentOS6和CentOS7进入单用户模式重置root密码

    一.前言 如果在Linux系统下root密码丢失或者需要破解物理机器用户密码,可以通过进入系统单用户模式进行重置root密码.本文介绍CentOS6和CentOS7两个系统版本进行root密码重置. ...

  2. Windows10 中的字母映射表

    有很多朋友为寻找特殊字符串而感到烦恼, windows10中的字符映射表有所有字体 包含的特殊符号 windows键 + R键 输入 charmap 点击确定 即可出现 字母映射表 可在字符的下拉按钮 ...

  3. tomcat session共享

    1.版本 redis3.2   nginx   tomcat8.5 2.下载jar包  tomcat-cluster-redis-session-manager 解压后大家可以看看 readMe.tx ...

  4. linux之寻找男人的帮助,man和info,

    1.在linux下寻求帮助是一个很好的习惯,幸运的是系统提供了帮助的命令man和info,由于linux指令很多,记忆起来简直麻烦,比如以a开头的指令有100条,linux命令算起来得几千条,记忆却是 ...

  5. JS---涉及到的common.js

    //格式化日期的代码 //获取指定标签对象 //获取元素的文本内容 //获取元素的文本内容 //获取父级元素中的第一个子元素 //获取父级元素中的最后一个子元素 //获取某个元素的前一个兄弟元素 // ...

  6. Android 框架布局 FrameLayout

    <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" ...

  7. PuppeteerSharp读取页面完整HTML(.NetCore)

    1.使用NUGET安装PuppeteerSharp 通过工具或者命令方式安装 2.初始化浏览器 await new BrowserFetcher().DownloadAsync(BrowserFetc ...

  8. oop面向对象【接口、多态】

    今日内容 1.接口 2.三大特征——多态 3.引用类型转换 教学目标 1.写出定义接口的格式 2.写出实现接口的格式 3.说出接口中成员的特点 4.能够说出使用多态的前提条件 5.理解多态的向上转型 ...

  9. Dockerfile制作镜像

    Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建m ...

  10. 【30天自制操作系统】day03:读写磁盘

    软盘 80个柱面,2个磁头,18个扇区 每个扇区 512 字节,共 1440 KB 读磁盘汇编 读取 10 个柱面到 0x0820 内存位置 ;读取磁盘 MOV AX,0x0820 MOV ES,AX ...