RMI的简单介绍。

RMI(Remote Method Invocation)协议 RMI(Remote Method Invocation,远程方法调用)是一种用于在分布式系统中实现对象之间通信的协议。它允许一个Java对象(客户端)调用另一个Java对象(服务器端)的方法,即使这两个对象运行在不同的虚拟机(JVM)中,甚至不同的物理机器上。RMI是Java语言中内置的分布式计算技术,主要用于构建分布式应用程序。 阅读详情

1.背景介绍
什么是RMI:

RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是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的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。

2.知识剖析

Java RMI与RPC的区别:

一:RPC 远程过程调用

RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。

一次RPC调用的过程大概有10步:

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

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

3.消息传送到远程主机

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

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

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

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

8.消息传回本地主机

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

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

二:RMI 远程方法调用

RMI:远程方法调用(Remote Method Invocation)。能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的对象上的方法。

RMI远程调用步骤:

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

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

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

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

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

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

7,客户获得返回值

三:RPC与RMI的区别

1:方法调用方式不同:

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

RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。

2:适用语言范围不同:

RMI只用于Java;

RPC是网络服务协议,与操作系统和语言无关。

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

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



RMI的结果统一由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。

RMI有什么优点:

1、面向对象:

RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。

也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。

2、可移动属性:

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

3、设计方式:

对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。

如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。

所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型

——就会失去设计方式上所提供的优点。

4、安全性:

RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。

RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。

5、便于编写和使用

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

远程接口实际上就是Java接口。

RMI有什么劣势:

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

对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。

3.常见问题

  1. springRMI指定的两个端口是什么?

  2. rmi为什么要抛RemoteException:

4.解决方案

(1)注册端口:registryPort 注册端口是RMI注册远程服务的端口。

 服务端口:servicePort    RMI的通讯需要的传送数据的端口。如果没有设置servicePort,则使用随机端口。

(2)由于远程方法的本质还是网络通信,只不过隐藏了底层实现,网络通信是经常会出现异常的,所以接口的所有方法都要抛出RemoteException来说明此方法是有风险的。

5.编码实战

6.扩展思考

Tuscany RMI端口问题:

RMI之所以使用的范围受限制主要有两方面原因,其一:必须要是java,平台的异构性受到限制;其二:穿越防火墙不方便。这里主要谈谈RMI如何通过固定分配端口来穿越防火墙。

RMI穿越防火墙不方便主要是因为除了RMI服务注册的端口(默认1099)外,与RMI的通讯还需要另外的端口来传送数据,而另外的端口是随机分配的,所以要想RMI的客户能通过防火墙来与RMI服务通讯,

第一种方法:

需要能让随机分配的端口固定下来,具体做法如下:

如果是spring+rmi,可以通过spring bean方式来指定两个端口,但是tuscany不行,需要自己写类来完成。

通过比对spring 的指定端口的源码发现

在这个类里

在这里插入图片描述

通过这个接口配置服务器相关配置

在RMIServerSocketFactory里 发现设置端口的接口,百度发现就是这个东西

在这里插入图片描述

继承它的实现,并重写

public class SMRMISocket extends RMISocketFactory {

private static Logger logger = LoggerFactory.getLogger(SMRMISocket.class);

@Override

public Socket createSocket(String host, int port) throws IOException {

    return new Socket(host,port);

}

@Override

public ServerSocket createServerSocket(int port) throws IOException {

if (port == 0) {

  port = 8089; //不指定就随机分配了

logger.info("port服务端端口号:" + port);

}

logger.info("服务端端口号:" + port);

 return new ServerSocket(port);

}

}

在main里调用:

RMISocketFactory.setSocketFactory(new SMRMISocket());

这样的话RMI分配的端口就被固定了,防火墙只需要打开1099和8089端口即可。

第二种方法:

在阿里云中开放所有的端口,这样不管rmi传送数据的是哪个端口都可以通过。

8.更多讨论

Q1:提问人:王耀其:

Tuscany内置容器是什么?

A1:回答人(何爽):

Tuscany内置的容器,并非是Jetty,而是Geronimo,Geronimo拥有管理web容器的能力,包括jetty,tomcat,MQ等等;

Q2:提问人:周宏浩

Tuscany-rmi端口固定有什么限制么?

A2:回答人(何爽):

Tuscany-rmi的端口固定可以随机固定端口,但注意不要端口冲突,一般10000之后的端口都可以随便使用。

Q3:提问人:周宏浩

spring-rmi和Tuscany-rmi有什么区别?

A3:回答人(何爽):

没有什么太大的区别,它们的实现机制都是一样的,推荐使用spring-rmi,因为它大部分已经封装好了,我们用时会比较方便,且Tuscany-rmi毕竟出来的时间已经很久了,切一直没有更新,现在处于无维护现状。

理解RMI、JRMP、JNDI、java反射 文章目录1. RMI2. JRMP3. JNDI4.实现的效果5. 利用方式终结参考文章 1. RMI RMI是一种行为,一种跨越主机进行远程方法调用的行为。 通俗点理解当前主机的一个java文件调用了远程某个主机上的某个java文件中的某个方法,这种行为就叫做RMI。 我们模拟一种场景: 远程主机上有一个类是cat。 当前主机上通过RMI这种行为调用了远程主机上的类来创建一个对象,并进行后续使用。 上面这种行为就是RMI。 2. JRMP 这是一个协议,用来定义RMI这行为过程中数据传输的规范。 R 阅读详情

相关推荐

Gromacs空蛋白模拟实战:从PDB文件到动力学轨迹的完整流程解析

本文详细解析了使用Gromacs进行空蛋白分子动力学模拟的完整实战流程。从PDB文件处理、力场选择与拓扑构建,到模拟盒子创建、溶剂化与电荷中和,再到能量最小化、NVT/NPT平衡及最终的生产模拟与基础分析,提供了每一步的命令详解和关键注意事项,旨在帮助计算生物学研究者系统掌握这一核心研究工具。

weixin_28454475的博客 275

Java——RMI详解

RMI 是 Java 提供的一个完善的简单易用的远程方法调用框架,采用客户/服务器通信方式,在服务器上部署了提供各种服务的远程对象,客户端请求访问服务器上远程对象的方法,它要求客户端与服务器端都是 Java 程序。RMI 框架采用代理来负责客户与远程对象之间通过 Socket 进行通信的细节。RMI 框架为远程对象分别生成了客户端代理和服务器端代理。位于客户端的代理必被称为存根(Stub),位于服务器端的代理类被称为骨架(Skeleton)。

吴声子夜歌的博客 9037

微型纵向加密在新能源场站中的实战部署与运维避坑指南

本文详细解析了微型纵向加密在新能源场站中的实战部署与运维技巧。通过国密算法SM4实现数据加密,确保新能源场站通信安全,同时提供非侵入式部署方案和运维避坑指南,帮助提升网络稳定性和运维效率。

weixin_30505225的博客 595

远程通信协议RMI原理

1、前言 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS 等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地...

长沙老码农 8387

Arduino智能小灯DIY:人体感应+光线感应+蓝牙控制全攻略(附完整代码)

本文提供了一份完整的Arduino智能小灯DIY制作指南。项目融合了人体感应、光线感应与蓝牙控制三大功能,通过详细的硬件清单、电路连接图、核心逻辑讲解及附带的完整代码,手把手教你打造一个能自动感知环境与人、并支持手机远程控制的智能照明装置,是入门智能家居和物联网开发的绝佳实践。

java5的博客 1093

virtuoso根据原理图绘制版图并联接_virtuoso画原理图

Virtuoso Schematic Editor 电路仿真一、Virtuoso Schematic Editor 实验目的:掌握电原理图(schematic)设计输入方法。 [1]启动 IC Design 软件 启动 软件: 开机后运行......2.绘制原理图 新建工程后打开的是默认的原理图文件 SCHEMATIC1 PAG...存盘 完成原理图的绘制后,将原理图存盘. 三 . 用 Check...

weixin_33536190的博客 4143

简单介绍RMI

这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能,本篇分享的是: 【 简单介绍RMI】 1.背景介绍 RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。 ...

IT修真院:初学者转行到互联网的聚集地 409

LED单元板驱动(HUB75接口)

开始之前先吐槽一下,搜这个的资料。要么都是Arduino,要么单片机的收费。小小的一个LED单元板,凭什么? 用Arduino是你速度快还是我ST,树莓派不好用?收费更离谱,这点东西还藏私?给你个中指凸。把原理都写出来看你怎么收费。 一、接口定义及原理 如图,有两个RGB通道,共占用6个IO。剩下的ABCDE为地址通道,LAT为行数据锁存通道,CLK为数据时钟,OE为低电平使能LED显示。图片这里没有E,证明它是16扫的,有E就会把B上面的地改为E。这样就是5位,2的5次方32扫。1.

a3748622的博客 3万+

RMI的简单介绍

大家好,我是IT修真院武汉分院第15期学员,一枚正直善良的JAVA程序员。 今天给大家分享一下,java学习中需要使用的RMI的简单介绍   1.背景介绍   RMI:远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地...

X1021333506的博客 521

MT6768平台Sensor Bring Up全流程实战:从驱动添加到问题排查(附避坑指南)

本文详细介绍了联发科MT6768平台Sensor Bring Up的全流程实战指南,从驱动添加、硬件配置到问题排查,提供了全面的避坑建议。内容涵盖环境准备、驱动文件集成、硬件接口配置、编译系统适配以及常见问题解决方案,帮助开发者高效完成传感器集成与调试工作。

weixin_30374009的博客 416

基于Codex Skill的抖音爆款分析与带货视频自动化生成实战

这次我们来看一个基于 Codex 的自动化内容创作项目。核心是利用 Codex 平台的能力,通过自定义的 Skill(技能)来拆解抖音爆款博主的视频模式,并自动生成自己的带货视频。对于内容创作者、电商运营或对短视频自动化感兴趣的技术开发者来说,这是一个将大语言模型(LLM)能力与具体业务场景深度结合的实战案例。 项目的核心价值在于流程自动化。它试图解决一个常见痛点:分析爆款视频的脚本结构、话术、节奏需要大量人工,而模仿创作又耗时费力。通过 Codex 的 Skill 机制,可以将“分析”和“生成”这两个环节

weixin_30420305的博客 381

Rmi的简单介绍

  RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之...

qq_39691226的博客 2205

Qwen2.5-Omni实战:5分钟搞定多模态AI模型本地部署(含Thinker-Talker架构解析)

本文详细介绍了Qwen2.5-Omni多模态AI模型的本地部署流程,包括硬件配置、环境准备和实战应用开发。特别解析了其创新的Thinker-Talker架构,该架构通过TMRoPE位置编码实现跨模态同步处理,大幅提升多模态任务效率。5分钟即可完成部署,适合开发者快速实现文本、图像和音频的联合处理。

weixin_29085865的博客 171

Java RMI详细介绍及简单实例

Java RMI详解 概要: Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。 Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。 大名鼎鼎的EJB都是建立在r...

azhegps的博客 390

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java远程方法调用RMI简单介绍

RMI介绍 RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的。经过多个JDK版本迭代,目前RMI的实现方式跟最开始底层实现还是有很大差别的。远程方法调用允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。 RMI使用JRMP(...

zhuguanghalo的博客 312

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

关于java RMI框架(远程方法调用)的简单介绍

RMI(即Remote Method Invoke 远程方法调用)。在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。JavaDoc描述:Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在“远程接口”(扩展 java.rmi.Remote 的接口)中

xiaoming1430026911的博客 304

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RMI介绍

      其实我近日有想法要请总坛主开设Java分布式应用版块,专门讨论Java分布式应用。如Jini,CORBA,RMI,RMI-IIOP等。更进一步,还包括各种技术之间的通讯等问题。比如RMI-IIOP和CORBA通讯,Jini访问CORBA对象,EJB到CORBA映射等高级问题。不过暂时还没有实现。所以姑且在此先讨论一下这些东西好了。RMI是Sun基于Java技术推出的一种分布式应用方案。

天高任鸟飞,海阔凭鱼跃 2751

java RMI原理详解

定义 RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里

xinghun_4的专栏 3万+

RMI 基础

这篇文章讲述Java2 平台中远程方法调用(RMI)技术的基础。简介:使用RMI进行分布式计算RMI(Remote Method Invocation,远程方法调用),在JDK1.1中被首次引入,它将网络编程提升到一个更高的层面。尽管相对来说,RMI比较易用,它仍然是一个引人注目的强大技术。它为普通的java开发者揭开了一个全新的角度——分布式对象计算的世界。这篇文章将对这个通用的技术作一个深度的介绍。RMI技术被认为形成于JDK1.1,在Java 2 SDK中得到显著提升。在应用时,RMI在这两个版本

Hufei的专栏 1754

RMI的简单使用?

这里是修真院后端小课堂,每篇分享文从 八个方面深度解析后端知识/技能,本篇分享的是: 【RMI的简单使用?】 大家好,我是IT修真院郑州分院第十期学员,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA任务七,扩展思考中的知识点——RMI的简单使用? 一、背景介绍 RPC (Remote Procedure Call):远程过程调用,用于一个进程调用另一个进程中的过程,从而...

learning__java的博客 465
上一篇: 什么叫MD5,MD5通常做什么用处
下一篇: 自增ID有什么坏处?什么样的场景下不使用自增ID?
learning__java
博客等级 码龄8年 87粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值