`
zyongsheng83
  • 浏览: 43316 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

java - RMI一步一步学习

    博客分类:
  • jse
阅读更多

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

    1. //Calculator.java
    2. //define the interface
    3. import java.rmi.Remote;
    4.  
    5. public interface Calculator extends Remote
    6. {
    7.     public long add(long a, long b) 
    8.         throws java.rmi.RemoteException
    9.  
    10.     public long sub(long a, long b) 
    11.         throws java.rmi.RemoteException
    12.  
    13.     public long mul(long a, long b) 
    14.         throws java.rmi.RemoteException
    15.  
    16.     public long div(long a, long b) 
    17.         throws java.rmi.RemoteException

      注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。

      建立这个文件,把它存放在刚才的目录下,并且编译。

      >javac Calculator.java

      2、接口的具体实现

      下一步,我们就要写远程服务的具体实现,这是一个CalculatorImpl类文件:

    1. //CalculatorImpl.java
    2. //Implementation
    3. import java.rmi.server.UnicastRemoteObject;
    4.  
    5. public class CalculatorImpl extends UnicastRemoteObject implements Calculator 
    6.  
    7.     // 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常 
    8.     public CalculatorImpl() 
    9.         throws java.rmi.RemoteException { 
    10.         super(); 
    11.     } 
    12.  
    13.     public long add(long a, long b) 
    14.         throws java.rmi.RemoteException { 
    15.         return a + b; 
    16.     } 
    17.  
    18.     public long sub(long a, long b) 
    19.         throws java.rmi.RemoteException { 
    20.         return a - b; 
    21.     } 
    22.  
    23.     public long mul(long a, long b) 
    24.         throws java.rmi.RemoteException { 
    25.         return a * b; 
    26.     } 
    27.  
    28.     public long div(long a, long b) 
    29.         throws java.rmi.RemoteException { 
    30.         return a / b; 
    31.     } 

      同样的,把这个文件保存在你的目录里然后编译他。

      这个实现类使用了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类是一个非常简单的服务器。

    1. //CalculatorServer.java
    2. import java.rmi.Naming;
    3.  
    4. public class CalculatorServer {
    5.  
    6.    public CalculatorServer() {
    7.      try {
    8.        Calculator c = new CalculatorImpl();
    9.        Naming.rebind("rmi://localhost:1099/CalculatorService", c);
    10.      } catch (Exception e) {
    11.        System.out.println("Trouble: " + e);
    12.      }
    13.    }
    14.  
    15.    public static void main(String args[]) {
    16.      new CalculatorServer();
    17.    }
    18. }

      建立这个服务器程序,然后保存到你的目录下,并且编译它。

      5、客户端

      客户端源代码如下:

    1. //CalculatorClient.java
    2.  
    3. import java.rmi.Naming
    4. import java.rmi.RemoteException
    5. import java.net.MalformedURLException
    6. import java.rmi.NotBoundException
    7.  
    8. public class CalculatorClient { 
    9.  
    10.     public static void main(String[] args) { 
    11.         try { 
    12.             Calculator c = (Calculator)
    13.                            Naming.lookup(
    14.                  "rmi://localhost
    15.                         /CalculatorService"); 
    16.             System.out.println( c.sub(4, 3) ); 
    17.             System.out.println( c.add(4, 5) ); 
    18.             System.out.println( c.mul(3, 6) ); 
    19.             System.out.println( c.div(9, 3) ); 
    20.         } 
    21.         catch (MalformedURLException murle) { 
    22.             System.out.println(); 
    23.             System.out.println(
    24.               "MalformedURLException"); 
    25.             System.out.println(murle); 
    26.         } 
    27.         catch (RemoteException re) { 
    28.             System.out.println(); 
    29.             System.out.println(
    30.                         "RemoteException"); 
    31.             System.out.println(re); 
    32.         } 
    33.         catch (NotBoundException nbe) { 
    34.             System.out.println(); 
    35.             System.out.println(
    36.                        "NotBoundException"); 
    37.             System.out.println(nbe); 
    38.         } 
    39.         catch (
    40.             java.lang.ArithmeticException
    41.                                       ae) { 
    42.             System.out.println(); 
    43.             System.out.println(
    44.              "java.lang.ArithmeticException"); 
    45.             System.out.println(ae); 
    46.         } 
    47.     } 
      保存这个客户端程序到你的目录下(注意这个目录是一开始建立那个,所有的我们的文件都在那个目录下),并且编译他。

      6、运行RMI系统

      现在我们建立了所有运行这个简单RMI系统所需的文件,现在我们终于可以运行这个RMI系统啦!来享受吧。

      我们是在命令控制台下运行这个系统的,你必须开启三个控制台窗口,一个运行服务器,一个运行客户端,还有一个运行RMIRegistry。

      首先运行注册程序RMIRegistry,你必须在包含你刚写的类的那么目录下运行这个注册程序。

      >rmiregistry

      好,这个命令成功的话,注册程序已经开始运行了,不要管他,现在切换到另外一个控制台,在第二个控制台里,我们运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子 
    grant {
    permission java.security.AllPermission "", "";
    };

      注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。

      现在为了运行服务端,你需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。

      > java -Djava.security.policy=policy.txt CalculatorServer

      这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台,启动我们的客户端。

      为了在其他的机器运行客户端程序你需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端

       > java -Djava.security.policy=policy.txt CalculatorClient

      如果所有的这些都成功运行,你应该看到下面的输出:
      1
      9
      18
      3

      如果你看到了上面的输出,恭喜你,你成功了,你已经成功的创建了一个RMI系统,并且使他正确工作了。即使你运行在同一个计算机上,RMI还是使用了你的网络堆栈和TCP/IP去进行通讯,并且是运行在三个不同的Java虚拟机上。这已经是一个完整的RMI系统。  
     
  • 分享到:
    评论

    相关推荐

      RMI一步一步学习

      本篇文章将深入探讨“RMI一步一步学习”这个主题,通过分析给定的文件列表,我们将了解RMI的基本原理和实现步骤。 首先,我们看到`Calculator`类,这是RMI中的接口,它定义了可以在远程服务器上执行的方法。例如,...

      JavaRMI快速入门

      Java Remote Method Invocation(Java RMI)是Java编程语言中用于在网络间进行远程对象调用的技术。它是Java平台的标准...理解并掌握Java RMI的基本原理和实践,对于Java开发者来说,是迈进高级应用开发的重要一步。

      College-RMI-Exp-3

      这一步会生成相应的.class字节码文件,是Java程序运行的基础。 2. **启动RMI注册表**:运行`rmiregistry`命令启动RMI注册表。RMI注册表是一个服务,用于存储远程对象的引用,使得其他客户端可以查找并调用这些对象的...

      146-从Java RMI反序列化到内网沦陷.pdf

      Java 远程方法调用(Java RMI)是 Java 提供的一种机制,允许运行在一台 Java 虚拟机上的对象,调用另一台虚拟机上的对象的方法。CVE-2017-3241 漏洞存在于Java RMI框架中,当服务端对客户端发送的数据进行反序列化...

      RMI+Zookeeper实现远程调用框架_Java_RMI java

      在Java编程领域,远程方法调用(Remote Method Invocation,RMI)是一种机制,允许...在实际项目中,"rmi-zookeeper-master"这样的压缩包可能包含了实现这一框架的源代码、配置文件和其他相关资源,供开发者参考学习。

      RMI.rar_Java会议室_rmi _会议室

      总之,这个"RMI.rar_Java会议室_rmi _会议室"项目是一个很好的学习和实践RMI技术的例子,它涵盖了RMI的基本原理和应用,同时也涉及到了分布式系统中的并发控制、安全性等高级话题。对于深入理解和掌握Java的分布式...

      基于rmi的远程控制

      这一步通常通过`java.rmi.Naming.lookup()`来实现。 6. **序列化(Serialization)**:由于Java RMI涉及到跨JVM的调用,所以参数和返回值必须是可序列化的。这意味着它们要么是`java.io.Serializable`的直接实现,...

      JAVA 局域网对战五子棋游戏(基于RMI)

      总结来说,"JAVA 局域网对战五子棋游戏(基于RMI)"项目涵盖了JAVA编程、GUI设计、网络编程、并发处理、错误处理等多个方面的知识点,是学习和实践JAVA技术的好实例。通过这个项目,开发者可以深入理解JAVA RMI的...

      Java学习入门资料 PPT版本

      ### Java学习入门资料知识点梳理 #### 一、Java语言历史与发展 - **起源与早期发展** - **前身**:Oak(1990年),由James Gosling等人在Sun ...对于初学者而言,掌握Java的基础知识和编程技巧是非常重要的一步。

      rmi基础教程

      3. **编译远程接口与实现**:编译`Calculator.java`和`CalculatorImpl.java`,这一步会生成实现类的字节码文件。 4. **生成存根和骨架**:使用`rmic`工具编译`CalculatorImpl`类,该工具会生成两个辅助类`...

      怎么学习Java怎么学习Java

      掌握如何利用Java进行分布式系统开发,理解RMI(远程方法调用)和JMS(Java消息服务)等技术,将使您能够更好地适应当前的技术趋势,提升编程能力。 学习Java是一个持续的过程,开始时您可能需要花费较长的时间来...

      RMI 中文教程

      最后一步是在服务端启动 RMI 服务器。这里创建一个 `CalculatorServer` 类,该类通过 `java.rmi.Naming.rebind` 方法将服务绑定到一个特定的 URL 上。 ```java import java.rmi.Naming; import java.rmi....

      Java+JDK6学习笔记(PDF版书籍,免费下载)

      ### Java+JDK6学习笔记知识点详解 #### 一、Java简介 - **起源与历史:** - 最初由Sun公司的Green Project发起...对于初学者而言,掌握这些知识是非常重要的第一步,可以帮助他们在Java编程的世界里迈出坚实的一步。

      java远程采集器

      【Java远程采集器】是指利用Java的远程方法调用(Remote Method Invocation, RMI)技术,使得客户端可以访问和操作远程服务器上的对象。RMI是Java提供的一种分布式计算能力,它允许程序跨越网络调用另一个JVM上的...

      java精品

      ### Java精品:初学者的全面指南 ...Java的学习之路虽然漫长,但每一步都为成为专业程序员打下了坚实的基础。通过系统地学习和实践,初学者可以逐步掌握Java的核心概念和技术,最终实现自己的编程梦想。

      JAVA学习笔记1

      在JAVA学习之旅中,深入理解J2EE(Java 2 Platform, Enterprise Edition)框架是至关重要的一步。J2EE是专为开发企业级应用而设计的平台,它包含了一系列的服务和技术,如EJB、JMS、RMI、JDBC等,这些技术共同构成了...

      霸屏天下源码java-java_distributed_computing:对核心Java编程语言的严格研究,然后是对基于Java的分布式计算

      本课程面向希望学习核心 Java 编程语言并将其应用于一种基于 Java 分布式对象模型的分布式编程形式的软件工程师。 本课程将包括两部分,首先是对作为通用编程语言的 Java 的研究,然后是对 Java 的远程方法调用 (RMI...

      JAVA连接access

      这一步非常重要,可以避免内存泄漏等问题。 #### 四、注意事项 1. **驱动兼容性**:选择合适的JDBC驱动是非常重要的,不同的驱动可能适用于不同版本的Access数据库。 2. **安全性**:在生产环境中,建议使用更安全...

    Global site tag (gtag.js) - Google Analytics