JAVA RMI使用

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法

Java RMI概念

在Java中,只要一个类继承了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。JavaDoc描述:Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在“远程接口”(扩展 java.rmi.Remote 的接口)中指定的这些方法才可远程使用。

编写一个RMI的步骤

  1. 定义一个远程接口,此接口需要继承Remote
  2. 开发远程接口的实现类
  3. 创建一个server并把远程对象注册到端口
  4. 创建一个client查找远程对象,调用远程方法

那就先从HelloWorld开始,先看下代码结构

  1. 服务端
    这里写图片描述
  2. 客户端
    这里写图片描述
    客户端与服务端在两个不同的工程,用于模拟两个JVM,有条件的可以试试位于两台不同电脑。这两个工程都是maven工程,方便jar包管理。
    接下来上代码;
    服务端:
    远程调用的接口类与实现类
public interface RemoteHelloWord extends Remote{
    String sayHello() throws RemoteException;
}

public class RemoteHelloWordImpl implements RemoteHelloWord{

    @Override
    public String sayHello() throws RemoteException {
        // TODO Auto-generated method stub
        return "Hello World";
    }

}

服务发布类 导出远程对象,并注册远程对象到指定端口。

public class RMIServer {
    public static void main(String[] args) {
        try {
            RemoteHelloWord hello=new RemoteHelloWordImpl();
            RemoteHelloWord stub=(RemoteHelloWord)UnicastRemoteObject.exportObject(hello, 9999);
            LocateRegistry.createRegistry(1099);
            Registry registry=LocateRegistry.getRegistry();
            registry.bind("helloword", stub);
            System.out.println("绑定成功!");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            e.printStackTrace();
        }
    }
}

客户端调用类 获取远程对象并调用

public class RMIClient {
    public static void main(String[] args) {
        try {
            Registry registry = LocateRegistry.getRegistry("localhost");
            RemoteHelloWord hello = (RemoteHelloWord)        registry.lookup("helloword");
            String ret = hello.sayHello();
            System.out.println(ret);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        }
    }
}

执行程序,远程调用成功
这里写图片描述

代码就贴到这边了,这里只是简单介绍RMI的使用,更多rmi请网上查询资料
下面分析下RMI的优劣势
优势:这种机制给分布计算的系统设计、编程都带来了极大的方便。只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。

  1. 面向对象: RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似Java Hash表这样的复杂类型作为一个参数进行传递。
  2. 安全性: RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
  3. 跨平台:RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。

缺点:

  1. 只支持JAVA语言,不支持不同开发语言系统间的远程调用。
  2. RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章