Java RMI远程方法调用

Java安全
Article Directory
  1. 简介
  2. RMI具体实现代码

简介

RMI全称是 Remote Method Invocation,远程⽅法调⽤。让某个Java虚拟机上的对象调⽤另⼀个Java虚拟机中对象上的⽅法,RMI是Java独有的⼀种机制。

实现RMI Server的三部分:

  1. 创建一个继承了 java.rmi.Remote 的接口,在该接口中定义需要远程调用的函数。
  2. 创建一个实现了此接口的类,并继承 UnicastRemoteObject 类。
  3. 此实现接口类创建RMI注册表Registry的方法,将实现接口类进行实例化并绑定到RMI注册表中,并调用该方法启动RMI服务。

RMI具体实现代码

// RMIInterface.java
package RMIResearch;

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

// RMI接口继承Remote接口
public interface RMIInterface extends Remote {
     public String hello() throws RemoteException;
}
// RMIServer.java
package RMIResearch;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class RMIServer extends UnicastRemoteObject implements RMIInterface {
    // 继承UnicastRemoteObject类需要在本类受保护的构造方法中调用父类UnicastRemoteObject的构造方法,即super()
    protected RMIServer() throws RemoteException {
        super();
    }

    @Override
    public String hello() throws RemoteException {
        return "Hello, RMI!";
    }

    public void bindRegistry() throws RemoteException, MalformedURLException {
        // 实例化RMIServer类
        RMIServer rmiServer = new RMIServer();
        // 创建RMI远程方法调用注册表,端口为默认1099
        LocateRegistry.createRegistry(1099);
        // 将RMIServer的实例化对象绑定到RMI注册表中
        Naming.rebind("rmi://127.0.0.1:1099/hello",rmiServer);
    }

    public static void main(String[] args) throws RemoteException, MalformedURLException {
        // 启动RMIServer服务
        new RMIServer().bindRegistry();
    }
}
// RMIClient.java
package RMIResearch;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class RMIClient {
    public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
        // 通过RMI注册表查找名称为hello的远程对象,并将其转换成RMIInterface接口类型的对象lookup,客户端可以通过lookup对象调用该远程对象的方法实现远程过程调用(RPC)。
        RMIInterface lookup = (RMIInterface) Naming.lookup("rmi://127.0.0.1:1099/hello");
        System.out.println(lookup.hello());
    }
}

image-20230529102433944

运行RMIServer类后,再运行RMIClient类,成功通过RMI调用远程对象方法。

这里借用一张图来看这次RMI远程调用方法的整个过程:

RMI Registry像是一个路由网关,在RMIServer类上创建RMI注册表Registry绑定对象的关系,RMIClient通过Naming查询RMI Registry注册表的绑定关系,连接RMIServer,远程方法在RMIServer上调用。

Author: wileysec

Permalink: https://wileysec.github.io/403f70182d22.html

Comments