`

RMI实例分析

 
阅读更多
RMI实例分析
 
1.远程对象的本地接口声明(RMIOperate.java)  

   ·  该类仅仅是一个接口声明,RMI客户机可以直接使用它,RMI服务器必须通过一个远程对象来实现它,并用某个专有的URL注册它的一个实例。 
   ·  远程接口扩展 java.rmi.Remote  接口。
   ·  除了所有应用程序特定的例外之外,每个方法还必须在 throws 子句中声明 java.rmi.RemoteException (或 RemoteException  的父类)。
Hello.java
/*  * @author javamxj (CSDN Blog) 创建日期 2004-12-27  */  import  java . rmi . * ;  // RMI本地接口必须从Remote接口派生  public  interface  Hello  extends  Remote {  // 接口中的具体方法声明,注意必须声明抛出RemoteException  String  sayHello( String  name)  throws  RemoteException ; }
 
2.远程对象实现类

   这个类应实现RMI客户机调用的远程服务对象的本地接口,它必须从UnicastRemoteObject继承,构造函数应抛出RemoteException异常。 

 HelloImpl.java

 
/*

 * @author javamxj (CSDN Blog) 创建日期 2004-12-27

 */

import
 java
.
rmi
.
*
;

import
 javax
.
rmi
.
PortableRemoteObject
;

public
 class
 HelloImpl extends
 PortableRemoteObject implements
 Hello {
    /* 构造函数 */

    public
 HelloImpl() throws
 RemoteException
 {
        super
();
    }
    /* 实现本地接口中声明的'sayHello()'方法 */

    public
 String
 sayHello(String
 message) throws
 RemoteException
 {
        System
.out.println("我在RMI的服务器端,客户端正在调用'sayHello'方法。 "
);
        System
.out.println("Hello  "
 + message);
        return
 message;
    }
}





 
3.RMI服务器类

   该类创建远程对象实现类HelloImpl的 一个实例,然后通过一个专有的URL来注册它。所谓注册就是通过Java.rmi.Naming.bind()方法或 Java.rmi.Naming.rebind()方法,将HelloImpl实例绑定到指定的URL上。

 HelloServer.java

/*

 * @author javamxj (CSDN Blog) 创建日期 2004-12-27

 */

import
 java
.
rmi
.
*
;

public
 class
 HelloServer {
    public
 static
 void
 main(String
[] args) {
        // 在服务器端设置安全机制         

        /*

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

               System.setSecurityManager(new RMISecurityManager()); 

           }

        */
         
        try
 {
            System
.out.println("开始 RMI Server ..."
);
            /* 创建远程对象的实现实例 */

            HelloImpl hImpl = new
 HelloImpl();
            System
.out.println("将实例注册到专有的URL "
);
            Naming
.rebind("HelloService"
, hImpl);
            
            System
.out.println("等待RMI客户端调用..."
);
            System
.out.println(""
);
        } catch
 (Exception
 e) {
            System
.out.println("错误: "
 + e);
        }
    }
}

请注意有关 rebind  方法调用的下列参数:

  • 第一个参数是 URL 格式的 java.lang.String ,表示远程对象的位置和名字。 
    • 需要将 myhost  的值更改为服务器名或 IP 地址。否则,如果在 URL 中省略,则主机缺省值为当前主机,而且在 URL 中无需指定协议(例如“HelloServer ”)。 
    • 在 URL 中,可以选择提供端口号:例如“//myhost:1234/HelloServer”。 端口缺省值为 1099。除非服务器在缺省 1099 端口上创建注册服务程序,否则需要指定端口号。 
  • 第二个参数为从中调用远程方法的对象实现引用。 
  • RMI 运行时将用对远程对象 stub 程序的引用代替由 hImpl  参数指定的实际远程对象引用。远程实现对象(如 HelloImpl  实例)将始终不离开创建它们的虚拟机。因此,当客户机在服务器的远程对象注册服务程序中执行查找时,将返回包含该实现的 stub 程序的对象。 
 
4.RMI客户机类  

   ·  RMI客户 使用java.rmi.Naming.lookup()方法,在指定的远程主机上查找RMI服务对象,若找到就把它转换成本地接口RMIOperate类 型。它与CORBA不同之处在于RMI客户机必须知道提供RMI服务主机的URL,这个URL可以通过rmi://host/path或rmi: //host:port/path来指定,如果省略端口号,就默认使用1099。 
   ·  Java.rmi.Naming.lookup()方法可能产生三个异 常:Java.rmi.RemoteException、Java.rmi.NotBoundException、 java.net. MalformedURLException,三个异常都需要捕获。

HelloClient.java

/*

 * @author javamxj (CSDN Blog) 创建日期 2004-12-27

 */

import
 java
.
rmi
.
*
;

public
 class
 HelloClient {
    public
 static
 void
 main(String
[] args) {
        //   在服务器端设置安全机制         

        /*

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

               System.setSecurityManager(new RMISecurityManager()); 

           }

        */
     
        /* 默认为本地主机和默认端口 */

        String
 host = "localhost:1099"
;
        /* 带输入参数时,将host设置为指定主机 */

        if
 (args.length > 0)
            host = args[0];
        try
 {
            /* 根据指定的URL定位远程实现对象 */

            /* “h”是一个标识符,我们将用它指向实现“Hello”接口的远程对象 */

            Hello h = (Hello) Naming
.lookup("rmi://"
 + host + "/HelloService"
);
            
            System
.out.println("实现“Hello”接口的远程对象: "
 + h);
            System
.out.println("我在客户端,开始调用RMI服务器端的'sayHello'方法"
);
            System
.out.println("欢迎,  "
 + h.sayHello("javamxj blog"
));
        } catch
 (Exception
 ex) {
            System
.out.println("错误 "
 + ex);
        }
    }
}
 
 
5. 编译代码与运行系统:
 
   在MS-DOS环境下,创建一个D:\RMISample目录,把上面4个文件复制到这个目录下,然后在此目录下新建两个文件夹:client和server(把它们分别看作是客户端与服务端)。
 
(1).编译所有的源代码
    D:\RMISample> javac *.java

(2).生成客户端存根和服务器框架
    D:\RMISample> rmic HelloImpl
    这将生成HelloImpl_Stub.class
   (  :如果需要查看这两个类的源代码,可以使用“ rmic -keep HelloImpl”语句)
 
(3).把Hello.class、HelloClient.class、HelloImpl_Stub.class复制到client目录;
    把Hello.class、HelloServer.class、HelloImpl.class、HelloImpl_Stub.class 复制到server目录。
 
(4).启动RMI注册
    D:\RMISample>start rmiregistry
   (注:我是在命令控制台下运行这个系统的,必须开启三个控制台窗口,一个运行RMIRegistry,一个运行服务器,还有一个运行客户端。)
 
(5).运行和调用

● 在服务器上执行HelloServer
  D:\RMISample\server>java HelloServer
 
● 在本地客户机上运行HelloClient
  D:\RMISample\client>java HelloClient
 
● 在远程客户机上运行HelloClient(须指明RMI服务器主机名或IP地址)
   java HelloClient  222.222.34.34
 
运行rmiregistry和server后的结果:
 
 再运行Client后的结果:
 
 
 
分享到:
评论

相关推荐

    一个相当经典的RMI实例源代码及详细说明

    一个相当经典的RMI实例源代码及详细说明

    Java RMI设计实现的分析与研究.pdf

    RMI是开发java网络分布式应用系统的一个重要框架,开发人员通过运用RMI框架将更...该文详细介绍了RMI的运行机制,并对运用RMI框架进行分布式系统的开发步骤进行了阐述,最后给出了RMI技术的具体应用实例和实现方法。

    基于Java RMI的分布式计算* (2005年)

    分布式计算是一个非常有意义和挑战的研究方向。Java的多线程和平台独立的特性为在异构系统中实现分布式计算...详细地分析了Java RMI的工作原理,并结合实例分析表明该环境能在复杂的异构系统中有效地实行分布式计算。

    J2EE应用开发详解

    218 12.1.3 RMI的优点 219 12.2 一个RMI的简单实例 219 12.3 小结 226 第13章 Web服务概论 227 13.1 SOA简介 227 13.2 Web服务简介 229 13.3 Web服务的核心技术 230 13.3.1 SOAP 232 13.3.2 WSDL 235 13.3.3 UDDI ...

    深入Java Servlet网络编程

    1 上传文件及表单域的请求实体的分析 6. 2. 2 得到上传文件的编程实例 6. 3 使用Servlet下载文件 6. 3. 1 相关的HTTP协议的规定 6. 3. 2 使用Servlet下载文件实例 第7章 在Servlet中使用数据库 7. 1 JDBC...

    Java思维导图xmind文件+导出图片

    RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper 分布式系统的基石 从0开始搭建3个节点额度zookeeper集群 深入分析Zookeeper在disconf配置中心的应用 ...

    java社交源码-BrandFeelingBackEnd:BrandFeeling后端项目的源代码,使用并行编程,文本挖掘和社交网络数据情感分

    java社交源码品牌感觉后端 后端系统代表了Brand Feeling的旧版本,这是系统的核心,它负责对从社交网络中检索到的文本数据进行数据分析,并将...每个后端实例都由冗余系统()调用,并且还从前端系统()接收用户输入。

    超级有影响力霸气的Java面试题大全文档

     SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。...

    java 面试题 总结

    Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...

    可自管理的分布式工作流引擎的设计与实现

    火龙果软件工程技术中心 引言工作流技术是实现企业业务过程建模、业务过程仿真分析、业务过程优化、业务过程管理与集成,从而最终实现业务过程自动化的核心技术[1]。早期的工作流应用系统都是集中式的,即由一个...

    Java核心技术II(第8版)

    4.4.2 分析SQL异常 4.4.3 组装数据库 4.5 执行查询操作 4.5.1 预备语句 4.5.2 读取和写出LOB 4.5.3 SQL转义 4.5.4 多结果集 4.5.5 获取自动生成键 4.6 可滚动和可更新的结果集 4.6.1 可滚动的结果集 4.6.2 可更新的...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    5.2.1 序列化的概念 将在内存中的各种对象的状态(也就是实例变量,不是方法)保存在磁盘中或者在网络中进行传输,并且可以把保存的对象状态再读出来。 将一个Java对象写入IO流;与此对应的,则是从IO流中恢复一个...

    PaaS通用校园办公云平台的设计与实现

    强大的工作流中间件保证了系统流程的稳定运行,自定义的工作流中间件也能够根据paas平台的需要而进行调整,并且在课程中讲解了工作流反向同步平台组织机构的功能,工作流提供了RMI服务,从而实现了分布式的部署,...

    Java并发编程(学习笔记).xmind

    远程方法调用(RMI) 正确协同多个对象中的共享状态 正确协同远程对象本身状态的访问 Swing和AWT 事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现 框架通过在框架线程中调用...

    二十三种设计模式【PDF版】

    主要用来对语言的分析,应用机会不多. 设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. 设计模式引言 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。...

    WampServer设置apache伪静态出现404 not found及You don’t have permission to access / on this server解决方法分析 原创

    本文实例讲述了WampServer设置apache伪静态出现404 not found及You don’t have permission to access / on this server解决方法。分享给大家供大家参考。具体如下: 出现404 not found 时: 确保LoadModule rewrite_...

    RED HAT LINUX 6大全

    本书全面系统地介绍了Red Hat Linux 6。全书共分为五个部分,包括35章和四个附录。第一部分为Red Hat Linux的介绍和安装;第二部分为服务配置;第三部分为系统管理;第四部分为Linux编程;第五部分为附录。...

Global site tag (gtag.js) - Google Analytics