Java Remote Method Invocation (RMI)
La arquitectura RMI puede verse como un modelo de 4 capas (esto como las capas del modelo ISO OSI ayudan a hacer el troubleshooting en una red con complicaciones, al separar el proceso en layers que cumplen una función en específico):
- Primera capa
- Segunda capa
La capa 2 es la capa proxy, o capa stub-skeleton. Esta capa es la que interactúa directamente con la capa de aplicación. Todas las llamadas a objetos remotos y acciones junto con sus parámetros y retorno de objetos tienen lugar en esta capa.
- Tercera capa
La capa 3 es la de referencia remota, y es responsable del manejo de la parte semántica de las invocaciones remotas. También es responsable de la gestión de la replicación de objetos y realización de tareas específicas de la implementación con los objetos remotos, como el establecimiento de las persistencias semánticas y estrategias adecuadas para la recuperación de conexiones perdidas. En esta capa se espera una conexión de tipo stream (stream-oriented connection) desde la capa de transporte.
- Cuarta capa
La capa 4 es la de transporte. Es la responsable de realizar las conexiones necesarias y manejo del transporte de los datos de una máquina a otra. El protocolo de transporte subyacente para RMI es JRMP (Java Remote Method Protocol), que solamente es "comprendido" por programas Java.
Lo primero que se debe implementar para establecer comunicación entre los programas es el servidor. Vamos a crear una interface que enumere las funciones provistas por el objeto a ser exportado por la red osea que queramos invocar de forma remota (solo se declara, no se define). Esta interfaz es compartida entre cliente-servidor. Del lado del servidor vamos a crear una clase que implemente esta interfaz que acabo de mencionar.Después por el lado del cliente también se accede a esa misma interfaz, pero existe una clase stub que es la que se encarga a establecer el envío del mensaje por red, y recibir una respuesa.
El programa ejemplo se compone de 2 ventanas, una para el cliente y una para el servidor. El cliente tiene una caja de texto donde se escriben los mensajes a enviar; dichos mensajes se envían utilizando un método remoto(el método se encuentra en la clase RmiServidor.java). Mientras, el servidor posee un area de texto donde se muestran los mensajes que recibe de los posibles clientes.
Para descargar el código vayan a la siguiente liga, también podrán encontrar explicación detallada de cómo funciona RMI, el código no lo hice yo, esta es la página del autor: http://casidiablo.net/rmi-%C2%BFque-es-un-ejemplo-sencillo-con-rmi/
El código se compone de 5 clases:
- RmiServidor.java
- GUIServidor.java
- InterfazReceptorMensajes.java
- RmiCliente.java
La clase GUIServidor solo nos servirá para mostrar los procesos que el servidor realicé, osea mostrar el String escrito que le llega al Servidor desde el Cliente.
La clase InterfazReceptorMensajes es una interfaz que hereda de la clase Remote ( de java.rmi.) aquí es donde anteriormente mencioné que se declara el método recibirMensaje (solo se declara, se definirá en la clase RmiServidor.java)
La clase RmiCliente declara un objeto de la interfaz InterfazReceptorMensajes y dos objetos String en donde colocaremos la dirección IP del servidor a conectarnos y el puerto.
Como pueden ver en el código, la dirección del server es la 127.0.0.1, eso quiere decir que el servidor lo correré en la misma computadora (es la dirección localhost), lo ideal es hacerlo en 2 computadoras, también hacer la prueba con más clientes.
El método enviarMensaje es el que realmente utiliza RMI. Dicho método utiliza la función recibirMensaje del objeto rmiServidor, es decir: utiliza el método remoto del servidor a través de la interfaz.
Explicación más detallada del código pueden encontrarla en la liga antes mencionada (página del autor del código). Para la próxima sesión modificaré el código e intentaré correrlo en más computadoras para aprovechar este feature ofrecido por java.
Yo corrí los códigos con éxito y estos son los pantallazos (para compilarlo pueden hacer como con cualquier otro programa de java, yo hice javac *.java):
Saludos!
Bien :) 5 y 5.
ResponderEliminar