`
jyangzi5
  • 浏览: 213747 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

RMI实例

    博客分类:
  • RMI
阅读更多
Remote Method Invocation (RMI -- Java远程方法调用)允许您使用Java编写分布式对象。本文将介绍RMI的优点以及如何将其连接到现有的和原有的系统中,以及与用Java 编写的组件的连接,同时给出了一个详细的例子,可以给初学者提供一个学习范本。  

一、RMI(远程方法调用)的组成
一个正常工作的RMI系统由下面几个部分组成:
1、远程服务的接口定义
2、远程服务接口的具体实现
3、桩(Stub)和框架(Skeleton)文件
4、一个运行远程服务的服务器
5、一个RMI命名服务,它允许客户端去发现这个远程服务
6、类文件的提供者(一个HTTP或者FTP服务器)
7、一个需要这个远程服务的客户端程序
二、RMI(远程方法调用)的工作原理
RMI系统结构,在客户端和服务器端都有几层结构。
--------- ----------
| 客户 | | 服务器|
---------- ----------
| |
------------- ----------
| 占位程序 | | 骨干网 |
-------------- -----------
| |
------------------------------------
| 远 程 引 用 层 |
------------------------------------
| |
------------------------------------
| 传 输 层 |
------------------------------------

方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。

要完成以上步骤需要有以下几个步骤:

1、生成一个远程接口
2、实现远程对象(服务器端程序)
3、编写服务器程序 、注册远程对象、启动远程对象
4、编写客户程序
  在JDK1.5之后,用java提供的API将会更加的简单,可以参照下面的例子;

三、例子

1、远程接口
/**
* 该接口定义了一个方法,用于提供远程服务;
*/
package com.liuxiang.rmi.download;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
* 远程对象接口
*/
public interface IRMI extends Remote{
    public Object invoke(ITask task) throws RemoteException;
}

2、实现远程对象(服务器端程序)

/**
* 实现了远程接口定义的方法;该实现远程对象中,调用了传入参数的task.doWork()方
* 法,同时执行一个本地调用,调用一个播放Mp3的代码段ProcessCaller.callMp3();
*/
package com.liuxiang.rmi.download;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import com.liuxiang.callwindow.ProcessCaller;

/**
* 远程对象的实现
*/
public class IRMIImpl extends UnicastRemoteObject implements IRMI {

    protected IRMIImpl() throws RemoteException {
        super();
    }

    private static final long serialVersionUID = 6131922116577454476L;

public Object invoke(ITask task) throws RemoteException {
        System.out.println("注意:这是一个远程调用");
        Object obj = task.doWork();
        System.out.println("调用ITask.doWork()方法的返回值:"+obj.toString());
        //客户端调用,可以在服务器端播放需要的音乐
        ProcessCaller.callMp3();
        return obj;
    }

}

3、播放Mp3代码段的源代码如下:

package com.liuxiang.callwindow;

/**
* 在java中调用windows程序
*/
public class ProcessCaller {
    /**
     * 调用Windows程序
     * 利用Windows Media Player播放mp3音乐
     */
    public static void callMp3() {
        Runtime ru = Runtime.getRuntime();
        try {
            // 调用播放器文件播放指定MP3
            Process p1 = ru.exec("C:\Program Files\Windows Media Player\wmplayer F:/music/lx/刘若英-后来.mp3");
        } catch (Exception e) {

        }
    }

    public static void main(String[] args) {
        callMp3();
    }

}

4、任务接口

/**
* 该接口定义了远程方法需要传递的参数
*/
package com.liuxiang.rmi.download;

import java.io.Serializable;

/**
* 任务接口
*
*/
public interface ITask extends Serializable{
    public Object doWork();
}


5、任务接口实现

package com.liuxiang.rmi.download;

/**
* 任务实现类
* 该实现定义了远程方法需要传递的参数
*
*/
public class TaskImpl implements ITask{

    public Object doWork() {
        System.out.println("当前程序处于远程调用中");
        return "动态上载对象的返回值";
    }
   
}

6、编写服务器程序 、注册远程对象、启动远程对象

/**
*远程对象的注册类.该类应该在服务器端执行
*执行之后,该机器将变为RMI服务器,客户端可以通过正确的url来访问;
*服务器上的远程对象;执行对外报露的方法
*/
package com.liuxiang.rmi.download;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIServer {
    /**
     * 如果没有创建一个Registry,Naming是不会帮助你创建的。 还是自己手工创建的比较的好
     *
     * 尽量用下面的自己封装的bind方法来注册远程对象
     *
     * @throws Exception
     */
    public static void registRemoteObject() throws Exception {
        IRMIImpl impl = new IRMIImpl();
        Naming.rebind("rmi://219.233.8.97:1111/mytask", impl);
        System.out.println("bound success!");
    }

    /**
     * 创建一个Registry对象
     *
     * @return 返回一个Registry对象
     */
    private static Registry createRegistry() {
        Registry registry = null;
        int port = 1111;
        try {
            registry = LocateRegistry.getRegistry(port);
            registry.list();
            System.out.println("Register the exist server!");
        } catch (final Exception e) {
            try {
                registry = LocateRegistry.createRegistry(port);
                System.out.println("Register the exist server!port=" + port);
            } catch (final Exception ee) {
                ee.printStackTrace();
            }
        }
        return registry;
    }

    /**
     * 将对象注册到rmi服务器上
     */
    public static void bind() {
        Registry registry = null;
        registry = createRegistry();
        try {
            IRMIImpl impl = new IRMIImpl();
            registry.rebind("mytask", impl);
            System.out.println("mytask server start!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            bind();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

//运行该服务端代码后,将会注册一个远程服务对象,通过恰当的URL可以访问远程对象
//中的方法;运行后的结果如下:

//Register the exist server!port=1111
//mytask server start!

7、编写客户程序
/**
* 代码首先获取一个远程对象,然后如同本地调用一样,调用远程对象中的方法。
*/
package com.liuxiang.rmi.download;

import java.rmi.Naming;

public class RMIClient {
    /**
     * 调用远程对象中的方法
     * @throws Exception
     */
    public static void getRemoteObject() throws Exception{
        IRMI obj = (IRMI)Naming.lookup("rmi://localhost:1111/mytask");    //得到远程发布的服务
        TaskImpl task = new TaskImpl();
        Object result = obj.invoke(task);    //调用远程服务的方法
        System.out.println(result.toString());
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            getRemoteObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

最后,运行客户端代码,可以看到控制台分别输出了如下的内容:

Server端输出了更多的内容,如下:
Register the exist server!port=1111
mytask server start!
注意:这是一个远程调用
当前程序处于远程调用中
调用ITask.doWork()方法的返回值:动态上载对象的返回值
同时可以看到,会调用了Windows的Mediaplay播放本地磁盘的Mp3歌曲;

Client端输出了如下内容:
动态上载对象的返回值
分享到:
评论

相关推荐

    Java RMI实例

    Java RMI实例

    dwr实例操作+rmi实例操作

    6. **RMI实例操作** - **创建远程接口**:例如定义一个名为`Calculator`的接口,包含加减乘除的远程方法。 - **实现远程接口**:实现`Calculator`接口,实现计算逻辑。 - **启动RMI服务**:在服务器端启动RMI服务...

    一个RMI实例

    这个“一个RMI实例”显然是一个供初学者使用的示例项目,可以帮助理解RMI的基本原理和操作流程。 在RMI中,主要有以下几个核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,它继承自java...

    中间件实验(rmi实例)

    中间件实验(RMI 实例)是 Java RMI(Remote Method Invocation,远程方法调用)的实验报告,旨在通过实验了解 Java RMI 的机制和开发流程。本实验报告主要介绍了 RMI 的基本概念、实验步骤、实验结果和结论分析等...

    rmi的实例rmi的实例rmi的实例

    在"rmidemo"这个压缩包中,很可能包含了一个完整的RMI实例。通常,它会有一个服务端项目,用于实现和注册远程对象,以及一个客户端项目,用于查找并调用远程对象的方法。具体代码可能如下: - 服务端(Server.java...

    简单的rmi实例下载

    这个简单的RMI实例可能是为了帮助初学者理解RMI的基本工作原理和实现步骤。 RMI的核心概念是客户端和服务端。服务端通过RMI注册一个远程接口,该接口定义了可供客户端调用的方法。客户端则通过RMI机制获取到服务端...

    一个简单的RMI实例

    这个“简单的RMI实例”演示了如何在不依赖像Tomcat这样的Web服务器的情况下实现RMI。下面我们将深入探讨RMI的基本概念、配置过程以及如何创建和运行这个实例。 ### RMI基本概念 1. **远程对象(Remote Object)**:...

    JAVARMI实例[文].pdf

    在Java RMI实例中,我们通常会经历以下几个步骤: 1. **创建远程接口**:首先,我们需要定义一个远程接口,这个接口需要扩展`java.rmi.Remote`。远程接口中的所有方法都需要抛出`RemoteException`,这是因为远程...

    Java分布式之RMI实例教程

    ### Java分布式之RMI实例教程知识点详解 #### 一、RMI基础知识介绍 **RMI (Remote Method Invocation)** 是一种Java技术,用于实现分布式应用程序之间的远程过程调用。通过RMI,开发者可以在不同的JVM之间调用方法...

    最最简单的RMI实例

    总结一下,这个简单的RMI实例展示了如何创建一个远程接口,实现该接口,启动服务器以导出远程对象,以及编写客户端代码进行调用。RMI的实现包括了接口定义、实现、服务器注册和客户端调用四个关键步骤。在实际应用中...

    rmi实例(Spring整合)

    **标题:“RMI实例(Spring整合)”** 远程方法调用(Remote Method Invocation,简称RMI)是Java中的一种机制,允许一个Java对象在某个Java虚拟机(JVM)上执行另一个Java对象的方法,即使该对象位于不同的网络...

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

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

    rmi实例详解

    【RMI实例详解】 远程方法调用(RMI,Remote Method Invocation)是Java JDK 1.1引入的一种分布式对象技术,旨在简化分布在不同环境下的Java应用程序间的通信。RMI允许对象在不同的Java虚拟机(JVM)之间进行交互,...

    JAVA RMI 实例

    java rmi小例子源代码 ,运行Reg.java ,再执行Client客户端代码就能看效果。如果在不同jvm下执行,注意接口定义包路径客服端和服务端必须保持一致。 客服端包含文件有服务端接口的定义文件。

    java远程调用rmi实例

    本实例将深入讲解如何使用Java RMI在Linux环境中启动远程服务,并在Windows环境下进行操作。 首先,理解RMI的基本原理:RMI系统由两部分组成,客户端和服务器端。服务器端暴露远程接口,客户端通过引用这个远程接口...

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

    RMI(Remote Method Invocation,远程方法调用)是Java中的一种技术,用于构建分布式系统,使得在一台机器上的对象能够调用另一台机器上对象的方法,就像它们在同一个进程中一样。RMI使得开发者可以创建跨网络的、...

    一个java RMI应用实例 构建简单的RMI应用

    创建客户端RMI调用服务端的应用程序。 启动服务端,再启动客户端,测试是否调用成功。 如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类...

    RMI接口 实例演示

    RMI远程调用开发实例,必须打开防火墙。 必须要在jdk安装目录D:\Java\jdk1.7\jre\lib\security javaws.policy文件加上 grant { permission java.security.AllPermission "", ""; };

Global site tag (gtag.js) - Google Analytics