`
joknm
  • 浏览: 61926 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

利用RMI实现JAVA分布式应用

    博客分类:
  • JAVA
阅读更多
Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,他大大增强了Java研发分布式应用的能力。Java作为一种风靡一时的网络研发语言,其巨大的威力就体目前他强大的研发分布式网络应用的能力上,而RMI就是研发百分之百纯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(Java Run Environment Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言研发的应用系统的支持不足。不能和用非Java语言书写的对象进行通信。本文拟从程式的角度举例介绍怎样利用RMI实现Java分布式应用。
一、RMI系统运行机理

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

在和远程对象的通信过程中,RMI使用标准机制:stub和skeleton。远程对象的stub担当远程对象的客户本地代表或代理人角色。调用程式将调用本地stub的方法,而本地stub将负责执行对远程对象的方法调用。在RMI中,远程对象的stub和该远程对象所实现的远程接口集相同。调用stub的方法时将执行下列操作:(1) 初始化和包含远程对象的远程虚拟机的连接;(2) 对远程虚拟机的参数进行编组(写入并传输);(3) 等待方法调用结果;(4) 解编(读取)返回值或返回的异常;(5) 将值返回给调用程式。为了向调用程式展示比较简单的调用机制,stub将参数的序列化和网络级通信等细节隐藏了起来。在远程虚拟机中,每个远程对象都能有相应的skeleton(在JDK1.2环境中无需使用skeleton)。Skeleton负责将调用分配给实际的远程对象实现。他在接收方法调用时执行下列操作:(1) 解编(读取)远程方法的参数;(2) 调用实际远程对象实现上的方法;(3) 将结果(返回值或异常)编组(写入并传输)给调用程式。stub和skeleton由rmic编译器生成。

利用RMI编写分布式对象应用程式需要完成以下工作:(1) 定位远程对象。应用程式可使用两种机制中的一种得到对远程对象的引用。他既可用RMI的简单命名工具rmiregistry来注册他的远程对象,也能将远程对象引用作为常规操作的一部分来进行传递和返回。(2)和远程对象通信。远程对象间通信的细节由RMI处理,对于程式员来说,远程通信看起来就像标准的Java方法调用。(3)给作为参数或返回值传递的对象加载类字节码。因为RMI允许调用程式将纯Java对象传给远程对象,所以,RMI将提供必要的机制,既能加载对象的代码又能传输对象的数据。在RMI分布式应用程式运行时,服务器调用注册服务程式以使名字和远程对象相关联。客户机在服务器上的注册服务程式中用远程对象的名字查找该远程对象,然后调用他的方法。

二、对象序列化

在RMI分布式应用系统中,服务器和客户机之间传递的Java对象必须是可序列化的对象。不可序列化的对象不能在对象流中进行传递。对象序列化扩展了核心Java输入/输出类,同时也支持对象。对象序列化支持把对象编码及将通过他们可访问到的对象编码变成字节流;同时,他也支持流中对象图像的互补重构造。序列化用于轻型持久性和借助于套接字或远程方法调用(RMI)进行的通信。序列化中目前包括一个 API(Application Programming Interface,应用程式接口),允许独立于类的域指定对象的序列化数据,并允许使用现有协议将序列化数据域写入流中或从流中读取,以确保和缺省读写机制的兼容性。

为编写应用程式,除多数瞬态应用程式外,都必须具有存储和检索 Java对象的能力。以序列化方式存储和检索对象的关键在于提供重新构造该对象所需的足够对象状态。存储到流的对象可能会支持 Serializable(可序列化)或 Externalizable(可外部化)接口。对于Java对象,序列化形式必须能标识和校验存储其内容的对象所属的 Java类,并且将该内容还原为新的实例。对于可序列化对象,流将提供足够的信息将流的域还原为类的兼容版本。对于可外部化对象,类将全权负责其内容的外部格式。序列化 Java 对象的目的是:提供一种简单但可扩充的机制,以序列化方式维护 Java对象的类型及安全属性;具有支持编组和解编的扩展能力以满足远程对象的需要;具有可扩展性以支持 Java 对象的简单持久性;只有在自定义时,才需对每个类提供序列化自实现;允许对象定义其外部格式。

三、分布式应用的实现和运行步骤

编写Java RMI分布式应用程式的步骤主要包括以下几步:

(1) 将远程类的功能定义为Java接口。在Java中,远程对象是实现远程接口的类的实例。在远程接口中声明每个要远程调用的方法。远程接口具有如下特点:1) 远程接口必须声明为public。如果不这样,则除非客户端和远程接口在同一个包内,否则当试图装入实现该远程接口的远程对象时会得到错误结果。2) 远程对象扩展java.rmi.Remote接口。3) 除了所有应用程式特定的例外之外,每个方法还必须抛出java.rmi.RemoteException例外。4) 所有作为参数或返回值传送的远程对象的数据类型必须声明为远程接口类型,而不是实现类。

(2) 编写和实现服务器类。该类是实现(1)中定义的远程接口。所以在该类中至少要声明实现一个远程接口,并且必须具有构造方法。在该类中还要实现远程接口中所声明的各个远程方法。

(3) 编写使用远程服务的客户机程式。在该类中使用java.rmi.Naming中的lookup()方法获得对远程对象的引用,依据需要调用该引用的远程方法,其调用方式和对本地对象方法的调用相同。

实现了服务器和客户机的程式后,就是编译和运行该RMI系统。其步骤有:
(1) 使用javac编译远程接口类,远程接口实现类和客户机程式。
(2) 使用rmic编译器生成实现类的stub和skeleton。
(3) 启动RMI注册服务程式rmiregistry。
(4) 启动服务器端程式。
(5) 启动客户机程式。

四、实例分析

本文以一个实例来说明怎样编写RMI分布式应用系统。该实例用于实现一个三层的Client/Server程式,即包括数据库服务器、应用服务器和客户机三部分。其功能是让应用服务器把客户机发出的数据库查询请求传送到数据库服务器,数据库服务器再把数据库查询操作的结果送回应用服务器,然后送到客户端显示。整个系统包括服务器端和客户端程式,但这只是逻辑上的划分,其实他们都位于同一个机器上,即Web服务器。在客户端是个Applet,通过他获得远程对象的引用,并调用远程对象的方法。而应用服务器上的程式其主要的功能是完成对数据库连接的设置、数据库的查询操作和把查询结果转换成可序列化的RecSet对象,当客户端调用远程对象的远程方法时就把他作为参数或返回值传递给客户端,实现服务器和客户机的通信。客户端得到查询结果后把他显示出来。在应用服务器和数据库服务器之间是通过Java的JDBC来连接的,本作者使用的是Sybase公司提供的JDBC Driver-jConnect5.0来实现对数据库的连接的。应用服务器同时也是Web服务器,因此只要上网的计算机通过浏览器就能下载客户端的Applet程式到本地机上运行。具体实现步骤和部分程式代码如下。


转载地址:http://www.sudu.cn/info/html/edu/20050119/316545.html
分享到:
评论

相关推荐

    java 远程方法调用(java rmi)

    讲述利用java rmi进行分布式应用开发的相关知识

    JAVA_RMI 技术文档

    用RMI编写一个分布式应用,核心有以下三方面: 定位远程对象 1. 一个应用可以利用RMI的名字服务功能注册器远程对象。 2. 可以象操作普通对象一样传送并返回一个远程对象的引用(指针)。 与远程对象通信: 底层的通信由...

    Java开发基于rmi的数据库中间件设计源码,并利用中间件建立一个数据库应用(Java web项目),分布式对象技术课程实践

    Java开发基于rmi的数据库中间件设计源码,并利用中间件建立一个数据库应(Java web项目),分布式对象技术课程实践 主机安装Node.js,并在控制台进入front-end-pages目录下,按顺序执行以下命令运行前端: npm install ...

    Java开发基于rmi的数据库中间件设计源码.zip

    分布式对象技术课程实践:基于rmi的数据库中间件设计,并利用中间件建立一个数据库应用(Java web项目)。 需求分析 数据库操作中间件: 提供数据库连接接口。该接口可使“数据库操作中间件”连接当前主流的数据库...

    Java思维导图xmind文件+导出图片

    如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE以及其应用 什么是分布式架构下的高可用...

    JAVA_API1.6文档(中文)

    java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    基于Java rmi 的数据库中间件设计【100012361】

    分布式对象技术课程实践:基于 rmi 的数据库中间件设计,并利用中间件建立一个数据库应用(Javaweb 项目)。涉及到Java 面向对象编程、JavaRMI 技术、JavaJDBCB、SpringBoot 项目的编写。

    基于JAVA的学生通讯录管理系统设计和实现[文献综述].doc

    Java的RMI(远程方法激活)机制也 是开发分布式应用的重要手段。 4、Java语言是健壮的。Java的强类型机制、异常处理、废料的自动收集等是Java程 序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查...

    Java 1.6 API 中文 New

    java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java....

    高级java2大学教程 源代码

    本书还讨论了构造企业级Java应用的关键技术,其中包括安全、JDBC、EJB等,并给出一个利用Java技术实现的网上书店。全书内容丰富、结构严谨、条理清晰,写作方法别具一格,并且给出了大量的实例和练习,是一本难得的...

    java api最新7.0

    java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi. 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java....

    JavaAPI1.6中文chm文档 part1

    java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 ...

    h_JAVA 2应用编程150例.rar

    实例8 利用JNI实现窗口特效 20 实例9 文件选择对话框 24 实例10 改变字体 26 实例11 应用JTree 28 实例12 应用JTable 30 实例13 记事本 32 实例14 使用JTextPane 36 实例15 实现多文档视图 37 实例16 使用进度条 39 ...

    技术选型分享:JAVA中几种常用的RPC框架介绍.docx

    RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展。Java中的RPC框架比较多,各有特色,广泛使用的有RMI、Hessian、Dubbo等。RPC还有一个特点就是能够跨语言,本...

    从Java走向Java+EE+.rar

    17.1 用Java RMI实现远程调用 250 17.2 利用JNDI定位资源 256 17.3 实例——分布式的HelloWorld 260 17.4 小结 264 第18章 Java消息服务 265 18.1 消息系统和JMS 265 18.1.1 JMS API 265 18.1.2 点对...

    JavaAPI中文chm文档 part2

    java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 ...

Global site tag (gtag.js) - Google Analytics