Prerrequisito: RMI
RMI (invocación de método remoto) se utiliza para el sistema de referencias de objetos distribuidos. Un objeto distribuido es un objeto que publica su interfaz en otras máquinas. Un objeto remoto es un objeto distribuido cuyo estado está encapsulado. Stub y Skeleton son dos objetos que se utilizan para comunicarse con el objeto remoto.
Stub: Stub es una puerta de enlace para el programa cliente que se utiliza para comunicarse con el objeto esqueleto, estableciendo una conexión entre ellos.
Esqueleto: Reside en el programa del servidor que se utiliza para pasar la solicitud del stub a la interfaz remota.
Cómo se lleva a cabo la comunicación y el proceso en RMI:
Pasos para ejecutar la aplicación Java RMI en la consola
- Creación de clases e interfaces para el planteamiento del problema : Los pasos involucrados en esto son los siguientes:
- Cree una interfaz remota que amplíe java.rmi.Remote :
Una interfaz remota determina el objeto que el cliente puede invocar de forma remota. Esta interfaz se puede comunicar con el programa del cliente. Esta interfaz debe extender la interfaz java.rmi.Remote .
Declaración del problema: crear una aplicación RMI para encontrar el factorial de un número
Programa de interfaz
import
java.math.BigInteger;
// Creating an Interface
public
interface
Factorial
extends
java.rmi.Remote {
// Declaring the method
public
BigInteger fact(
int
num)
throws
java.rmi.RemoteException;
}
- Cree una clase que amplíe java.rmi.server.UnicastRemoteObject e implemente la interfaz anterior.
Esta clase implementará la interfaz remota. Haz el cálculo requerido para el enunciado del problema.
Implementación de Interfaz
import
java.math.BigInteger;
// Extends and Implement the class
// and interface respectively
public
class
FactorialImpl
extends
java.rmi.server.UnicastRemoteObject
implements
Factorial {
// Constructor Declaration
public
FactorialImpl()
throws
java.rmi.RemoteException
{
super
();
}
// Calculation for the problem statement
// Implementing the method fact()
// to find factorial of a number
public
BigInteger fact(
int
num)
throws
java.rmi.RemoteException
{
BigInteger factorial = BigInteger.ONE;
for
(
int
i =
1
; i <= num; ++i) {
factorial = factorial
.multiply(
BigInteger
.valueOf(i));
}
return
factorial;
}
}
- Crear una clase de servidor (con localhost y nombre de servicio)
Para alojar un servicio, se crea el programa del servidor mediante el cual se puede llamar al método java.rmi.Naming.rebind() que toma dos argumentos, es decir, una referencia de objeto (nombre de servicio) y una referencia de instancias.
programa servidor
import
java.rmi.Naming;
public
class
FactorialServer {
// Implement the constructor of the class
public
FactorialServer()
{
try
{
// Create a object reference for the interface
Factorial c =
new
FactorialImpl();
// Bind the localhost with the service
}
catch
(Exception e) {
// If any error occur
System.out.println(
"ERR: "
+ e);
}
}
public
static
void
main(String[] args)
{
// Create an object
new
FactorialServer();
}
}
- Crear una clase de cliente (con localhost y nombre de servicio)
El programa del cliente invocará el método java.rmi.Naming.lookup() para la URL de RMI y devolverá una instancia de tipo de objeto (interfaz factorial). Todo el RMI se realiza en este objeto.
programa cliente
import
java.net.MalformedURLException;
import
java.rmi.Naming;
import
java.rmi.NotBoundException;
import
java.rmi.RemoteException;
public
class
FactorialClient {
public
static
void
main(String[] args)
{
try
{
// Create an remote object with the same name
// Cast the lookup result to the interface
Factorial c = (Factorial);
// Call the method for the results
System.out.println(c.fact(
30
));
}
// If any error occur
catch
(MalformedURLException murle) {
System.out.println(
"\nMalformedURLException: "
+ murle);
}
catch
(RemoteException re) {
System.out.println(
"\nRemoteException: "
+ re);
}
catch
(NotBoundException nbe) {
System.out.println(
"\nNotBoundException: "
+ nbe);
}
catch
(java.lang.ArithmeticException ae) {
System.out.println(
"\nArithmeticException: "
+ ae);
}
}
}
- Cree una interfaz remota que amplíe java.rmi.Remote :
- Compilación de todo el programa.
Use javac para compilar los cuatro programas y rmic (compilador RMI) para crear archivos de clase stub y skeleton.
- Ejecutando el sistema:
Después de la fase de compilación, el sistema ya está listo para ejecutarse. Para ejecutar el sistema, abra tres pantallas de consola (muévase a esa ruta donde reside el programa). Uno para el cliente, uno para el servidor y otro para el Registro RMI.
- Comience con un registro, use
rmiregistry
, si no hay ningún error, el registro comenzará a ejecutarse y ahora pasará a la segunda pantalla. - En la segunda consola ejecuta el programa servidor y aloja el FactorialService. Se iniciará y esperará la conexión del cliente y cargará la implementación en la memoria.
- En la tercera consola, ejecute el programa cliente.
- Comience con un registro, use
De esta forma, RMI se puede ejecutar en tres consolas para localhost. RMI utiliza la pila de red y la pila TCP/IP para la comunicación de tres JVM diferentes.
Publicación traducida automáticamente
Artículo escrito por bilal-hungund y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA