定义:Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)(Remote procedure call)的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。它的实现依赖于Java虚拟机(JVM),因此它仅支持从一个JVM到另一个JVM的调用。
rmi的实现
(1) 直接使用Registry实现rmi
服务端:
public class RmiService {
public static void main(String[] args) {
try {
// 本地主机上的远程对象注册表Registry的实例,默认端口1099
Registry registry = LocateRegistry.createRegistry(1099);
// 创建一个远程对象
HelloRegistryFacade hello = new HelloRegistryFacadeImpl();
// 把远程对象注册到RMI注册服务器上,并命名为HelloRegistry
registry.rebind("HelloRegistry", hello);
System.out.println("======= 启动RMI服务成功! =======");
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
服务端接口:
/**
* Created by Administrator on 2019/8/1.
* 服务端提供的服务接口
* 继承Remote接口
*/
public interface HelloRegistryFacade extends Remote {
String helloworld(String name) throws RemoteException;
}
服务端接口实现类:
/**
* Created by Administrator on 2019/8/1.
* 远程服务接口实现类
* 必须继承UnicastRemoteObject 因为UnicastRemoteObject同时继承Serializable Remote RemoteServer
*/
public class HelloRegistryFacadeImpl extends UnicastRemoteObject implements HelloRegistryFacade {
public HelloRegistryFacadeImpl() throws RemoteException{
super();
}
@Override
public String helloworld(String name) throws RemoteException {
return "[Registry] 你好!"+name;
}
}
客户端:
public class RegistryClient {
public static void main(String[] args){
try{
//根据远程地址端口号获取注册表对象
Registry registry = LocateRegistry.getRegistry(1099);
//使用注册名获取远程接口实例对象
HelloRegistryFacade helloRegistry = (HelloRegistryFacade) registry.lookup("HelloRegistry");
//类似调用本地接口一样调用远程接口获取结果数据
String kaichun = helloRegistry.helloworld("kaichun");
System.out.print("==========>"+kaichun+",<=============");
}catch (RemoteException | NotBoundException e) {
e.printStackTrace();
}
}
}
服务端运行结果:
客户端运行结果: