`

用RMI建立一个分布式Java应用程序详解

阅读更多
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代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:

 //Calculator.java//define the interface
  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类文件:

//CalculatorImpl.java
  //Implementation
  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类是一个非常简单的服务器。

  //CalculatorServer.java
  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、 客户端

  客户端源代码如下:
  //CalculatorClient.java
  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系统。


分享到:
评论

相关推荐

    用RMI建立一个分布式JAVA应用程序详解.pdf

    以下是一个使用RMI构建分布式Java应用的步骤: 1. **定义远程服务接口**: 首先,我们需要定义一个实现了`Remote`接口的Java类,如`Calculator`。这个接口将包含所有远程服务的方法,如`add`, `sub`, `mul`和`div`...

    一个RMI的分布式应用的实例

    ### RMI分布式应用实例解析 #### 一、RMI简介及分布式应用原理 RMI (Remote Method Invocation) 是 Java 提供的一种远程方法调用技术,它允许开发者在不同的 JVM 上像调用本地方法那样调用远程方法。RMI 的主要...

    RMI原理及应用详解

    1. **导出远程对象**: 开发者创建实现远程接口的类,并实例化一个远程对象,然后使用`java.rmi.Naming.rebind()`或`UnicastRemoteObject.exportObject()`将其导出到网络上。 2. **注册远程对象**: 将导出的对象注册...

    JavaRMI分布式编程心得

    ### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...

    基于RMI 的分布式议程服务

    总之,基于RMI的分布式议程服务利用Java的RMI技术,实现了跨网络的会议管理,允许多个客户端共享和操作会议议程,为用户提供了一个便捷的协作环境。通过理解和实践这样的系统,开发者可以深入掌握Java的分布式编程...

    华南理工大学分布式实验 RMI实验以及实验报告

    华南理工大学的RMI实验为学生提供了一个宝贵的实践平台,通过实际操作,他们不仅能掌握RMI的基本使用,还能了解到分布式系统设计的关键要素。这将对他们的职业生涯,特别是在软件开发和分布式计算领域,产生深远...

    JAVA RMI

    Java RMI(Remote Method Invocation)是Java平台上的一个核心特性,它允许Java程序在不同的JVM(Java虚拟机)之间进行分布式计算,实现了对象间的远程调用。RMI使得开发者可以像调用本地方法一样调用远程对象的方法...

    JavaRMI超棒书

    2. **银行应用程序**:Java RMI可以用来构建一个分布式银行应用程序,其中不同服务器负责处理账户、交易等业务逻辑,而客户端则可以轻松地与这些远程服务进行交互。 #### 四、Java RMI的设计与实现 1. **设计阶段*...

    Java分布式之RMI实例教程

    **RMI (Remote Method Invocation)** 是一种Java技术,用于实现分布式应用程序之间的远程过程调用。通过RMI,开发者可以在不同的JVM之间调用方法,就像是在本地JVM中调用一样。 - **基础原理**: - **接口与实现...

    Java分布式处理技术

    RMI是构建分布式Java应用程序的基础技术之一。通过RMI,开发者可以轻松实现远程对象的调用,而无需深入理解底层网络通信的细节。这对于企业级应用尤其有用,因为它简化了跨网络调用的实现难度。 #### 三、RMI应用...

    java-RMI技术讲解

    RMI主要用于分布式Java应用程序之间的远程通信。其核心优势在于: - **提供分布式服务**:RMI使得创建跨网络的服务变得容易,开发者可以通过简单的接口设计来实现复杂的服务交互。 - **集成到J2EE框架中**:RMI常常...

    java RMI技术讲解

    RMI主要用于实现分布式Java应用程序之间的远程通信。其主要功能包括: - **分布式服务**:RMI能够构建分布式系统,使得不同位置的服务能够相互调用。 - **J2EE项目框架集成**:许多J2EE项目框架如Spring和EJB都封装...

    一种基于JAVA语言的分布式应用服务模式.pdf

    【Java语言分布式应用服务模式详解】 随着信息技术的快速发展,计算机网络服务的需求日益增强,分布式应用服务模式成为了解决大规模计算和复杂系统集成的关键。本文主要探讨了一种基于Java语言的分布式应用服务模式...

    Java RMI远程方法调用详解-例子代码

    Java RMI(Remote Method Invocation,远程方法调用)是Java...理解RMI的工作原理和实践,对于开发分布式Java应用至关重要。同时,由于RMI依赖于Java序列化,因此需要关注Java序列化的安全问题,例如防止反序列化攻击。

    rmi 会晤分布式实验

    在"rmi会晤分布式实验"中,我们可以模拟一个日程管理系统的场景。服务器端创建并注册一个会晤管理的远程对象,该对象提供了添加、删除会晤等操作。客户端则通过RMI注册表找到这个远程对象,实现远程调用,完成对会晤...

    java应用详解

    另外,泛型也是Java的一个重要特性,它提供了类型安全的容器,可以避免类型转换错误。 对于网络编程,Java提供了丰富的API,如Socket和ServerSocket,支持TCP/IP通信,还可以通过HTTP、FTP等协议进行网络交互。此外...

    RMI商品管理系统.zip

    《基于RMI的Java商品管理系统实现详解》 在IT领域,远程方法调用(Remote Method Invocation,简称RMI)是Java编程语言中一种强大的...对于想要深入理解Java RMI以及分布式系统开发的开发者,这是一个宝贵的实践案例。

    RMI原理及实现(JAVA)

    总结来说,RMI是Java中实现分布式计算的一种简单而强大的工具,它使得开发者可以轻松地构建跨网络的分布式应用程序。虽然RMI在某些方面有其局限性,但在Java世界中,它是实现远程服务交互的一个有效选择。

Global site tag (gtag.js) - Google Analytics