没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
13页
ava 远程方法调用(Remote Method Invocation, RMI)使得运行在一个 Java 虚拟机(Java Virtual Machine, JVM)的对象可以调用运行另一个 JVM 之上的其他对象的方法,从而提供了程序间进行远程通讯的途径。RMI 是 J2EE 的很多分布式技术的基础,比如 RMI-IIOP 乃至 EJB。本文是 RMI 的一个入门指南,目的在于帮助读者快速建立对 Java RMI 的一个感性认识,以便进行更深层次的学习。事实上,如果你了解 RMI 的目的在于更好的理解和学习 EJB,那么本文就再合适不过了。通过本文所了解的 RMI 的知识和技巧,应该足够服务于这个目的了。
资源推荐
资源详情
资源评论
Java R MI Tutorial
远程方法调用入门指南
Stephen Suen
Copyright © 2005 Stephen Suen. All rights reserved.
Java 远程方法调用(Remote Method Invocation, RMI)使得运行在一个 Java 虚拟机(Java Virtual
Machine, JVM)的对象可以调用运行另一个 JVM 之上的其他对象的方法,从而提供了程序间进行
远程通讯的途径。RMI 是 J2EE 的很多分布式技术的基础,比如 RMI-IIOP 乃至 EJB。本文是 RMI
的一个入门指南,目的在于帮助读者快速建立对 Java RMI 的一个感性认识,以便进行更深层次的
学习。事实上,如果你了解 RMI 的目的在于更好的理解和学习 EJB,那么本文就再合适不过了。通
过本文所了解的 RMI 的知识和技巧,应该足够服务于这个目的了。
本文的最新版本将发布在程序员咖啡馆网站上(建设中)。欢迎订阅我们的邮件组,以获得关于本
文的正式发布及更新信息。
全文在保证完整性,且保留全部版权声明(包括上述链接)的前提下可以在任意媒体转载——须保
留此标注。
目录
1. 简介
2. 分布式对象
3. RMI 架构
4. RMI 对象服务
5. 实战 RMI
6. 定义远程接口
7. 实现远程接口
8. 引导程序
9. 客户端程序
10. 编译示例程序
11. 运行示例程序
12. 其它信息
13. 参考资料
1. 简介
我们知道远程过程调用(Remote Procedure Call, RPC)可以用于一个进程调用另一个进程(很可
能在另一个远程主机上)中的过程,从而提供了过程的分布能力。Java 的 RMI 则在 RPC 的基础上
向前又迈进了一步,即提供分布式 对象间的通讯,允许我们获得在远程进程中的对象(称为远程对
象)的引用(称为远程引用),进而通过引用调用远程对象的方法,就好像该对象是与你的客户端
代码同样运行在本地进程中一样。RMI 使用了术语"方法"(Method)强调了这种进步,即在分布式
基础上,充分支持面向对象的特性。
RMI 并不是 Java 中支持远程方法调用的唯一选择。在 RMI 基础上发展而来的 RMI-IIOP(Java
Remote Method Invocation over the Internet Inter-ORB Protocol),不但继承了 RMI 的大部分优点,
并且可以兼容于 CORBA。J2EE 和 EJB 都要求使用 RMI-IIOP 而不是 RMI。尽管如此,理解 RMI
将大大有助于 RMI-IIOP 的理解。所以,即便你的兴趣在 RMI-IIOP 或者 EJB,相信本文也会对你很
有帮助。另外,如果你现在就对 API 感兴趣,那么可以告诉你,RMI 使用 java.rmi 包,而 RMI-
IIOP 则既使用 java.rmi 也使用扩展的 javax.rmi 包。
本文的随后内容将仅针对 Java RMI。
2. 分布式对象
在学习 RMI 之前,我们需要了解一些基础知识。首先需要了解所谓的分布式对象(Distributed
Object)。分布式对象是指一个对象可以被远程系统所调用。对于 Java 而言,即对象不仅可以被同
一虚拟机中的其他客户程序(Client)调用,也可以被运行于其他虚拟机中的客户程序调用,甚至可
以通过网络被其他远程主机之上的客户程序调用。
下面的图示说明了客户程序是如何调用分布式对象的:
从图上我们可以看到,分布式对象被调用的过程是这样的:
1. 客户程序调用一个被称为 Stub (有时译作存根,为了不产生歧义,本文将使用其英文形式)的客户
端代理对象。该代理对象负责对客户端隐藏网络通讯的细节。Stub 知道如何通过网络套接字
(Socket)发送调用,包括如何将调用参数转换为适当的形式以便传输等。
2. Stub 通过网络将调用传递到服务器端,也就是分布对象一端的一个被称为 Skeleton 的代理对象。
同样,该代理对象负责对分布式对象隐藏网络通讯的细节。Skeleton 知道如何从网络套接字
(Socket)中接受调用,包括如何将调用参数从网络传输形式转换为 Java 形式等。
3. Skeleton 将调用传递给分布式对象。分布式对象执行相应的调用,之后将返回值传递给 Skeleton,
进而传递到 Stub,最终返回给客户程序。
这个场景基于一个基本的法则,即行为的定义和行为的具体实现相分离。如图所示,客户端代理对
象 Stub 和分布式对象都实现了相同的接口,该接口称为远程接口(Remote Interface)。正是该接
口定义了行为,而分布式对象本身则提供具体的实现。对于 Java RMI 而言,我们用接口
(interface)定义行为,用类(class)定义实现。
3. RMI 架构
RMI 的底层架构由三层构成:
首先是 Stub/Skeleton 层。该层提供了客户程序和服务程序彼此交互的接口。
然后是远程引用(Remote Reference)层。这一层相当于在其之上的 Stub/Skeleton 层和在其之下
的传输协议层之前的中间件,负责处理远程对象引用的创建和管理。
最后是传输协议(Transport Protocol) 层。该层提供了数据协议,用以通过线路传输客户程序和远
程对象间的请求和应答。
这些层之间的交互可以参照下面的示意图:
和其它分布式对象机制一样,Java RMI 的客户程序使用客户端的 Stub 向远程对象请求方法调用;
服务器对象则通过服务器端的 Skeleton 接受请求。我们深入进去,来看看其中的一些细节。
注意: 事实上,在 Java 1.2 之后,RMI 不再需要 Skeleton 对象,而是通过 Java 的反射机制
(Reflection)来完成对服务器端的远程对象的调用。为了便于说明问题,本文以下内容仍然基于
Skeleton 来讲解。
当客户程序调用 Stub 时,Stub 负责将方法的参数转换为序列化(Serialized)形式,我们使用一个
特殊的术语,即编列(Marshal)来指代这个过程。编列的目的是将这些参数转换为可移植的形式,
从而可以通过网络传输到远程的服务对象一端。不幸的是,这个过程没有想象中那么简单。这里我
们首先要理解一个经典的问题,即方法调用时,参数究竟是传值还是传引用呢?对于 Java RMI 来
说,存在四种情况,我们将分别加以说明。
对于基本的原始类型(整型,字符型等等),将被自动的序列化,以传值的方式编列。
剩余12页未读,继续阅读
资源评论
- xyh_sky232015-03-17没大多实用性
神州北望
- 粉丝: 8
- 资源: 36
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功