副标题#e#
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 工具的简朴耐久性;只有在自界说时,才需对每个类提供序列化自实现;答允工具界说其外部名目。
#p#副标题#e#
三、漫衍式应用的实现和运行步调
编写Java RMI漫衍式应用措施的步调主要包罗以下几步:
#p#分页标题#e#
(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措施到当地机上运行。详细实现步和谐部门措施代码如下。