远程方法调用(RMI)是一种API,它允许对象在另一个地址空间中存在的对象上调用方法,该地址空间可能在同一台机器上,也可能在远程机器上。通过RMI,运行在计算机(客户端)上的JVM中的对象可以调用另一个JVM(服务器端)中的对象的方法。RMI创建一个公共远程服务器对象,该对象通过对服务器对象的简单方法调用来实现客户端和服务器端通信。
存根对象: 客户机上的存根对象构建一个信息块,并将该信息发送到服务器。
该区块由以下部分组成:
- 要使用的远程对象的标识符
- 要调用的方法名
- 远程JVM的参数
骨架对象: 骨架对象将请求从存根对象传递到远程对象。它执行以下任务
- 它对服务器上的真实对象调用所需的方法。
- 它将从存根对象接收的参数转发给方法。
RMI的工作
客户端和服务器之间的通信是通过使用两个中间对象来处理的:存根对象(在客户端)和骨架对象(在服务器端),也可以从下面的媒体描述如下:
以下是按顺序执行的步骤,以实现以下定义的接口:
- 定义远程接口
- 实现远程接口
- 使用rmic(RMI编译器)从实现类创建存根和骨架对象
- 启动注册表
- 创建并执行服务器应用程序
- 创建并执行客户端应用程序。
步骤1:定义远程接口
首先要做的是创建一个接口,该接口将提供远程客户端可以调用的方法的描述。这个接口应该扩展远程接口,接口中的方法原型应该抛出RemoteException。
例子:
JAVA
// Creating a Search interface import java.rmi.*; public interface Search extends Remote { // Declaring the method prototype public String query(String search) throws RemoteException; } |
第2步:实现远程接口 下一步是实现远程接口。为了实现远程接口,该类应该扩展到java的UnicastRemoteObject类。rmi包。此外,需要创建一个默认构造函数来抛出java。rmi。类中其父构造函数的RemoteException。
JAVA
// Java program to implement the Search interface import java.rmi.*; import java.rmi.server.*; public class SearchQuery extends UnicastRemoteObject implements Search { // Default constructor to throw RemoteException // from its parent constructor SearchQuery() throws RemoteException { super (); } // Implementation of the query interface public String query(String search) throws RemoteException { String result; if (search.equals( "Reflection in Java" )) result = "Found" ; else result = "Not Found" ; return result; } } |
步骤3:使用rmic从实现类创建存根和骨架对象 rmic工具用于调用创建存根和骨架对象的rmi编译器。它的原型是rmic类名。对于上述程序,需要在命令提示符下执行以下命令 rmic搜索查询。 第4步:启动注册中心 通过在命令提示符下发出以下命令启动注册表服务 步骤5:创建并执行服务器应用程序 下一步是创建服务器应用程序,并在单独的命令提示符下执行。
- 服务器程序使用LocaterRegistry类的createRegistry方法在服务器JVM内创建rmiregistry,并将端口号作为参数传递。
- 命名类的重新绑定方法用于将远程对象绑定到新名称。
JAVA
// Java program for server application import java.rmi.*; import java.rmi.registry.*; public class SearchServer { public static void main(String args[]) { try { // Create an object of the interface // implementation class Search obj = new SearchQuery(); // rmiregistry within the server JVM with // port number 1900 LocateRegistry.createRegistry( 1900 ); // Binds the remote object by the name // geeksforgeeks "/geeksforgeeks" ,obj); } catch (Exception ae) { System.out.println(ae); } } } |
第6步:创建并执行客户端应用程序 最后一步是创建客户机应用程序,并在单独的命令提示符下执行。命名类的查找方法用于获取存根对象的引用。
JAVA
// Java program for client application import java.rmi.*; public class ClientRequest { public static void main(String args[]) { String answer,value= "Reflection in Java" ; try { // lookup method to find reference of remote object Search access = "/geeksforgeeks" ); answer = access.query(value); System.out.println( "Article on " + value + " " + answer+ " at GeeksforGeeks" ); } catch (Exception ae) { System.out.println(ae); } } } |
注: 上面的客户机和服务器程序在同一台机器上执行,因此使用localhost。为了从另一台机器访问远程对象,本地主机将被替换为远程对象所在的IP地址。
根据类名将文件分别保存为
搜索java,SearchQuery。java,搜索服务器。java&ClientRequest。JAVA 重要观察结果:
- RMI是远程过程调用(RPC)的纯java解决方案,用于在java中创建分布式应用程序。
- 存根和骨架对象用于客户端和服务器端之间的通信。
本文由 阿卡什·奥哈 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以写一篇文章,然后将文章邮寄给评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。