Todo sobre el registro de RMI de Java y cómo usarlo

Todo sobre el registro de RMI de Java y cómo usarlo / Programación

RMI representa invocación de método remoto y, como su nombre lo indica, es un protocolo para que un programa Java invoque un método de un objeto que se ejecuta en otra computadora. Proporciona una API ¿Qué son las API y cómo las API abiertas cambian de Internet? ¿Qué son las API y cómo las API abiertas cambian de Internet ¿Alguna vez se ha preguntado cómo los programas en su computadora y los sitios web que visita se "comunican" entre sí? Leer más (Interfaz de programación de aplicaciones) para exportar un objeto desde un programa (llamado servidor) e invocar los métodos de ese objeto desde otro programa (llamado cliente), posiblemente ejecutándose en una computadora diferente.

El java Registro RMI es un componente clave del sistema de Java RMI y proporciona un directorio centralizado para que los servidores registren servicios y para que los clientes busquen estos servicios. En este artículo, aprendemos cómo implementar un servidor para exponer un objeto y un cliente para invocar un método en el servidor, así como registrar y buscar el servicio en el Registro de RMI..

Declarar la interfaz del servidor

Para conocer las complejidades de cómo funciona el sistema RMI de Java, implementemos un objeto de servidor simple que proporcione un método para aceptar un nombre y devolver un saludo. Aquí está la definición de la interfaz del objeto:

import java.rmi.Remote; import java.rmi.RemoteException; la interfaz pública El saludo se extiende a Remoto saludo público de la cadena (nombre de la cadena) lanza RemoteException;  

El nombre de la interfaz se llama Saludo. Proporciona un solo método llamado saludar() que acepta un nombre y devuelve un saludo adecuado.

Para marcar esta interfaz como exportable, necesita extender el java.rmi.Remote interfaz. También el método necesita declarar un arroja listado de cláusulas java.rmi.RemoteException además de las excepciones específicas de la aplicación Excepciones de Java: ¿Está manejándolas correctamente? Excepciones de Java: ¿Estás manejándolas bien? Una excepción en la programación significa una condición excepcional en la ejecución del programa. Se usa cuando la condición se puede manejar mejor en otros lugares. Considere los siguientes ejemplos de manejo de excepciones de Java. Lee mas . Esto es para que el código del cliente pueda manejar (o propagar) errores de invocación de métodos remotos, como Host no encontrado, falla de conexión, etc.

Implementando el objeto de servidor

Después de declarar la interfaz (que es utilizada por los clientes), implementamos el objeto del lado del servidor y proporcionamos la saludar() método como se muestra. Utiliza una cadena de formato simple para formatear el saludo..

La clase pública GreetingObject implementa Greeting private String fmtString = "Hello,% s"; saludo público de cadena (nombre de cadena) return String.format (this.fmtString, nombre);  

El método principal del servidor

Vamos a cotejar todas estas piezas juntas e implementar el principal() Método del servidor. Pasemos por cada uno de los pasos relevantes..

  • El primer paso es crear la implementación del objeto servidor..
    Saludo saludo = nuevo GreetingObject (); 
  • A continuación, obtenemos un apéndice para el objeto de servidor del tiempo de ejecución de RMI. El código auxiliar implementa la misma interfaz que el objeto de servidor. Sin embargo, el método implementa la comunicación requerida con el objeto de servidor remoto. El cliente utiliza este apéndice para invocar de forma transparente el método en el objeto de servidor.
    Stub de saludo = (Greeting) UnicastRemoteObject.exportObject (greeting, 0); 
  • Una vez que se obtiene el código auxiliar, le damos este código auxiliar al registro de RMI para que se enlace a un servicio especificado. Cuando el cliente solicita una implementación de este servicio, recibe el código auxiliar que sabe cómo comunicarse con el objeto del servidor. En lo siguiente, el método estático LocateRegistry.getRegistry () Se utiliza para obtener la referencia del registro local. los reencuadernar() El método se utiliza para vincular el nombre al código auxiliar.
    String name = "Greeting"; Registro del registro = LocateRegistry.getRegistry (puerto); registry.rebind (nombre, stub); 

El método principal completo.

import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Main static public void main (String [] args) lanza Exception if (args.length == 0) System.err.println ("use: java Main port #"); System.exit (1);  índice int = 0; int port = Integer.parseInt (args [index ++]); String name = "Greeting"; Saludo saludo = nuevo GreetingObject (); Stub de saludo = (Greeting) UnicastRemoteObject.exportObject (greeting, 0); Registro del registro = LocateRegistry.getRegistry (puerto); registry.rebind (nombre, stub); System.out.println ("Saludo vinculado a \" "+ nombre +" \ "");  

Construyendo el Servidor

Veamos ahora cómo construir el servidor. Para mantener las cosas simples, construimos usando la línea de comandos en Linux en lugar de usar una herramienta de compilación como Maven.

Lo siguiente compila los archivos de origen en archivos de clase en un directorio de destino.

rm -rf target mkdir target javac -d target src / server / *. java 

Recoge los archivos de clase en un archivo JAR para su ejecución.

jar cvf target / rmi-server.jar -C servidor de destino 

También recopilamos los archivos de interfaz necesarios para compilar el cliente en un JAR de biblioteca.

jar cvf target / rmi-lib.jar -C servidor de destino / Greeting.class 

Implementando el cliente

Veamos ahora la implementación del cliente utilizado para invocar los métodos de objeto de servidor..

  • Al igual que con el servidor, obtenga una referencia al registro, especificando el nombre de host donde se ejecuta el registro y el número de puerto.
    Registro del registro = LocateRegistry.getRegistry (host, puerto); 
  • A continuación, busque el servicio en el registro. los buscar() método devuelve un código auxiliar que se puede utilizar para invocar servicios.
    Saludo saludo = (Saludo) registry.lookup (nombre); 
  • E invoca el método pasando los argumentos requeridos. Aquí, recibimos el saludo pasando el nombre e imprimiéndolo..
    System.out.println (name + "reportó:" + greeting.greet (myName)); 

El código de cliente completo:

cliente de paquete import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; servidor de importación. public class Client main public void main (String [] args) lanza Exception if (args.length! = 3) System.err.println ("use: java Client host port myName"); System.exit (1);  índice int = 0; Cadena de host = argumentos [índice ++]; int port = Integer.parseInt (args [index ++]); String myName = args [index ++]; String name = "Greeting"; Registro del registro = LocateRegistry.getRegistry (host, puerto); Saludo saludo = (Saludo) registry.lookup (nombre); System.out.println (name + "reportó:" + greeting.greet (myName));  

El registro de RMI

Ahora ejecutemos el programa del servidor para que pueda comenzar a atender las solicitudes..

java -cp target / rmi-server.jar server.Main 1099 # throws Excepción en el hilo "main" java.rmi.ConnectException: conexión rechazada al host: xxx; La excepción anidada es: java.net.ConnectException: conexión rechazada 

Qué es esta excepción Cómo manejar las excepciones de Java de la manera correcta Cómo manejar las excepciones de Java de la manera correcta En este artículo, aprenderá qué son las excepciones de Java, por qué son importantes, cómo usarlas y cómo evitar errores comunes. Lee mas ? conexión denegada.

La razón por la que obtiene esta excepción es porque: tenga en cuenta que el código del servidor intenta conectarse al registro local en el puerto 1099. Si eso falla, terminará con esta excepción.

La solución es ejecutar el registro de RMI. El registro de RMI es un programa que se envía con la máquina virtual de Java y se llama rmiregistry. Debe estar ubicado en el compartimiento Directorio de instalación de la Máquina Virtual Java. Ejecutarlo es tan simple como:

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 

De forma predeterminada, el registro escucha en el puerto 1099. Para que escuche en otro puerto, especifique el número de puerto de la siguiente manera:

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100 

Compruebe que exista un oyente en el puerto especificado con el comando netstat 8 Comandos CMD para administrar redes (inalámbricas) en Windows 8 Comandos CMD para administrar redes (inalámbricas) en Windows Tendrás que empezar a usar el símbolo del sistema. Estos son los comandos más útiles para administrar y solucionar problemas de su red doméstica. Lee mas :

netstat -an -t tcp -p | grep ESCUCHAR ... tcp6 0 0 ::: 1100 ::: * ESCUCHAR 23450 / rmiregistry 

Ejecutando el servidor

Intentemos ejecutar el servidor nuevamente..

java -cp target / rmi-server.jar server.Main 1100 # lanza java.rmi.UnmarshalException: error unmarshalling argumentos ... Causado por: java.lang.ClassNotFoundException: server.Greeting ... 

¡Una excepción otra vez! Qué es esta vez?

El servidor no puede cargar la clase de interfaz servidor.Saludo. Esto sucede porque el Registro RMI no puede cargar la clase requerida. Así que necesitas especificar la ubicación de las clases requeridas. Una forma de hacerlo es especificar la variable de entorno CLASSPATH:

CLASSPATH =… /… /junk/target/rmi-lib.jar /usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100 

Intentando volver a ejecutar el servidor da:

java -cp target / rmi-server.jar server.Main 1100 # imprime el saludo vinculado a "Saludo" 

Ahora el servidor se está ejecutando.

Ejecutando el cliente

Una vez que todas las partes se ensamblan y ejecutan, ejecutar el cliente es simple. Necesita los JAR apropiados para su ejecución. Estos incluyen la clase que contiene el principal() Método, y la clase de interfaz. Acepta argumentos que indican dónde se está ejecutando el registro de RMI y un nombre para el saludo.

java -cp target / rmi-client.jar: target / rmi-lib.jar client.Client localhost 1100 Peter # impresiones Saludo informado: Hola, Peter 

Resumen

Java RMI proporciona una API y herramientas para facilitar la ejecución remota de código. Puede implementar un servidor que registre un objeto de servicio con el registro de RMI de Java. Los clientes pueden consultar el registro y obtener el código auxiliar del objeto de servicio para invocar los métodos de servicio. Como lo ilustra este ejemplo, todo es bastante simple..

¿Está utilizando Java RMI en su proyecto? ¿Cuál ha sido tu experiencia? ¿Hay alguna alternativa que hayas investigado? Por favor háznoslo saber en los comentarios más abajo.

Explorar más sobre: ​​Java.