Java RMI,即 远程方法调用(Remote Method Invocation),它的实现依赖于Java虚拟机(JVM),RMI允许在一个Java虚拟机中运行的对象调用在另一个Java虚拟机中运行的对象上的方法。RMI是Java的一组拥护开发分布式应用程序的API,RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol),RMI能直接传输序列化后的Java对象和分布式垃圾收集,因此它仅支持从一个JVM到另一个JVM的调用。RMI提供了用Java编程语言编写的程序之间的远程通信。
这是一个RMI(Remote Method Invocation)远程方法调用的练习程序。
\--rmi
RemoteService.java
RMIClient.java
RMIServer.java
RMIService.java
RemoteService.java
一个远程接口文件,它定义了可以被远程调用的方法。
RMIService.java
远程服务的实现类。继承了UnicastRemoteObject类,这是RMI中实现远程对象的基类。实现了RemoteService接口,提供了run()方法的具体实现
RMIClient.java
RMI客户端程序。定义了与服务器相同的注册表端口(9999)、主机(localhost)和服务URL。在main方法中使用Naming.lookup查找远程服务对象,将返回的对象强制转换为RemoteService接口类型,然后调用远程服务的run()方法。
RMIServer.java
RMI服务器程序。定义了RMI注册表端口(9999)、主机(localhost)和服务URL。在main方法中创建RMIService实例作为远程服务实现,然后使用LocateRegistry.createRegistry创建RMI注册表,并使用Naming.rebind将远程服务绑定到命名服务。
总结
RMI的实现较为简单便捷,只需要在服务端创建实例、创建注册表、绑定远程服务到命名服务即可。在客户端使用Naming.lookup查找远程服务对象,将返回的对象强制转换为RemoteService接口类型即可直接调用。
RMI本质上只传输方法调用的参数和返回值。当你在远程对象的方法中执行System.out.println()
时,这些输出会打印在远程JVM的终端/日志中,而不是调用方的控制台。这是因为System.out
是本地进程的标准输出流,与RMI调用无关。