简介
RMI全称是
Remote Method Invocation
,远程⽅法调⽤。让某个Java虚拟机上的对象调⽤另⼀个Java虚拟机中对象上的⽅法,RMI是Java独有的⼀种机制。
实现RMI Server的三部分:
- 创建一个继承了
java.rmi.Remote
的接口,在该接口中定义需要远程调用的函数。 - 创建一个实现了此接口的类,并继承
UnicastRemoteObject
类。 - 此实现接口类创建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());
}
}
运行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