一. Java RMI概述
RMI远程方法调用是计算机之间通过网络实现对象调用的一种通讯机制。使用这种机制,一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。
二.示例
1.先看下示例结构
2. agent:是本地的意思;remote是远程服务端。
3. 先看下远端服务包下的类:
Service.java ---------------------->服务类的接口。
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* @Description: 服务接口(用于本地调用远端服务的代理接口和远端服务实现的接口)
* @Author: zwh
* @Date: 2019-08-17
* @Time: 22:02
*/
public interface Service extends Remote {
public String sayHello() throws RemoteException;
}
ServiceImpl.java ---------------------->服务类接口实现类。
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* @Description: 远程端的业务实现
* @Author: zwh
* @Date: 2019-08-17
* @Time: 22:05
*/
public class ServiceImpl extends UnicastRemoteObject implements Service {
protected ServiceImpl() throws RemoteException {
}
@Override
public String sayHello() throws RemoteException {
System.out.println("远程调用成功");
return "hello";
}
}
main.java ---------------------->启动方法。
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/**
* @Description: 远程端注册服务到RMI
* @Author: zwh
* @Date: 2019-08-17
* @Time: 22:07
*/
public class main {
public static void main(String[] args) throws RemoteException, MalformedURLException {
Service service = new ServiceImpl();
LocateRegistry.createRegistry(8888);
System.setProperty("java.rmi.server.hostname", "127.0.0.1");
Naming.rebind("rmi://localhost:8888/RemoteService", service);
System.out.println("远程服务ServiceImpl绑定成功!");
}
}
4. agent包下的类
ServiceClient.java ---------------------->启动方法。
/**
* @Description: 本地客户端(通过调用本地代理service来调用远端服务的客户端)
* @Author: zwh
* @Date: 2019-08-17
* @Time: 22:04
*/
public class ServiceClient{
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
Service remoteService = (Service) Naming.lookup("rmi://127.0.0.1:8888/RemoteService");
System.out.println(remoteService.sayHello());
}
}
三. 运行
1.首先启动main类的主函数,使得Service可以注册到RMI
2.这时就可以启动客户端,客户端通过RMI查找注册到服务,并通过找到的服务调用相应的方法,RMI再通过网络的方式调用远端服务相应的方法,再将数据通过网络返回给本地代理。