`
习惯在马桶上思考
  • 浏览: 114639 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Java分布式处理技术(RMI,JDNI)

    博客分类:
  • JAVA
阅读更多

原文:http://blog.csdn.net/East271536394/archive/2010/08/15/5813352.aspx

 

 

1.1 RMI 的基本概念

1.1.1 什么是RMI

RMI(Remote Method Invocation) 远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。

1.1.2 RMI 的用途

1、 分布式体系结构

我们为什么要使用分布式计算呢?

Ø         当我们想与多个用户或客户机共享一个中央资源(如一个数据库)时,就会使用分布式计算。

Ø         分布式计算用来利用多个系统的组合计算能力,以便比在单个系统上更有效或更快地解决问题。

可以用多种方法配置多个计算机系统以共享处理,包括共享内存、共享磁盘或只是共享一条公共通信通道。最新的技术允许物理上相隔很远的系统能够在处理计算问题时协同工作。

关于利用计算能力这一主题,因特网及伴随的通信协议 TCP/IP 的出现已使无数的计算机系统史无前例地连接起来。对一些应用程序来说,能够利用如此多的计算功能来解决问题是令人满意的。甚至更吸引人的是,大多数计算机系统都有充足的空闲时间,可以帮助解决其它问题。将来,网格计算会利用分布式计算能力进行出售,这与电力行业出售电能非常相似。

2、 Java 分布式对象编程技术

RMI  Enterprise JavaBeans 的支柱,是建立分布式 Java 应用程序的方便途径。只要按照 RMI 规则设计程序,可以不必再过问在 RMI 之下的网络细节了,如: TCP  Socket 等等。任意两台计算机之间的通讯完全由 RMI 负责。调用远程计算机上的对象就像本地对象一样方便。

1.1.3 RMI 应用程序分类

依据 RMI 应用程序各部分职责,可对应用程序进行如下分类:

Ø         服务器程序:服务器程序将创建多个远程对象,并使每个对象能够被引用。等待客户端调用创建好的远程对象上的方法。

Ø         客户端程序:从服务端程序中得到一个或多个远程对象的引用。客户端能用此引用调用远程对象上的方法。

Ø         对等计算程序:双方地位相等,互为对方的服务器和客户端。

1.2 创建 RMI 应用程序步骤

1、 定义远程接口

 Java 中,远程对象是实现远程接口的类的实例 远程接口声明每个要远程调用的方法。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节,客户通过接口句柄发送消息即可。远程接口具有如下特点:

Ø         远程接口必须为 public 属性。如果不这样,除非客户端与远程接口在同一个包内,否则 当试图装入实现该远程接口的远程对象时,调用会得到错误结果。

Ø         远程接口必须扩展接口 java.rmi.Remote 

Ø         除与应用程序本身特定的例外之外,远程接口中的每个方法都必须在自己的 throws 从句中 声明 java.rmi.RemoteException 。(或RemoteException 的父类)。

代码范例 1

package com.itjob;

import java.rmi.*;

 

public interface RmiSample extends Remote{

       public int sum(int a,int b) throws RemoteException;

      

}

 

2、 实现远程接口

远程对象实现类必须扩展远程对象 java.rmi.UnicastRemoteObject 类,并实现所定义的远程接口。远程对象的实现类中包含实现每个远程接口所指定的远程方法的代码。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。必须为远程对象定义构造函数,即使只准备定义一个默认构造函数,用它调用基础类构造函数。因为基础类构造函数可能会抛出 java.rmi.RemoteException ,所以即使别无它用必须抛出 java.rmi.RemoteException 例外。

代码范例 2

package com.itjob.rmi;

import java.rmi.*;

import java.rmi.server.*;

import com.itjob.RmiSample ;

/**

远程接口实现类,继承了 UnicastRemoteObject 并实现了 RmiSample 远程接口

*/

public class RmiSampleImpl extends UnicastRemoteObject implements RmiSample{

    // 覆盖默认构造函数并抛出 RemoteException

       public RmiSampleImpl() throws RemoteException{

              super();

       }

    // 所有远程实现方法必须抛出 RemoteException

       public int sum(int a,int b) throws RemoteException{

              return a+b;

       }

}

 

3、 编写服务器类

包含 main 方法的类可以是实现类自身,也可以完全是另一个类。下面通过 RmiSampleServer 来创建一个远程对象的实例,并通过 java.rmi.registry.LocateRegistry 类的 createRegistry 方法从指定端口号启动注册服务程序,也可以通过执行 rmiregistry 命令启动注册服务程序,注册服务程序的缺省运行端口为 1099 

代码范例 3

package com.itjob.rmi;

 

import java.rmi.*;

import java.rmi.registry.*;

 

public class RmiSampleServer{

       public static void main(String[] args){

                /* 创建和安装一个安全管理器,令其支持 RMI. 作为 Java 开发包的一部分

             * 适用于 RMI 唯一一个是 RMISecurityManager.

             *

            if(System.getSecurityManager() == null) {

              System.setSecurityManager(new RMISecurityManager());

             }

             */

              try{

                     LocateRegistry.createRegistry(8808);

                     RmiSampleImpl server=new RmiSampleImpl();

                     Naming.rebind("//localhost:8808/SAMPLE-SERVER",server);

                     System.out.println (" 远程对象注册成功, RMI 服务已经启动,等待客户端调用 ....");

              }catch(java.net.MalformedURLException me){

                     System.out.println ("Malformed URL:"+me.toString());

              }catch(RemoteException re){

                     System.out.println ("Remote exception:"+re.toString());

              }catch(AlreadyBoundException abe){

            System.out.println (" (AlreadyBound exception:"+ abe .toString());

}

       }

}

 

Ø         代码范例 3 中将将远程对象名字绑定到对远程对象的引用上:

LocateRegistry.createRegistry(8808); 指定本 RMI 服务程序不使用默认端口 1099, 而是使用自己指定的端口 8808 

Naming.rebind("//localhost:8808/SAMPLE-SERVER" , Server); 将远程对象在服务器上注册并指定了将查找远程对象引用的 URL  URL 格式为 //host:port/name 。其中 host 是注册表所在的主机(远程或本地), port 是注册表接受调用的端口号, name 是未经注册表解释的简单字符串。 host  port 两者都是可选项。如果省略了 host ,则主机默认为本地主机。如果省略了 port ,则端口默认为 1099 ,该端口是RMI 的注册表 rmiregistry 使用的“著名”端口。

代码范例 3 的运行结果如图所示:

 14.1 代码范例 3 运行结果

 

4、 编写使用远程服务的客户机类

客户机类的主要功能有两个,一是通过 Naming.lookup 方法来构造注册服务程序 stub 程序实例,二是调用服务器远程对象上的远程方法。

代码范例 4

package com.itjob.rmi;

import java.rmi.*;

  import java.rmi.server.*;

  public class RmiSampleClient {

     public static void main(String[] args)

     {

         try {

             String url = "//localhost:8808/SAMPLE-SERVER";

            RmiSample RmiObject = (RmiSample)Naming.lookup(url);

            System.out.println(" 1 + 2 = " + RmiObject.sum(1,2) );

         } catch (RemoteException exc) {

             System.out.println("Error in lookup: " + exc.toString());

         } catch (java.net.MalformedURLException exc) {

             System.out.println("Malformed URL: " + exc.toString());

         } catch (java.rmi.NotBoundException exc) {

             System.out.println("NotBound: " + exc.toString());

         }

      }

  }

 

5、 为远程对象实现创建根和干

客户端是通过 Naming.lookup 方法来构造注册服务程序 stub 程序实例,通过该实例的引用来发起对远程对象方法调用的,所以在运行运行客户端应用前必须为远程对象实现创建根 (stub) 和干 (Skeleton) 。要创建存根程序和骨架文件,应以包含远程对象实现的已编译类包全名运行 rmic 编译器。存根( Stub )是远程对象在客户端的代理,它将 RMI 调用传递给服务器端的骨架( Skeleton ),后者负责将该调用传递给实际的远程方法。在命令行模块下运行 RMIC 调用:

 14. 2 RMIC 命令

调用 RMIC 命令运行结果如图所示:

 14.3 RMIC 运行结果

Ø         我们可以看系统帮我们生成了存根 (stub)RmiSampleImpl_Stub.class 但系统并没有帮我们生成骨架( Skeleton  RmiSampleImpl_Skeleton .class 。这与 JDK 的版本有关:

采用 JDK1.4 版本运行 rmic com.itjob.rmi. RmiSampleImpl 命令系统将会生成存根 (stub)RmiSampleImpl_Stub.class 骨架(Skeleton  RmiSampleImpl_ Skeleton .class 两个类文件;

采用 JDK1.5 版本运行 rmic com.itjob.rmi. RmiSampleImpl 命令系统将只会生成存根 (stub)RmiSampleImpl_Stub.class 骨架( Skeleton  RmiSampleImpl_ Skeleton .class 的功能将通反射技术由系统在运行时自动实现;

6、 运行程序

依次做完上述步骤后,我们现在来运行一下我们的 RMI 应用。先运行服务端程序,运行结果如图 14.1 所示。

接下来我们运行客户端程序(代码范例 4 ),运行结果如图所示:

 14.4 客户端程序运行结果

看到上面结果说明我们客户端程序进行 RMI 远程调用已经成功了。

1.3 RMI 接口和类简介

负责指定 rmi 系统远程对象行为的接口和类在 java.rmi 包中定义的,接下来我们了解一下几个核心接口和类:

1、 Java.rmi.Remote 接口

 rmi 中,远程接口声明了可从远程 java 虚拟机中调用的方法集,远程接口必须满足下列条件:

Ø         远程接口必须至少直接或间接的扩展 java.rmi.Remote 接口。

Ø         远程接口中的方法申明必须满足:远程方法申明在其 throws 子句中除了要包含与应用程序有关的异常之外,还必须包括 RemoteException 异常 ( 或她的父类 ) ;在远程方法申明中,作为参数或返回值申明的远程对象必须申明为远程接口,而非该接口的实现类。

2、 Java.rmi.RemoteException 

RemoteException 类是在远程方法调用期间由 RMI 运行所抛出的异常,在使用了 rmi 系统的应用程序中,远程接口中申明的远程方法在其throws 子句中必须指定 RemoteException 或者其超类。

Ø         当远程方法调用由于某种原因失败时,将抛出 RemoteException 异常。

Ø         RemoteException 类是一个已检验的异常,而不是 RuntimeException 

3、 Java.rmi.server.RemoteObject 

Ø         RMI 服务器函数由 RemoteObject 类及其子类 RemoteServer,UnicastRemoteObject  Activatabble 提供。

Ø         RemoteObject 为远程对象敏感的 Object 方法 ,hashCode,equals  toString 方法提供实现。

Ø         创建远程对象并将其导出,所需的方法由类 UnicastRemoteObject  Activatable 提供,子类可以识别远程方法。

Ø         UnicastRemoteObject 定义了单个调用的远程对象,其引用只有在服务器进程运行时才有效。

Ø          Activatable 是抽象类,它定义的 activatable 远程对象在其远程方法被调用时开始执行,并在必要时自己关闭。

4、 Java.rmi.registry.LocateRegistry 

LocateRegistry 类用于获得对特定主机的引导远程对象注册服务程序的引用 ( 创建 stub), 或者创建能在特定端口接受调用的远程对象注册服务程序,注册服务程序实现将远程对象名与远程对象引用关联的简单命名语法,服务器重新启动不会记住这些名字和远程对象之间的绑定。

LocateRegistry 类中的方法:

public static Registry getRegistry() throws RemoteException

Public static Registry getRegistry(int port ) throws RemoteException

Public static Registry getRegistry(String host ) throws RemoteException

Public static Registry getRegistry(String host , int port) throws RemoteException

Public static Registry getRegistry(String host, int port ,RMIClientSocketFactory csf ) throws RemoteException

Public static Registry createRegistry(int port )throws RemoteException

Public static Registry createRegistry(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException

5、 Java.rmi.Naming 

Naming 类提供了存储和获得远程对象注册服务程序中的远程对象进行引用的方法

Ø         Naming 类中的方法以 url 的形式作为其中的一个参数, //host:port/name

Ø         当远程对象使用 rmi 注册服务程序在本地主机上进行过注册后,远程主机上的调用程序就可以按名称查询远程对象,获得其引用,然后在对象上调用远程方法。

Public static Remote lookup(String name) throws NotBoundException, MalformedURException, RemoteException

Public static void bind(String name, Remote obj) throws AlreadyBoundException, MalforedURException, RemoteException

Public static void unbind (String name) throws RemoteException, NotBoundException,MalformedURLException

Public static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException

6、 Java.rmi.server.UnicastRemoteObject 

 UnicastRemoteObject 创建并导出远程对象,该类实现的远程服务具有以下特点:

Ø         将这种对象的引用至多仅在创建该远程对象的进程生命周期内有效。

Ø         通过 TCP 传输与远程对象通信调用,参数和结果使用流协议在客户端和服务器之间进行通信。

7、 Stub  skeleton

在远程对象的通信过程中, rmi 使用标准机制: stub  skeleton

 14.5 Stub  Skeleton

Ø         Stub 的功能

初始化与包含远程对象的远程机器的连接。

对远程机器参数进行编组(写入并传输)。

等待方法调用结果。

读取返回值或返回的异常。

将值返回给调用程序。

Ø         Skeleton 的功能

在远程机器中,每个远程对象都可以有相应的 skeleton  skeleton 负责将调用分配给实际的远程对象实现,他的主要功能如下:

读取

分享到:
评论

相关推荐

    Java分布式处理技术RMI,JNDI,

    Java 分布式处理技术 RMI,JNDI Java 分布式处理技术是指在 Java 平台上实现分布式计算和对象之间的交互的技术。其中,RMI(Remote Method Invocation)是 Java 分布式处理技术的核心组件之一。RMI 允许在不同的 ...

    Java分布式处理技术

    本文将重点介绍Java分布式处理技术中的RMI(Remote Method Invocation)和JNDI(Java Naming and Directory Interface),以及它们在实际项目中的应用场景和技术要点。 #### 二、RMI基本概念 ##### 2.1 什么是RMI...

    JAVA分布式之RMI实例教程网络通信原理[收集].pdf

    JAVA分布式之RMI实例教程网络通信原理[收集].pdf

    java分布式系统架构源码

    总结一下,这个Java分布式系统架构源码包提供了一个全面的学习和实践机会,涵盖了Java分布式系统的关键技术,如RMI、JMS和EJB。通过深入研究源码,开发者可以理解如何设计和实现这样的系统,以及如何利用像Jeesuite...

    java分布式之RMI简介及实例

    RMI是Enterprise JavaBeans的核心技术之一,同时也是构建分布式Java应用程序的一个便捷途径。它的使用非常直观,但其内部机制却十分强大。 #### RMI的关键特性 RMI的核心理念之一是接口定义与其实现分离。这意味着...

    关于java RMI分布式程序开发实例

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种用于构建分布式应用程序的技术。它允许Java对象在不同的 JVM(Java虚拟机)之间进行交互,仿佛它们是在同一个内存空间内一样。这个实例将带...

    Java分布式之RMI实例教程

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

    分布式实验报告RMI.docx

    RMI 是一种分布式对象通讯机制,允许运行在一个 Java 虚拟机的对象调用运行在另一个 Java 虚拟机上对象的方法。 一、RMI 基本概念 RMI 是一种分布式对象通讯机制,允许运行在一个 Java 虚拟机的对象调用运行在另一...

    基于JAVA的分布式系统 RMI

    Java 分布式系统是构建大型、可扩展网络应用的关键技术,它允许分布在不同计算机上的对象协同工作,共同完成复杂的任务。在Java中,RMI(Remote Method Invocation)和CORBA(Common Object Request Broker ...

    Java分布式RMI获取服务器时间

    Java分布式RMI获取服务器时间是一种基于Java平台的远程方法调用(Remote Method Invocation,简称RMI)技术的应用示例。RMI是Java EE中的一个重要组件,它允许在不同的Java虚拟机(JVM)之间透明地调用对象的方法,...

    JAVA分布式程序设计

    首先,我们需要了解Java中的RMI(Remote Method Invocation)技术,它是Java实现分布式计算的基础。RMI允许一个对象调用远程机器上的对象方法,仿佛它们是在同一个进程中执行一样。通过RMI,开发者可以构建跨网络的...

    Java 分布式应用程序设计代码

    1. **RMI(Remote Method Invocation)远程方法调用**:RMI是Java中用于在不同 JVM(Java虚拟机)之间进行通信的技术。它允许一个对象在一台机器上调用另一台机器上的对象的方法,就像它们都在同一台机器上一样。 2...

    Java 分布式应用程序设计

    1. **Java分布式计算基础**:Java为分布式计算提供了强大的支持,包括RMI(Remote Method Invocation)和JMS(Java Message Service),它们允许在不同计算机上的对象之间进行交互。RMI允许一个对象调用另一个在网络...

    教案Java分布式技术

    Java分布式技术是现代企业级应用开发中的重要组成部分,它允许应用程序在多个计算机上协同工作,以提高系统的可扩展性、可靠性和性能。本教案聚焦于Java在分布式环境下的核心技术,帮助学习者掌握如何构建和管理...

    Java分布式应用学习笔记

    本笔记将深入探讨Java分布式应用的核心概念、技术和实践。 1. 分布式Java应用基础 分布式Java应用的核心在于组件之间的远程方法调用(Remote Procedure Call, RPC)。Java RMI(Remote Method Invocation)是Java...

    Excavator(挖掘机)是一个分布式的Java RMI框架。.zip

    Excavator(挖掘机)是一个分布式的Java RMI框架。(求项目使用,有兴趣的可以电邮oldmanpushcart@gmail.com) 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言...

    Java分布式项目实战视频

    Java提供了丰富的API支持,如Java RMI(Remote Method Invocation)、JMS(Java Message Service)等,使得开发者能够轻松地构建分布式应用程序。此外,Java还拥有强大的社区支持和丰富的开源框架资源,例如Spring ...

    基于JAVA的分布式系统 RMI CORBA

    rmi corba 基于JAVA的分布式系统

Global site tag (gtag.js) - Google Analytics