- 浏览: 149698 次
- 性别:
- 来自: 广州
-
最新评论
-
tianmo2008:
最近在使用,遇到点问题,希望能请教一下.
请问一下,你出现过I ...
RCP中实现带有run in background按钮的进度条对话框 -
zhangzcz1999:
lin36 写道楼主的程序有问题,测试的时间包含有调用&quo ...
java写文件方法之比较 -
hnbcjzj:
FileOutputStream 用于写入诸如图像数据之类的原 ...
java写文件方法之比较 -
zhangzcz1999:
xueshuanglong 写道网上现在的资料尽是一些旧版的, ...
LifeRay安装配置开发环境全过程(一) -
xueshuanglong:
网上现在的资料尽是一些旧版的,没有最新的。
LifeRay安装配置开发环境全过程(一)
初探RMI
初探RMI
一 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对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。
创建一个远程接口时,必须遵守下列规则:
1) 远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。
2) 远程接口必须扩展接口java.rmi.Remote。
3) 除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.
4) 作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。
三 远程接口的实施:
服务器必须包含一个扩展了UnicastRemoteObject类,并实现远程接口。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。
必须为远程对象定义构件器,即使只准备定义一个默认构件器,用它调用基础类构件器。必须把它明确地编写出来,因为它必须“掷”出RemoteException违例。
四 代码存根:
当客户代码调用一个远程对象上的远程方法是,实际上是调用一个Java编程语言的普通方法,这个方法封装在stub(代码存根)的代用对象。存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法。
要完成这个工作可使用rmic编译器,rmic编译器生成远程对象的存根和骨架。
代码存根在服务器端创建,必须驻留于客户端。
五 RMI实战
一个正常工作的RMI系统由下面几个部分组成:
● 远程服务的接口定义
● 远程服务接口的具体实现
● 桩(Stub)和框架(Skeleton)文件
● 一个运行远程服务的服务器
● 一个RMI命名服务,它允许客户端去发现这个远程服务
● 类文件的提供者(一个HTTP或者FTP服务器)
● 一个需要这个远程服务的客户端程序
如果所有的RMI文件都已经设计好了,那么需要下面的几个步骤去生成系统:
1、 编写并且编译接口的Java代码
2、 编写并且编译接口实现的Java代码
3、 从接口实现类中生成桩(Stub)和框架(Skeleton)类文件
4、 编写远程服务的主运行程序
5、 编写RMI的客户端程序
6、 安装并且运行RMI系统
实现过程如下:
服务器端:
1接口
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:
2接口的具体实现
下一步,我们就要写远程服务的具体实现,这是一个ProductImpl类文件:
3 桩(Stubs)和框架(Skeletons)
下一步就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
在你的目录下运行上面的命令,成功执行完上面的命令你可以发现一个ProductImpl_stub.class文件,如果你是使用的Java2SDK,那么你还可以发现ProductImpl_Skel.class文件。
4 主机服务器
远程RMI服务必须是在一个服务器中运行的。
5 客户端
因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子 。
注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。
在该类中使用java.rmi.Naming中的lookup()方法获得对远程对象的引用,依据需要调用该引用的远程方法,其调用方式和对本地对象方法的调用相同。.
6、 运行RMI系统
按如下步骤编译、运行系统:
1) 为接口、实现和客户、服务器类编译源文件:
Javac Product*.java
2)在实现类上运行rmic
Rmic ProductImpl
3)启动rmi注册程序
Start rmiregistry
1) 启动服务器
Start java ProductServer
2) 运行客户程序
Java –Djava.security.policy=client.policy ProductClient
初探RMI
一 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对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。
创建一个远程接口时,必须遵守下列规则:
1) 远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。
2) 远程接口必须扩展接口java.rmi.Remote。
3) 除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.
4) 作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。
三 远程接口的实施:
服务器必须包含一个扩展了UnicastRemoteObject类,并实现远程接口。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。
必须为远程对象定义构件器,即使只准备定义一个默认构件器,用它调用基础类构件器。必须把它明确地编写出来,因为它必须“掷”出RemoteException违例。
四 代码存根:
当客户代码调用一个远程对象上的远程方法是,实际上是调用一个Java编程语言的普通方法,这个方法封装在stub(代码存根)的代用对象。存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法。
要完成这个工作可使用rmic编译器,rmic编译器生成远程对象的存根和骨架。
代码存根在服务器端创建,必须驻留于客户端。
五 RMI实战
一个正常工作的RMI系统由下面几个部分组成:
● 远程服务的接口定义
● 远程服务接口的具体实现
● 桩(Stub)和框架(Skeleton)文件
● 一个运行远程服务的服务器
● 一个RMI命名服务,它允许客户端去发现这个远程服务
● 类文件的提供者(一个HTTP或者FTP服务器)
● 一个需要这个远程服务的客户端程序
如果所有的RMI文件都已经设计好了,那么需要下面的几个步骤去生成系统:
1、 编写并且编译接口的Java代码
2、 编写并且编译接口实现的Java代码
3、 从接口实现类中生成桩(Stub)和框架(Skeleton)类文件
4、 编写远程服务的主运行程序
5、 编写RMI的客户端程序
6、 安装并且运行RMI系统
实现过程如下:
服务器端:
1接口
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:
import java.rmi.*; public interface Product extends Remote { String getDescription() throws RemoteException; }
2接口的具体实现
下一步,我们就要写远程服务的具体实现,这是一个ProductImpl类文件:
import java.rmi.*; import java.rmi.server.*; public class ProductImpl extends UnicastRemoteObject implements Product { private String name ; public ProductImpl(String n) throws RemoteException { name = n; } public String getDescription() { return "Hello,I am " + name + " . I love you !"; } }
3 桩(Stubs)和框架(Skeletons)
下一步就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
>rmic ProductImpl
在你的目录下运行上面的命令,成功执行完上面的命令你可以发现一个ProductImpl_stub.class文件,如果你是使用的Java2SDK,那么你还可以发现ProductImpl_Skel.class文件。
4 主机服务器
远程RMI服务必须是在一个服务器中运行的。
public static void main(String arts[]) { try { System.out.println("Construction server implementats ..."); ProductImpl p1 = new ProductImpl("Wang.yuanbin"); ProductImpl p2 = new ProductImpl("Bueaty"); System.out.println("binding server implementation to registry ..."); Naming.rebind("wyb",p1); Naming.rebind("Beau",p2); System.out.println("Waiting fo invocations from clients ..."); } catch (Exception ex) { System.out.println("Error: " + ex ); } }
5 客户端
因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子 。
grant { permission java.security.AllPermission "", ""; };
注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。
import java.rmi.*; import java.rmi.server.*; public class ProductClient { public static void main(String [] args) { System.setSecurityManager(new RMISecurityManager()); String url = "rmi: //localhost/"; try { Product c1 = (Product) Naming.lookup(url + "wyb"); Product c2 = (Product) Naming.lookup(url + "Beau"); System.out.println(c1.getDescription()); System.out.println(c2.getDescription()); } catch (Exception ex) { System.out.println("Error : " + ex); } System.exit(0); } }
在该类中使用java.rmi.Naming中的lookup()方法获得对远程对象的引用,依据需要调用该引用的远程方法,其调用方式和对本地对象方法的调用相同。.
6、 运行RMI系统
按如下步骤编译、运行系统:
1) 为接口、实现和客户、服务器类编译源文件:
Javac Product*.java
2)在实现类上运行rmic
Rmic ProductImpl
3)启动rmi注册程序
Start rmiregistry
1) 启动服务器
Start java ProductServer
2) 运行客户程序
Java –Djava.security.policy=client.policy ProductClient
发表评论
-
(转)Word文档解析介绍(using Jacob & HtmlParser)
2010-11-01 14:21 2739Java中Word的解析方法据我了解有多种,如通过jacob调 ... -
(转)Java同步技术
2010-03-15 15:26 1286Java同步技术 收藏 by:文/ Iangao 200 ... -
Java和oracle分页处理
2009-12-09 18:16 2579Oracle的分页查询语句基 ... -
java写文件方法之比较
2009-11-12 10:57 8639(转)最近对以前开发的一个通用数据迁移的软件进行优化。除了 ... -
Log4j记录详细异常信息
2009-08-11 16:56 1531//代码片断,其中log为log4j对象,ex为异常对象 / ... -
解决iframe中session丢失的问题
2009-08-04 11:35 2842最近由于要做页面引用,在Iframe中引用其他系统的页面,而其 ... -
转:HttpClient POST 的 UTF-8等编码问题
2009-04-26 15:46 3686Apache HttpClient ( http://jaka ... -
RCP中实现带有run in background按钮的进度条对话框
2009-04-02 12:05 3467public class TestWithProgress ... -
spring cron表达式
2009-03-02 15:35 2052Cron表达式是一个字符串 ... -
使用apache的Httpclient上传文件
2009-02-27 14:25 4589String targetUrl = "htt ... -
eclipse中的线程
2009-02-10 16:25 950先大致讲一讲GUI程序中 ... -
GEF初步学习
2009-01-21 17:06 1491这周公司突然要我去接手同事写的GEF和RCP工作。于是急匆匆的 ... -
(转)Java复习
2009-01-16 17:28 818类成员访问修饰符与继承的关系 私有的(private)类成员 ... -
eclipse启动参数(eclipse.ini)说明
2009-01-07 09:45 1700今天在写RCP程序的时候跟踪程序,出现了java.lang.O ... -
Lucene已建索引的全部删除
2008-11-07 17:37 1562今天搞个重建索引工作,一开始想要把建索引的文件目录删除然后再来 ... -
Lucene 搜索试用
2008-10-22 11:57 1040传说中强大的Lucene搜索,首先要创建索引: impor ... -
JXL操作excel代码实例
2008-10-18 17:53 1483import java.io.File; import ... -
Webphere启动报java.lang.ClassCastException问题解决
2008-09-26 19:55 3493昨天使用websphere部署war包,部署成功了,启动也成功 ... -
opencsv开源 CSV文件操作包简介
2008-05-30 09:47 3990opencsv is a very simple csv (c ... -
Tomcat下配置与使用CAS实现单点登录
2008-05-23 10:47 2576配置Tomcat使用SSL安全认证 因为CAS使用的是http ...
相关推荐
5、Java RMI + Lucene 构建分布式检索应用初探 ................ - 17 - 6、一对多的表关联在mapreduce中的应用(续) .................. - 26 - 7、InputSplit文件格式分析................................. - 32 -...
#### 五、Java RMI + Lucene 构建分布式检索应用初探 - **技术组合**:结合 Java Remote Method Invocation (RMI) 和 Lucene 实现分布式检索应用。 - **关键技术点**: - Java RMI 的使用,实现远程方法调用功能。...
《Spring in Action》是Spring框架领域的一本权威著作,尤其以最新版著称。这本书以其详尽的内容和丰富的示例闻名,旨在帮助Java开发者深入理解并...无论是对Spring的初探还是深入研究,这本书都是一份不可多得的资源。
- **Spring 初探**:Spring的核心在于依赖注入(DI)和面向切面编程(AOP),提供了一个轻量级的容器来管理对象的生命周期和相互依赖关系。 - **Spring 体系**:包括Core Container(核心容器)、Data Access/...
在Spring初探部分,首先涉及到的是准备工作,包括安装必要的开发环境和配置工具,为构建Spring基础代码做准备。接下来,指南会介绍Spring的基础语义,特别是依赖注入(Dependency Injection,简称DI)的概念及其在...
从代理机制初探 AOP 动态代理 <br>AOP 观念与术语 Spring AOP Advices Advices 包括了Aspect 的真正逻辑,由于缝合至Targets的时机不同,Spring 提供了几种不同的 Advices。 Before ...
《构建跳跃与奔跑游戏——Java实现的JumpAndRunBuilder初探》 在游戏开发的世界里,创新和趣味性是至关重要的。"JumpAndRunBuilder"项目,正如其名,旨在提供一个平台,让玩家能够创建自己的跳跃和奔跑关卡,并且...