Nota:
paquete java.rmi : La invocación de método remoto (RMI) ha quedado obsoleta en Java 9 y versiones posteriores, en favor de otros mecanismos de comunicación remota como servicios web o llamadas a procedimiento remoto (RPC).
La invocación de método remoto (RMI) es una API que permite que un objeto invoque un método en un objeto que existe en otro espacio de direcciones, que podría estar en la misma máquina o en una máquina remota. A través de RMI, un objeto que se ejecuta en una JVM presente en una computadora (del lado del cliente) puede invocar métodos en un objeto presente en otra JVM (del lado del servidor). RMI crea un objeto de servidor remoto público que permite las comunicaciones del lado del cliente y del servidor a través de llamadas a métodos simples en el objeto del servidor.
Objeto de código auxiliar: El objeto stub en la máquina cliente crea un bloque de información y envía esta información al servidor.
El bloque consta de
- Un identificador del objeto remoto que se utilizará.
- Nombre del método que se va a invocar
- Parámetros de la JVM remota
Objeto esqueleto: El objeto esqueleto pasa la solicitud del objeto stub al objeto remoto. Realiza las siguientes tareas
- Llama al método deseado sobre el objeto real presente en el servidor.
- Reenvía los parámetros recibidos del objeto stub al método.
Funcionamiento de RMI
La comunicación entre el cliente y el servidor se maneja mediante el uso de dos objetos intermedios: el objeto Stub (en el lado del cliente) y el objeto Skeleton (en el lado del servidor), como también se puede representar en los siguientes medios de la siguiente manera:
Estos son los pasos a seguir secuencialmente para implementar la interfaz como se define a continuación:
- Definición de una interfaz remota
- Implementación de la interfaz remota
- Creación de objetos Stub y Skeleton a partir de la clase de implementación usando rmic (compilador RMI)
- Iniciar el rmiregistry
- Crear y ejecutar el programa de aplicación del servidor.
- Cree y ejecute el programa de aplicación cliente.
Paso 1: Definir la interfaz remota
Lo primero que debe hacer es crear una interfaz que proporcione la descripción de los métodos que pueden invocar los clientes remotos. Esta interfaz debería ampliar la interfaz remota y el prototipo del método dentro de la interfaz debería generar la excepción RemoteException.
Ejemplo:
Java
int a cadena java
// Creating a Search interface> import> java.rmi.*;> public> interface> Search> extends> Remote> {> > // Declaring the method prototype> > public> String query(String search)> throws> RemoteException;> }> |
>
>
Paso 2: implementar la interfaz remota
El siguiente paso es implementar la interfaz remota. Para implementar la interfaz remota, la clase debe extenderse a la clase UnicastRemoteObject del paquete java.rmi. Además, es necesario crear un constructor predeterminado para generar java.rmi.RemoteException desde su constructor principal en la clase.
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;> > }> }> |
>
>
Paso 3: crear objetos Stub y Skeleton a partir de la clase de implementación usando rmic
La herramienta rmic se utiliza para invocar el compilador rmi que crea los objetos Stub y Skeleton. Su prototipo es el nombre de clase rmic. Para el programa anterior, se debe ejecutar el siguiente comando en el símbolo del sistema
Consulta de búsqueda rmic.
Paso 4: inicie rmiregistry
Inicie el servicio de registro emitiendo el siguiente comando en el símbolo del sistema start rmiregistry
Paso 5: crear y ejecutar el programa de aplicación del servidor
El siguiente paso es crear el programa de aplicación del servidor y ejecutarlo en un símbolo del sistema independiente.
- El programa del servidor utiliza el método createRegistry de la clase LocateRegistry para crear rmiregistry dentro de la JVM del servidor con el número de puerto pasado como argumento.
- El método rebind de la clase Naming se utiliza para vincular el objeto remoto al nuevo nombre.
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> > Naming.rebind(> ' rmi://localhost:1900 '> +> > '/geeksforgeeks'> ,obj);> > }> > catch> (Exception ae)> > {> > System.out.println(ae);> > }> > }> }> |
>
>
Paso 6: crear y ejecutar el programa de aplicación cliente
El último paso es crear el programa de aplicación cliente y ejecutarlo en un símbolo del sistema independiente. El método de búsqueda de la clase Naming se utiliza para obtener la referencia del objeto Stub.
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 => > (Search)Naming.lookup(> ' rmi://localhost:1900 '> +> > '/geeksforgeeks'> );> > answer = access.query(value);> > System.out.println(> 'Article on '> + value +> > ' '> + answer+> ' at techcodeview.com'> );> > }> > catch> (Exception ae)> > {> > System.out.println(ae);> > }> > }> }> |
>
>
Nota: El programa cliente y servidor anterior se ejecuta en la misma máquina, por lo que se utiliza localhost. Para acceder al objeto remoto desde otra máquina, localhost debe reemplazarse con la dirección IP donde está presente el objeto remoto.
guarde los archivos respectivamente según el nombre de la clase como
Search.java , SearchQuery.java , SearchServer.java & ClientRequest.java
Observaciones importantes:
- RMI es una solución Java pura para llamadas a procedimientos remotos (RPC) y se utiliza para crear aplicaciones distribuidas en Java.
- Los objetos Stub y Skeleton se utilizan para la comunicación entre el lado del cliente y el servidor.