日期:2014-05-19  浏览次数:20713 次

J2EE 技术概览
     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) {