Invocación de métodos remotos en Java

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 (lado del cliente) puede invocar métodos en un objeto presente en otra JVM (lado del servidor). RMI crea un objeto de servidor remoto público que permite las comunicaciones del lado del servidor y del cliente a través de llamadas a métodos simples en el objeto del servidor.

Objeto stub: El objeto stub en la máquina cliente construye un bloque de información y envía esta información al servidor.

El bloque consta de

  • Un identificador del objeto remoto a utilizar.
  • Nombre del método que se va a invocar.
  • Parámetros a 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 en el objeto real presente en el servidor.
  • Reenvía los parámetros recibidos del objeto stub al método.

Trabajo 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 desde los siguientes medios:

Estos son los pasos a seguir secuencialmente para implementar la Interfaz como se define a continuación de la siguiente manera:

  1. Definición de una interfaz remota
  2. Implementación de la interfaz remota
  3. Crear objetos Stub y Skeleton desde la clase de implementación usando rmic (compilador RMI)
  4. Inicie el registro de rmire
  5. Crear y ejecutar el programa de aplicación del servidor.
  6. Cree y ejecute el programa de aplicación del cliente.

Paso 1: Definición de 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 debe extender la interfaz remota y el prototipo del método dentro de la interfaz debe generar la excepción remota.

Ejemplo:

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: Implementación de 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, se debe crear un constructor predeterminado para lanzar la excepción 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: Creación de objetos Stub y Skeleton a partir de la clase de implementación mediante rmic
La herramienta rmic se utiliza para invocar el compilador rmi que crea los objetos Stub y Skeleton. Su prototipo es rmic classname. Para el programa anterior, el siguiente comando debe ejecutarse en el símbolo del sistema
rmic SearchQuery.
Paso 4: Inicie rmiregistry
Inicie el servicio de registro emitiendo el siguiente comando en el símbolo del sistema start rmiregistry
Paso 5: Cree y ejecute 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 de reenlace 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 del cliente
El último paso es crear el programa de aplicación del cliente y ejecutarlo en un símbolo del sistema independiente. El método de búsqueda de la clase Naming se usa 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 GeeksforGeeks");
        }
        catch(Exception ae)
        {
            System.out.println(ae);
        }
    }
}

Nota: El programa de 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 y ClientRequest.java
Observaciones importantes:

  1. RMI es una solución java pura para llamadas a procedimientos remotos (RPC) y se utiliza para crear aplicaciones distribuidas en java.
  2. Los objetos Stub y Skeleton se utilizan para la comunicación entre el cliente y el lado del servidor.

Este artículo es una contribución de Aakash Ojha . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *