精华内容
下载资源
问答
  • RMI

    2019-10-04 11:56:53
    RMI RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力...

    RMI

    RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

    RMI目前(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,Java RMI具有Java的"Write Once,Run Anywhere"的优点,是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。

    Java远程方法调用(Java RMI)是Java API对远程过程调用(RPC)提供的面向对象的等价形式,支持直接传输序列化的Java对象和分布式垃圾回收。远程方法调用可以看做是激活远程正在运行的对象上的方法的步骤。RMI对调用者是位置透明的,因为调用者感觉方法是执行在本地运行的对象上的。看下RMI的一些注意事项。

    RMI体系结构的基本原则
    RMI体系结构是基于一个非常重要的行为定义和行为实现相分离的原则。RMI允许定义行为的代码和实现行为的代码相分离,并且运行在不同的JVM上。

    RMI体系结构
    存根和骨架层(Stub and Skeleton layer):这一层对程序员是透明的,它主要负责拦截客户端发出的方法调用请求,然后把请求重定向给远程的RMI服务。
    远程引用层(Remote Reference Layer):RMI体系结构的第二层用来解析客户端对服务端远程对象的引用。这一层解析并管理客户端对服务端远程对象的引用。连接是点到点的。
    传输层(Transport layer):这一层负责连接参与服务的两个JVM。这一层是建立在网络上机器间的TCP/IP连接之上的。它提供了基本的连接服务,还有一些防火墙穿透策略。

    **RMI中的远程接口(Remote Interface)**用来标识哪些方法是可以被非本地虚拟机调用的接口。远程对象必须要直接或者是间接实现远程接口。实现了远程接口的类应该声明被实现的远程接口,给每一个远程对象定义构造函数,给所有远程接口的方法提供实现。

    RMI的绑定(Binding)
    绑定是为了查询找远程对象而给远程对象关联或者是注册以后会用到的名称的过程。远程对象可以使用Naming类的bind()或者rebind()方法跟名称相关联。

    让RMI程序能正确运行的步骤

    • 编译所有的源文件
    • 使用rmic生成stub
    • 启动rmiregistry
    • 启动RMI服务器
    • 运行客户端程序

    RMI的stub扮演的角色
    远程对象的stub扮演了远程对象的代表或者代理的角色。调用者在本地stub上调用方法,它负责在远程对象上执行方法。当stub的方法被调用的时候,会经历以下几个步骤:
    初始化到包含了远程对象的JVM的连接。
    序列化参数到远程的JVM。
    等待方法调用和执行的结果。
    反序列化返回的值或者是方法没有执行成功情况下的异常。
    把值返回给调用者。

    DGC叫做分布式垃圾回收。RMI使用DGC来做自动垃圾回收。因为RMI包含了跨虚拟机的远程对象的引用,垃圾回收是很困难的。DGC使用引用计数算法来给远程对象提供自动内存管理。

    RMI中使用RMI安全管理器(RMISecurityManager)的目的
    RMISecurityManager使用下载好的代码提供可被RMI应用程序使用的安全管理器。如果没有设置安全管理器,RMI的类加载器就不会从远程下载任何的类。

    展开全文
  • rmi

    2011-05-15 19:54:24
    RmiMonitorService.java package nbpt.ts.manager.message.service; import java.rmi.Remote;...import java.rmi.RemoteException;... * Description: 实时显示RMI服务接口... * RMI接口必须扩展接口java.rmi.Remote...
    RmiMonitorService.java
    package nbpt.ts.manager.message.service;

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

    /**
    * Description: 实时显示RMI服务接口.
    *
    * RMI接口必须扩展接口java.rmi.Remote
    *
    * @author Peter Wei
    * @version 1.0 Feb 25, 2009
    */
    public interface RmiMonitorService extends Remote {
    /**
    * 实时显示对外接口
    *
    * @param funindex
    * 功能号
    * @param param
    * 键名列表,也就是实际传输的内容
    * @return
    * @throws RemoteException
    * 远程接口方法必须抛出java.rmi.RemoteException
    */
    public int interactive(int funindex, String param) throws RemoteException;
    }
    RmiMonitorServiceImpl.java
    package nbpt.ts.manager.message.service.impl;

    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    // import nbpt.ts.manager.base.util.AppContext;
    import nbpt.ts.manager.message.service.RmiMonitorService;
    import nbpt.ts.manager.message.service.WarnService;
    /**
    * Description: 实时显示RMI接口实现.
    *
    * 实现RMI接口及远程方法(继承UnicastRemoteObject)
    *
    * @author Peter Wei
    * @version 1.0 Feb 25, 2009
    */
    public class RmiMonitorServiceImpl extends UnicastRemoteObject implements
    RmiMonitorService {

    private static final long serialVersionUID = -3771656108378649574L;

    public static final int SUCCSS = 1;

    public static final int FAIL = 0;

    public WarnService warnService;

    /**
    * 必须定义构造方法,因为要抛出RemoteException异常
    *
    * @throws RemoteException
    */
    public RmiMonitorServiceImpl() throws RemoteException {
    super();
    }

    public int interactive(int funindex, String param) throws RemoteException {

    int result = FAIL;
    switch (funindex) {
    // 告警
    case (1): {

    // warnService = (WarnService) AppContext.getAppContext().getBean(
    // "warn.warnService");
    // 实际应用是从Spring应用中获取告警Service,如上代码
    warnService = new WarnServiceImpl();
    // 网络告警的业务操作
    warnService.dealWarn(param);
    result = SUCCSS;
    }
    break;
    case (2):
    // do other biz
    break;
    }
    // ......

    return result;
    }

    public WarnService getWarnService() {
    return warnService;
    }

    public void setWarnService(WarnService warnService) {
    this.warnService = warnService;
    }

    }

    RmiServer.java
    package nbpt.ts.manager.message.service;

    import java.net.MalformedURLException;
    import java.rmi.AlreadyBoundException;
    import java.rmi.Naming;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import nbpt.ts.manager.message.service.impl.RmiMonitorServiceImpl;
    /**
    * Description: RMI服务端.
    *
    * @author Peter Wei
    * @version 1.0 Feb 25, 2009
    */
    public class RmiServer {

    public String ip = "localhost";

    public int port = 8889;

    /**
    * 启动RMI注册服务,并注册远程对象.实际应用中是在Spring初始化并启动
    */
    public void init() {
    try {
    LocateRegistry.createRegistry(port);
    // 创建一个远程对象
    RmiMonitorService comm = new RmiMonitorServiceImpl();
    Naming.bind("//" + ip + ":" + port + "/comm", comm);
    } catch (RemoteException e) {
    System.out.println("创建远程对象发生异常!" + e.toString());
    e.printStackTrace();
    } catch (AlreadyBoundException e) {
    System.out.println("发生重复绑定对象异常!" + e.toString());
    e.printStackTrace();
    } catch (MalformedURLException e) {
    System.out.println("发生URL畸形异常!" + e.toString());
    e.printStackTrace();
    }
    }

    public String getIp() {
    return ip;
    }

    public void setIp(String ip) {
    this.ip = ip;
    }

    public int getPort() {
    return port;
    }

    public void setPort(int port) {
    this.port = port;
    }

    public static void main(String[] args) {
    // 实际应用中是在Spring初始化并启动
    RmiServer rmiServer = new RmiServer();
    System.out.println("RMI服务初始化:");
    rmiServer.init();

    }
    }
    MonitorClient.java
    package nbpt.ts.manager.message.service;

    import java.net.MalformedURLException;
    import java.rmi.Naming;
    import java.rmi.NotBoundException;
    import java.rmi.RemoteException;
    /**
    * Description: RMI客户端.
    *
    * @author Peter Wei
    * @version 1.0 Feb 25, 2009
    */
    public class MonitorClient {

    public RmiMonitorService monitorService;

    public String ip = "localhost";

    public int port = 8889;

    public int interactive(int funindex, String param) {
    int result = 0;
    try {
    getMonitorService().interactive(funindex, param);
    result = 1;
    } catch (RemoteException e) {
    e.printStackTrace();
    }
    return result;
    }

    public RmiMonitorService getMonitorService() {
    try {
    // 在RMI服务注册表中查找名称为RmiMonitorService的对象,并调用其上的方法
    monitorService = (RmiMonitorService) Naming.lookup("rmi://" + ip
    + ":" + port + "/comm");

    } catch (NotBoundException e) {
    e.printStackTrace();
    } catch (MalformedURLException e) {
    e.printStackTrace();
    } catch (RemoteException e) {
    e.printStackTrace();
    }
    return monitorService;
    }

    public static void main(String args[]) throws RemoteException {
    MonitorClient client = new MonitorClient();
    System.out.println("发送告警信息:");
    String msg = "tsid=1022&devid=10001027&warnid=102&warntype=01&warnlevel=1&warnmsg=设备出错,请检查.";
    System.out.println(client.getValue(msg, "warnmsg"));
    client.interactive(1, msg);

    }

    public String getValue(String content, String key) {
    String value = "";

    int begin = 0, end = 0;
    begin = content.indexOf(key + "=");
    end = content.indexOf("&", begin);

    if (end == -1)
    end = content.length();
    value = content.substring(begin + key.length() + 1, end);
    return value;

    }
    }

    WarnService.java
    package nbpt.ts.manager.message.service;

    /**
    * Description: 告警服务
    *
    * @author Peter Wei
    * @version 1.0 2010-8-22
    */
    public interface WarnService {

    /**
    * 处理告警:告警来时的业务操作,实际操作是解析消息存库,然后界面Ajax定时刷新数据,获取实时告警展示
    *
    * @param message
    * @return
    */
    public int dealWarn(String message);
    }
    WarnServiceImpl.java
    package nbpt.ts.manager.message.service.impl;

    import nbpt.ts.manager.message.service.WarnService;

    /**
    * Description: 告警服务
    *
    * @author Peter Wei
    * @version 1.0 2010-8-22
    */
    public class WarnServiceImpl implements WarnService {

    public int dealWarn(String message) {
    // 告警处理方法
    System.out.println("已接收网络告警");
    // …
    return 1;
    }

    }
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,641
精华内容 7,456
关键字:

rmi