RMI规范--三

Java远程方法调用(RMI)技术详解 Java RMI(远程方法调用)采用三层架构实现分布式通信,包含注册表服务、服务端和客户端三大核心组件。服务端通过导出远程对象并绑定到注册表,客户端通过接口契约查找并调用远程方法。RMI采用租约机制管理远程对象生命周期,通过引用计数和定期续租实现分布式垃圾回收。开发时需要严格分离服务端与客户端代码,通过模块化部署确保安全性,并注意注册表必须与服务器同机部署。RMI架构隐藏了底层网络通信细节,使远程调用语法与本地调用保持一致,同时处理了对象定位、参数序列化和异常处理等分布式环境下的复杂问题。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> RMI规范--第三章 主题: Stub 与 skeleton 远程方法调用中的线程使用 远程对象的垃圾收集 动态类的加载 通过代理服务器透过防火墙的 RMI 3.1 Stub 与 skeleton 在与远程对象的通信过程中,RMI 将使用标准机制(用于 RPC 系统):stub 与 skeleton。远程对象的 stub 担当远程对象的客户本地代表或代理人角色。 调用程序将调用本地 stub 的方法,而本地 stub 将负责执行对远程对象的方 法调用。在 RMI 中,远程对象的 stub 与该远程对象所实现的远程接口集相同。 调用 stub 的方法时,将执行下列操作: 初始化与包含远程对象的远程虚拟机的连接。 对远程虚拟机参数的进行编组(写入并传输) 等待方法调用结果 解编(读取)返回值或返回的异常 将值返给调用程序 为向调用程序展示比较简单的调用机制,stub 将参数的序列化和网络级通信隐 藏了起来。 在远程虚拟机中,每个远程对象都可以有相应的 skeleton(纯 JDK1.2 环境中 不需要 skeleton)。skeleton 负责将调用分配给实际的远程对象实现。它在 接收入进入方法调用时执行下列操作: 解编(读取)远程方法的参数 调用实际远程对象实现上的方法 将结果(返回值或异常)编组(写入并传输)给调用程序 由于推出于 JDK1.2 及附加的 stub 协议,使得在纯 JDK1.2 环境中无需使用 skeleton。相反,应使用通用代码代替 JDK1.1 中的 skeleton 履行其职责。 stub 和 skeleton 由 rmic 编译器生成。 3.2 远程方法调用中的线程使用 RMI 运行时分配给远程对象实现的方法可能在也可能不在独立的线程中执行。 RMI 运行时将无法担保远程对象与线程的映射关系。因为同一个远程对象的远程 方法调用可能会同时执行,所以远程对象实现需确保其实现是线程安全的。 3.3 远程对象的垃圾收集 与在本地系统中相同,在分布式系统中自动删除那些不再被任何客户机引用的远 程对象是令人满意的。这可以将程序员从跟踪远程对象客户机以便适时终止的任 务中解脱出来。RMI 使用与 Modula-3 网络对象相似的引用计数的垃圾收集算 法(参见 1994 年 5 月数字设备公司系统研究中心技术报告 115 中 Birrell、 Nelson 和 Owicki 的“网络对象”)。 要实现引用计数垃圾收集,RMI 运行时需要跟踪每个 Java 虚拟机内的所有活 动引用。当活动引用进入 Java 虚拟机时,其引用计数将加 1。首次引用某对 象时会向该对象的服务器发送“referenced”消息。当发现活动引用在本地虚 拟机中并未被引用时,该数将减 1。放弃最后的引用时,未被引用的消息将被发 送到服务器。协议中存在很多微妙之处,其中大部分都与维护引用或未引用消息 的次序有关,可确保对象不被过早地收集。 当某远程对象不被任何客户机所引用时,RMI运行时将对其进行弱引用。如果不存在该 对象的其它本地引用,则弱引用将允许 Java 虚拟机的垃圾收集器放弃该对象。 通过保持对对象的常规引用或弱引用,分布式垃圾收集算法可与本地 Java 虚拟 机的垃圾收集器以常规方式进行交互。 只要存在对远程对象的本地引用,就不能将远程对象当作垃圾进行收集,而且该 远程对象也可在远程调用中传送或返回客户机。传递远程对象也将同时把目标虚 拟机的标识符添加到被引用集中。需要未引用通知的远程对象必须实现 java.rmi.server.Unreferenced 接口。当这些引用不再存在时,将调用 unreferenced 方法。当发现引用集为空时,也将调用 unreferenced。因此, unreferenced 方法可能会被多次调用。只有当没有本地和远程引用时,才可收集 远程对象。 注意,如果在客户机和远程服务器对象之间存在网络分区,则可能会过早地收集 、远程对象(因为传输可能认为客户机已失效)。由于可能会出现过早收集的现 象,因此远程引用将不能保证引用的完整性。换句话说,远程引用实际上可能指 向不存在的对象。使用此类引用时将抛出必须由应用程序处理的 RemoteExcepti on。 3.4 动态类加载 RMI 允许传入 RMI 调用中的参数、返回值和异常为任何可序列化对象。RMI 使 用对象序列化机制将数据从一个虚拟机传输到另一个虚拟机,同时用相应的位置 信息注释调用流,以便在接收端上加载类定义文件。 当解编远程方法调用的参数和返回值以使之成为接收虚拟机中的有效对象时,流 中所有类型的对象都需要类定义。解编进程将首先尝试通过本地类加载上下文( 当前线程的上下文类加载器)中的名称来解析类。RMI 也提供动态加载作为参数 和返回值传送的实际对象类型的类定义的手段(其中远程方法调用的参数和返回 值来自传送终点所指定的网络位置)。这包括远程 stub 类的动态下载 - 该类 对应于特定远程对象实现类(用于包含远程引用)及 RMI 调用中通过值传送的 任何其它类型,例如在解编端的类加载上下文中尚不可用的,声明参数类型的子 类。 要支持动态类加载,RMI 运行时应使用用于编组、解编 RMI 参数和返回值的编 组流的特定 java.io.ObjectOutputStream 和 java.io.ObjectInputStream 子类。这些子类覆盖了 ObjectOutputStream 的 annotateClass 方法和 ObjectInputStream 的 resolveClass 方法,以便就何处定位包含对应于流中 类描述符的类定义的类文件交换信息。 对于每个写入 RMI 编组流的类描述符,annotateClass 方法将把类对象调用 java.rmi.server.RMIClassLoader.getClassAnnotation 的结果添加到流中。 该结果可能为空,也可能是表示 codebase URL 路径(以空格分隔的 URL 列表) 的 String 对象。利用该 codebase URL 路径,远程终点可下载所给类的定义 文件。 对于从 RMI 编组流中读取的每个类描述符,resolveClass 方法将从流中读取 单个对象。如果该对象是 String(且 java.rmi.server.useCodebaseOnly 属性不是 true),则 resolveClass 将返回调用 RMIClassLoader.loadClass 的结果,并以所注解的 String 对象作为第一个参数,以类描述符中所需类名作 为第二个参数。否则,resolveClass 将返回调用 RMIClassLoader.loadClass 的结果,并以所需的类名作为唯一参数。 有关 RMI 中类加载的详细信息,参见“RMIClassLoader 类”(5.6)一节。 3.5 通过代理服务器透过防火墙的 RMI RMI 传输层通常试图将直接套接字在Internet的主机上打开。然而,许多Intranet 的防火墙不允许这样做。因此,缺省 RMI 传输提供两种基于 HTTP 的机制,可 使防火墙后的客户机调用驻留在防火墙外的远程对象方法。 3.5.1 如何将 RMI 调用包装在 HTTP 协议内 要透过防火墙,传输层可在防火墙信任的 HTTP 协议范围内嵌入 RMI 调用。将 RMI 调用数据作为 HTTP POST 请求的主体发送出去后,反馈信息将返回到 HTTP 响应主体内。传输层可通过以下两种方法构造 POST 请求: 1. 如果防火墙代理服务器可以把 HTTP 请求定向到主机的任意端口,HTTP 请求就会被直接转发到 RMI 服务器正在监听的端口上。目标计算机上的缺省RMI 传输层可通过能识别并解码 POST 请求内的 RMI 调用的服务器套接字进行监听。 2. 如果防火墙代理服务器只能把 HTTP 请求定向到某个已知的 HTTP 端口, 该调用就会被转发到正在主机端口 80 上监听的 HTTP 服务器,而且将执行 CGI 脚本以转发对同一计算机上目标 RMI 服务器端口的调用。 3.5.2 缺省套接字工厂 RMI 传输扩展 java.rmi.server.RMISocketFactory 类以提供作为客户机和服 务器套接字源提供者的套接字工厂的缺省实现。该缺省套接字工厂可创建套接字 以透明地提供防火墙通道机制,如下所示: 客户机套接字将自动尝试与无法用直接套接字联系的主机进行 HTTP 连接。 服务器套接字将自动检测新近接收的连接是否 HTTP POST 请求,如果是,则只 将请求主体送给传输层,同时将其输出格式转化为 HTTP 响应。 工厂的 java.rmi.server.RMISocketFactory.createSocket 方法将提供带有 此缺省行为的客户机端套接字。工厂的 java.rmi.server.RMISocketFactory.createServerSocket 方法将提供带有此缺省行为的服务器端套接字。 3.5.3 配置客户机 无需特别配置即可使客户机透过防火墙发送 RMI 调用。 但如果将 java.rmi.server.disableHttp 属性的布尔值设置为“true”,客 户机即可禁止将 RMI 调用包装为 HTTP 请求。 3.5.4 配置服务器 ------------------------------------------------------------------ 注意 - 主机名不应为主机的 IP 地址,因为某些防火墙代理服务器不传送这种 主机名。 ------------------------------------------------------------ 1. 服务器主机域外的客户机要想调用服务器远程对象的方法,则必须找到该 服务器。因此,服务器导出的远程引用必须包含服务器主机的全名。 本信息可否用于运行服务器的 Java 虚拟机,取决于服务器平台和网络环境。 如果不可用,则启动服务器时必须通过 java.rmi.server.hostname 属性指定主 机的全名。 例如,在 chatsubo.javasoft.com 上可用以下命令启动 RMI 服务器类 ServerImpl: java -Djava.rmi.server.hostname=chatsubo.javasoft.com ServerImpl 2. 如果服务器不支持防火墙后可传送到随意端口的 RMI 客户机,则可使用 如下配置: a. HTTP 服务器在端口 80 上监听。 b. CGI 脚本的位置为别名 URL 路径 /cgi-bin/java-rmi.cgi 该脚本: - 调用本地 Java 解释程序以执行可将请求传送到适当 RMI 服务器端口的传 输层内部类。 - 在 Java 虚拟机中,以与 CGI 1.0 环境变量相同的名称和值定义属性。 用于 Solaris 和 Windows 32 操作系统的 RMI 分布式版本中提供了示例脚 本。注意,脚本必须指定服务器上 Java 解释程序的完整路径。 3.5.5 性能问题与局限 在不考虑代理服务器传送延迟的情况下,由 HTTP 请求传送调用至少要比通过直 接套接字传送慢一个数量级。 因为透过防火墙只能在一个方向初始化 HTTP 请求,同时防火墙外的主机也无法 回调客户机的方法调用,所以客户机无法将其自身的远程对象导到防火墙以外。 RMI规范--二 RMI规范--三 RMI规范--四 RMI规范--五 RMI规范--六 RMI规范--七 RMI规范--八 RMI规范--九
Rpc与RMI服务 在本篇的结尾,我们来个彩蛋,还记得上面RMI的注册表吗?前面我们是通过JDK的exe程序启动的,那么我们能不能自己开发或者自己启动RMI注册表呢?其实是可以的,在包中有个Registry接口,并且该接口有个默认的实现类,其实JDK源码中Naming类就是使用的实现的注册和调用,那么我们来看看的方法:自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 阅读详情

相关推荐

Android投屏开发实战:手把手教你用Miracast实现Sink端功能(附完整代码)

本文是一份Android投屏Sink端开发的实战指南,详细讲解了如何利用Miracast协议和Wi-Fi P2P技术,从零构建一个功能完整的屏幕接收器。内容涵盖环境搭建、通过反射启用WFD Sink模式、RTSP协议协商、RTP流接收与解析,以及最终使用IjkPlayer进行音视频解码播放的全过程,并附有核心代码示例。

cherry的博客 882

J2EE规范(三)之RMI和JSP

1.RMI:RMI是Remote Method Invocation的简称。简单来讲一个RMI对象是一个远 程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。其简单原理图如下: 其中Stub和Skeleton所扮演的都是代理角色,stub作为客户端的代

在奋斗的路上 1758

Keil5 安装与卸载全攻略:从零开始到完美避坑

本文提供了Keil5集成开发环境的完整安装与卸载指南。针对嵌入式开发新手,详细解析了安装前的关键准备、MDK核心与C51双环境的安装激活步骤、常见问题排查,并重点介绍了如何彻底卸载软件以避免残留问题,帮助用户从零开始搭建稳定高效的开发环境。

weixin_29172963的博客 636

从代码层面看RMI规范的实现与攻击原理(三)

从代码层面看RMI规范的实现与攻击原理(三)

Armandhe的博客 2324

【文本分析学习】Anaconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) NLTK

文本分析学习之 Anadconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码)

littlexmj的博客 2333

PostgreSQL数据库全攻略:从入门到精通

本文是一份PostgreSQL数据库综合指南,涵盖安装配置、基础操作和高级管理。主要内容包括:1) PostgreSQL简介与各平台安装方法;2) 数据库基本操作,如创建数据库/表、CRUD操作、用户权限管理;3) 高级功能包括索引优化、事务控制、视图、存储过程、触发器和扩展模块;4) 数据库管理维护,涉及配置调优、备份恢复、性能监控和日常维护;5) 安全设置与高可用方案。指南提供了从入门到进阶的实用知识,强调结合官方文档进行深入学习,帮助用户高效使用这一功能强大的开源关系型数据库系统。

索大神的博客 1970

java RMI原理详解

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

xinghun_4的专栏 3万+

智能车竞赛必备:STC32G144K开源库实战指南(含总钻风摄像头配置)

本文为智能车竞赛参赛者提供了一份基于STC32G144K微控制器与逐飞开源库的实战开发指南。文章详细介绍了从开发环境搭建、总钻风摄像头驱动配置与图像采集优化,到核心控制算法实现与多任务调度等关键步骤,旨在帮助队伍快速构建稳定高效的视觉处理系统,提升竞赛竞争力。

weixin_29191081的博客 716

RMI规范(4)

RMI规范--第四章 客户机接口 程序员在编写使用远程对象的 applet 或应用程序时,需要注意 java.rmi 包 中可用的 RMI 系统客户机可视接口。 4.1 远程接口 package java.rmi; public interface Remote {} java.rmi.Remote 接口用来识别所有远程接口;所有远程对象必须直接或间接 实现此接口。 实现类可以

morningbird的专栏 1257

科研必备:15款顶尖AI科研工具全面分析汇总(持续更新ing)

科研必备:15款AI科研工具全面分析汇总(持续更新ing)

Code_流苏:在代码中寻诗意,在实践中觅真知 9676

YOLOv11涨点改进 | 全网独家创新,损失函数改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

本文提出了一种改进YOLOv11模型的AdaFocalLoss损失函数,通过动态调节机制有效提升小目标检测性能。AdaFocalLoss融合了目标尺寸感知和IoU引导的自适应调节,解决了传统损失函数在小目标检测中的样本不平衡问题。该方法自动调整训练权重,无需手动调参,显著提升了模型在多尺度目标、复杂背景下的检测精度和训练稳定性。实验表明,AdaFocalLoss能更好地平衡不同尺度目标的梯度分布,改善边界完整性,减少误检漏检。文章详细介绍了算法原理、实现代码和在YOLOv11中的集成方法,为提升目标检测性能

Ai缝合怪、助力小伙伴高效发论文 337

RMI规范(6) --(10)

RMI规范(6) 注册服务程序接口 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- 第 6 章 RMI 系统使用 java.

bluevoyage的专栏 1万+

定位教程7---旋转中心标定之方法二

手算相机相对机器人关系

Quintin 6231

RMI规范(3)

RMI规范--第三章 主题: Stub 与 skeleton 远程方法调用中的线程使用 远程对象的垃圾收集 动态类的加载 通过代理服务器透过防火墙的 RMI 3.1 Stub 与 skeleton 在与远程对象的通信过程中,RMI 将使用标准机制(用于 RPC 系统):stub 与 skeleton。远程对象的 stub 担当远程对象的客户本地代表或代理人角色。 调用程序将调用本地 s

morningbird的专栏 1183

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

RMI规范(2)

RMI规范--第二章 Java 分布式对象模型 2.1 分布式对象应用程序 RMI 应用程序通常包括两个独立的程序:服务器程序和客户机程序。典型的服务 器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机 调用那些远程对象上的方法。而典型的客户机程序则从服务器中得到一个或多个 远程对象的引用,然后调用远程对象的方法。RMI 为服务器和客户机进行通讯 和信息传递提供了一种机

morningbird的专栏 1989

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RMI规范(5)

RMI规范--第五章 服务器接口 java.rmi.server 包包含通常用于实现远程对象的接口与类。 主题: RemoteObject 类 RemoteServer 类 UnicastRemoteObject 类 Unreferenced 接口 RMISecurityManager 类 RMIClassLoader 类 LoaderHandler 接口 RMI 套接字工厂 RMIFai

morningbird的专栏 1167

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RMI介绍

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

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

RMI规范--第二 -- 五章

?RMI规范--第二章 Java 分布式对象模型 。。RMI规范--第三章 主题: Stub 与 skeleton;; 远程方法调用中的线程使用 ;;远程对象的垃圾收集;;动态类的加载;;通过代理服务器透过防火墙的 RMI ;;。。RMI规范--第四章 客户机接口;; 程序员在编写使用远程对象的 applet 或应用程序时,需要注意 java.rmi 包中可用的 RMI 系统客户机可视

bluevoyage的专栏 1694

RMI规范(10)

RMI 通信协议 10.1 概述 RMI 协议使用另两个协议作为其在通信格式:Java 对象序列化和 HTTP。对象序 列化协议用于编组调用和返回数据。HTTP 协议用于“投寄”远程方法调用,并在 情况允许时获得返回数据。每种协议都有专门的语法文档。产品规则中的非终结 符号可能会引用其它协议(对象序列化或 HTTP)所管理的规则。在跨协议边界时 ,后续产品将使用该嵌入的协议。 关于语法符号

morningbird的专栏 1024

RMI规范–第十章 RMI 通信协议

RMI规范–第十章 RMI 通信协议 (转贴) 10.1 概述RMI 协议使用另两个协议作为其在通信格式:Java 对象序列化和 HTTP。对象序列化协议用于编组调用和返回数据。HTTP 协议用于“投寄”远程方法调用,并在情况允许时获得返回数据。 每种协议都有专门的语法文档。产品规则中的非终结符号可能会引用其它协议(对象序列化或 HTTP)所管理的规则。在跨协议边界时,后续产品将使用该...

jybzjf的专栏 1434

【Dongle】【Java】规范之RMI

RMI(Remote Method Invoke):remote(遥远的) invoke(调用),RMI是一种被EJB使用的更底层的协议,能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。

郑晓东 廊坊师范学院信息技术提高班 十二期 657

RMI规范--五

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 442

RMI规范--四

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 262

RMI规范

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 443

什么是RMI

大家好,我是IT修真院武汉分院第15期的学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务8的知识点——什么是RMI 1.背景介绍 2.知识剖析 3.常见问题 4.编码实战 5.扩展思考 6.参考文献 7.更多讨论   1.背景介绍 RMI全称是Remote Method Invocation-远程方法调用,是纯Java的网络分布式应用系统的核心...

qq_42218123的博客 4011

从懵逼到恍然大悟之Java中RMI的使用

此处讲的是Java中的RMI,而不是通用意义上的RMI,关于通用的RMI可以参考分布式之RPC的协议以及错误处理 这篇文章。一、Java RMI简介Java RMI用于不同虚拟机之间的通信,这些虚拟机可以在不同的主机上、也可以在同一个主机上;一个虚拟机中的对象调用另一个虚拟上中的对象的方法,只不过是允许被远程调用的对象要通过一些标志加以标识。

lmy86263的博客 8万+
上一篇: RMI规范--六
下一篇: RMI规范--四
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值