- 浏览: 311658 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
popotang:
关注raphael,从中学习一下
基于jquery, raphael的WEB流程设计器 -
Getwaysun:
拜读了,写得非常好
iframe跨域session丢失问题 -
chen4w:
good!
Geoserver & Openlayers 学习笔记 -
holysky:
Caused by: org.springframework. ...
Spring对属性文件加密解密应用 -
holysky:
希望能解决一下!
Spring对属性文件加密解密应用
RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。
RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序
一个正常工作的RMI系统由下面几个部分组成:
● 远程服务的接口定义
● 远程服务接口的具体实现
● 桩(Stub)和框架(Skeleton)文件
● 一个运行远程服务的服务器
● 一个RMI命名服务,它允许客户端去发现这个远程服务
● 类文件的提供者(一个HTTP或者FTP服务器)
● 一个需要这个远程服务的客户端程序
下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。
如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:
1、编写并且编译接口的Java代码
2、编写并且编译接口实现的Java代码
3、从接口实现类中生成桩(Stub)和框架(Skeleton)类文件
4、编写远程服务的主运行程序
5、编写RMI的客户端程序
6、安装并且运行RMI系统
1、 接口
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:
import java.rmi.Remote; public interface Calculator extends Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException; public long div(long a, long b) throws java.rmi.RemoteException; }
注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。
建立这个文件,把它存放在刚才的目录下,并且编译。
>javac Calculator.java
2、 接口的具体实现
下一步,我们就要写远程服务的具体实现,这是一个CalculatorImpl类文件:
import java.rmi.server.UnicastRemoteObject; public class CalculatorImpl extends UnicastRemoteObject implements Calculator { // 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常 public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b; } public long sub(long a, long b) throws java.rmi.RemoteException { return a - b; } public long mul(long a, long b) throws java.rmi.RemoteException { return a * b; } public long div(long a, long b) throws java.rmi.RemoteException { return a / b; } }
同样的,把这个文件保存在你的目录里然后编译他。
这个实现类使用了UnicastRemoteObject去联接RMI系统。
在我们的例子中,我们是直接的从UnicastRemoteObject这个类上继承的,事实上并不一定要这样做,
如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方法去联接到RMI。
如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。
当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。
3、 桩(Stubs)和框架(Skeletons)
下一步就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
>rmic CalculatorImpl
在你的目录下运行上面的命令,成功执行完上面的命令你可以发现一个Calculator_stub.class文件,
如果你是使用的Java2SDK,那么你还可以发现Calculator_Skel.class文件。
4、 主机服务器
远程RMI服务必须是在一个服务器中运行的。CalculatorServer类是一个非常简单的服务器。
import java.rmi.Naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind("rmi://localhost:1099/CalculatorService", c); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String args[]) { new CalculatorServer(); } }
建立这个服务器程序,然后保存到你的目录下,并且编译它。
5、 客户端
客户端源代码如下:
import java.rmi.Naming; import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.NotBoundException; public class CalculatorClient { public static void main(String[] args) { try { Calculator c = (Calculator) Naming.lookup("rmi://localhost/CalculatorService"); System.out.println(c.sub(4, 3)); System.out.println(c.add(4, 5)); System.out.println(c.mul(3, 6)); System.out.println(c.div(9, 3)); } catch (MalformedURLException murle) { System.out.println(); System.out.println("MalformedURLException"); System.out.println(murle); } catch (RemoteException re) { System.out.println(); System.out.println("RemoteException"); System.out.println(re); } catch (NotBoundException nbe) { System.out.println(); System.out.println("NotBoundException"); System.out.println(nbe); } catch (java.lang.ArithmeticException ae) { System.out.println(); System.out.println("java.lang.ArithmeticException"); System.out.println(ae); } } }
保存这个客户端程序到你的目录下(注意这个目录是一开始建立那个,所有的我们的文件都在那个目录下),并且编译他。
6、 运行RMI系统
现在我们建立了所有运行这个简单RMI系统所需的文件,现在我们终于可以运行这个RMI系统啦!来享受吧。
我们是在命令控制台下运行这个系统的,你必须开启三个控制台窗口,一个运行服务器,一个运行客户端,还有一个运行RMIRegistry。
首先运行注册程序RMIRegistry,你必须在包含你刚写的类的那么目录下运行这个注册程序。
>rmiregistry
好,这个命令成功的话,注册程序已经开始运行了,不要管他,现在切换到另外一个控制台,在第二个控制台里,我们运行服务器CalculatorService,输入如下命令:
>java CalculatorServer
这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台,启动我们的客户端。
>java CalculatorClient
如果所有的这些都成功运行,你应该看到下面的输出:
1 9 18 3
如果你看到了上面的输出,恭喜你,你成功了,你已经成功的创建了一个RMI系统,并且使他正确工作了。即使你运行在同一个计算机上,RMI还是使用了你的网络堆栈和TCP/IP去进行通讯,并且是运行在三个不同的Java虚拟机上。这已经是一个完整的RMI系统。
发表评论
-
一些有用的开源项目
2013-07-09 07:22 1015cbtoolhttp://code.google.com/p/ ... -
Javadoc转换chm帮助文档的四种方法总结
2012-01-04 22:48 1031关键词 Java ... -
解决IE和FF下载中文名称的文件文件名乱码的问题.
2011-11-02 14:06 1099下载前判断浏览器类型 采用不同的文件名编码方式 网 ... -
获取网络MP3真实地址
2010-09-20 19:26 2146MP3网站的歌曲都采用了不同的加密方法,直接从页面的源文件中是 ... -
iframe跨域session丢失问题
2010-09-09 03:47 2246哎呀,在做项目的时候,碰到一个很棘手的问题。在一个应用中通过i ... -
java 正则表达式 过滤html标签
2010-09-07 08:47 1126import java.util.regex.Matcher; ... -
验证码
2010-09-03 19:47 738<%@ page contentType="i ... -
JSON与JAVA数据的转换
2010-08-26 08:52 1262JSON-lib这个Java类包用于把bean,map和XML ... -
JAVA中使用FTPClient上传下载资源
2010-03-25 11:36 16919最近发现apache很多jar包非常好用,刚好项目中要实现ft ... -
HttpClient 学习整理
2009-12-19 12:40 883HttpClient 学习整理 ... -
Java RMI之HelloWorld篇
2009-10-29 13:39 1000Java RMI 指的是远程方法调用 (Remote Me ... -
java中使用log4j将日志信息写入数据库中
2009-08-06 13:09 2436首先将log4j的jar包和Logging的jar包导入到 ... -
log4j详解
2009-07-29 21:19 956在实际编程时,要使Log4 ... -
学习Flex和BlazeDS的十三个理由
2009-06-18 10:43 801本文列述了13个Java程序 ... -
Java 语言的类、属性、方法各有哪些修饰符?简述各修饰符的使用条件
2009-06-13 10:32 29201、 类的修饰符分为: ... -
windows 平台的cvs服务器配置
2009-06-10 14:42 9961: 大家做开发的时候就是都会用到cvs版本控制,那么怎样制作 ... -
Java正则表达式匹配、替换HTML内容
2009-06-09 23:09 2911曾经了解过JavaScript的正则表达式,知道其功 ... -
Java代理模式
2009-04-08 19:21 29421.代理模式 代理模式的作用是:为其他对象提供一种代理以控 ... -
final 关键字的理解
2009-04-08 19:20 854final使得被修饰的变量"不变",但是由 ... -
Java1.6.0实现系统托盘技术
2009-04-06 21:06 1415实现系统托盘图标,借用dll动态链接库,用JAVA ...
相关推荐
以下是一个使用RMI构建分布式Java应用的步骤: 1. **定义远程服务接口**: 首先,我们需要定义一个实现了`Remote`接口的Java类,如`Calculator`。这个接口将包含所有远程服务的方法,如`add`, `sub`, `mul`和`div`...
### RMI分布式应用实例解析 #### 一、RMI简介及分布式应用原理 RMI (Remote Method Invocation) 是 Java 提供的一种远程方法调用技术,它允许开发者在不同的 JVM 上像调用本地方法那样调用远程方法。RMI 的主要...
1. **导出远程对象**: 开发者创建实现远程接口的类,并实例化一个远程对象,然后使用`java.rmi.Naming.rebind()`或`UnicastRemoteObject.exportObject()`将其导出到网络上。 2. **注册远程对象**: 将导出的对象注册...
### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...
总之,基于RMI的分布式议程服务利用Java的RMI技术,实现了跨网络的会议管理,允许多个客户端共享和操作会议议程,为用户提供了一个便捷的协作环境。通过理解和实践这样的系统,开发者可以深入掌握Java的分布式编程...
华南理工大学的RMI实验为学生提供了一个宝贵的实践平台,通过实际操作,他们不仅能掌握RMI的基本使用,还能了解到分布式系统设计的关键要素。这将对他们的职业生涯,特别是在软件开发和分布式计算领域,产生深远...
Java RMI(Remote Method Invocation)是Java平台上的一个核心特性,它允许Java程序在不同的JVM(Java虚拟机)之间进行分布式计算,实现了对象间的远程调用。RMI使得开发者可以像调用本地方法一样调用远程对象的方法...
2. **银行应用程序**:Java RMI可以用来构建一个分布式银行应用程序,其中不同服务器负责处理账户、交易等业务逻辑,而客户端则可以轻松地与这些远程服务进行交互。 #### 四、Java RMI的设计与实现 1. **设计阶段*...
**RMI (Remote Method Invocation)** 是一种Java技术,用于实现分布式应用程序之间的远程过程调用。通过RMI,开发者可以在不同的JVM之间调用方法,就像是在本地JVM中调用一样。 - **基础原理**: - **接口与实现...
RMI是构建分布式Java应用程序的基础技术之一。通过RMI,开发者可以轻松实现远程对象的调用,而无需深入理解底层网络通信的细节。这对于企业级应用尤其有用,因为它简化了跨网络调用的实现难度。 #### 三、RMI应用...
RMI主要用于分布式Java应用程序之间的远程通信。其核心优势在于: - **提供分布式服务**:RMI使得创建跨网络的服务变得容易,开发者可以通过简单的接口设计来实现复杂的服务交互。 - **集成到J2EE框架中**:RMI常常...
RMI主要用于实现分布式Java应用程序之间的远程通信。其主要功能包括: - **分布式服务**:RMI能够构建分布式系统,使得不同位置的服务能够相互调用。 - **J2EE项目框架集成**:许多J2EE项目框架如Spring和EJB都封装...
【Java语言分布式应用服务模式详解】 随着信息技术的快速发展,计算机网络服务的需求日益增强,分布式应用服务模式成为了解决大规模计算和复杂系统集成的关键。本文主要探讨了一种基于Java语言的分布式应用服务模式...
Java RMI(Remote Method Invocation,远程方法调用)是Java...理解RMI的工作原理和实践,对于开发分布式Java应用至关重要。同时,由于RMI依赖于Java序列化,因此需要关注Java序列化的安全问题,例如防止反序列化攻击。
在"rmi会晤分布式实验"中,我们可以模拟一个日程管理系统的场景。服务器端创建并注册一个会晤管理的远程对象,该对象提供了添加、删除会晤等操作。客户端则通过RMI注册表找到这个远程对象,实现远程调用,完成对会晤...
另外,泛型也是Java的一个重要特性,它提供了类型安全的容器,可以避免类型转换错误。 对于网络编程,Java提供了丰富的API,如Socket和ServerSocket,支持TCP/IP通信,还可以通过HTTP、FTP等协议进行网络交互。此外...
《基于RMI的Java商品管理系统实现详解》 在IT领域,远程方法调用(Remote Method Invocation,简称RMI)是Java编程语言中一种强大的...对于想要深入理解Java RMI以及分布式系统开发的开发者,这是一个宝贵的实践案例。
总结来说,RMI是Java中实现分布式计算的一种简单而强大的工具,它使得开发者可以轻松地构建跨网络的分布式应用程序。虽然RMI在某些方面有其局限性,但在Java世界中,它是实现远程服务交互的一个有效选择。