9
OBTENCION DE UN VALOR DE LA SERIE DE FIBONACCI MEDIANTE RMI RMI (Java Remote Method Invocation) es un mecanismo ofrecido por Java para invocar un método de manera remota, lo cual nos permite poder crear applets más livianos con capacidad de resolver problemas más grandes, ya que en vez de contener todo el código necesario para resolver un problema, simplemente tiene un método de invocación hacia un método remoto, el cual se encargara de resolver el problema. Forma parte del entorno estándar de ejecución de Java y proporciona un mecanismo simple para la comunicación de servidores en aplicaciones distribuidas basadas exclusivamente en Java. Si se requiere comunicación entre otras tecnologías debe utilizarse CORBA o SOAP en lugar de RMI. RMI se caracteriza por la facilidad de su uso en la programación por estar específicamente diseñado para Java; proporciona paso de objetos por referencia (no permitido por SOAP), recolección de basura distribuida (Garbage Collector distribuido) y paso de tipos arbitrarios (funcionalidad no provista por CORBA), mediante lo cual, podremos resolver problemas de mayor envergadura, debido a la flexibilidad en los datos que se pueden trasmitir. A través de RMI, un programa Java puede exportar un objeto , con lo que dicho objeto estará accesible a través de la red y el programa permanece a la espera de peticiones en un puerto TCP . A partir de ese momento, un cliente puede conectarse e invocar los métodos proporcionados por el objeto, mediante esto, establecemos una comunicación, solicitando e invocando a los métodos, para resolver los problemas y luego que devuelvan el resultado, teniendo así una gran facilidad de cálculo, con el único inconveniente de depender de las velocidades de transmisión. La invocación se compone de los siguientes pasos:

Rmi Serie de Fibonacci

Embed Size (px)

Citation preview

Page 1: Rmi Serie de Fibonacci

OBTENCION DE UN VALOR DE LA SERIE DE FIBONACCI MEDIANTE RMI

RMI (Java Remote Method Invocation) es un mecanismo ofrecido por Java para invocar un método de manera remota, lo cual nos permite poder crear applets más livianos con capacidad de resolver problemas más grandes, ya que en vez de contener todo el código necesario para resolver un problema, simplemente tiene un método de invocación hacia un método remoto, el cual se encargara de resolver el problema.

Forma parte del entorno estándar de ejecución de Java y proporciona un mecanismo simple para la comunicación de servidores en aplicaciones distribuidas basadas exclusivamente en Java. Si se requiere comunicación entre otras tecnologías debe utilizarse CORBA o SOAP en lugar de RMI.

RMI se caracteriza por la facilidad de su uso en la programación por estar específicamente diseñado para Java; proporciona paso de objetos por referencia (no permitido por SOAP), recolección de basura distribuida (Garbage Collector distribuido) y paso de tipos arbitrarios (funcionalidad no provista por CORBA), mediante lo cual, podremos resolver problemas de mayor envergadura, debido a la flexibilidad en los datos que se pueden trasmitir.

A través de RMI, un programa Java puede exportar un objeto, con lo que dicho objeto estará accesible a través de la red y el programa permanece a la espera de peticiones en un puerto TCP. A partir de ese momento, un cliente puede conectarse e invocar los métodos proporcionados por el objeto, mediante esto, establecemos una comunicación, solicitando e invocando a los métodos, para resolver los problemas y luego que devuelvan el resultado, teniendo así una gran facilidad de cálculo, con el único inconveniente de depender de las velocidades de transmisión.

La invocación se compone de los siguientes pasos:

Encapsulado (marshalling) de los parámetros (utilizando la funcionalidad de serialización de Java), mediante esto, podemos abstraer el paso de los datos, encapsulando estos, y convirtiendo en un solo objeto que será transmitido.

Invocación del método (del cliente sobre el servidor). El invocador se queda esperando una respuesta luego de enviar los datos que utilizara el método invocado, es así que obtendremos la respuesta del cálculo realizado por el método remoto que se encuentra en el servidor.

Al terminar la ejecución, el servidor serializa el valor de retorno (si lo hay) y lo envía al cliente, donde nuevamente se realiza el encapsulado, para enviar los datos.

Page 2: Rmi Serie de Fibonacci

El código cliente recibe la respuesta y continúa como si la invocación hubiera sido local, ya que en su ejecución, es como si hubiera realizado una línea de código que le devolvía un valor, solo que el cálculo o método, fue realizado de forma remota.

La serie de Fibonacci es un problema clásico en el ámbito de la matemática, el cual es una sumatoria de números, que se inician en 0 y 1, donde cada número consiguiente es la suma de sus 2 predecesores, es así que por ejemplo, una serie de Fibonacci con 10 dígitos seria: 0 1 1 2 3 5 8 13 21 34, podemos apreciar el proceso y pasar a explicarlo de las siguiente manera:

- El proceso inicia con un 0 y un 1- 0 se suma a 1 y el resultado es 1

- Se suma el nuevo número obtenido al que esta anterior a él, es decir 1 más 1 que es 2

- Se continúa este proceso hasta obtener la cantidad de valores deseados.

El código en Java para la serie de Fibonacci es el siguiente:

public void recibirMensaje(String texto) throws RemoteException {

int numero1, numero2; numero2 = Integer.parseInt(texto); ventana.anadirEntradas(texto); /* for(int e=0;e<numero2;e++) { ventana.anadirEntradas("t"); }*/ int n = 0; int f = fibonacci(n); //Mando llamar al Metodo for(n=0; n<=numero2; n++){

f = fibonacci(n); ventana.anadirEntradas(f + ""); RmiCliente.recibir(f+ ""); }

/* if ("fer".equals(texto)) { ventana.anadirEntradas("texto correcto"); }*/

}

/** * @param args

Page 3: Rmi Serie de Fibonacci

*/ public static int fibonacci(int n) { if ( n == 0 ){ //Caso Base return 0; } else if ( n == 1){ //Caso Base return 1; } else{ return fibonacci(n - 1) + fibonacci(n - 2); //Metodo Recursivo }

}

Luego, la idea es crear un Applet que al ejecutarse en la maquina local, nos pida un número, que será el valor de la serie de Fibonacci que ocupe esa posición, por ejemplo si el numero fuera 10, el resultado seria 34 que es el valor de la serie de Fibonacci que ocupa la posición 10, al juntar el código de una comunicación mediante RMI y el de la serie de Fibonacci obtenemos lo siguiente:

CLIENTE

//RmiCliente.javaimport java.rmi.*;import java.rmi.registry.*;import javax.swing.*;

import java.awt.*;import java.awt.event.*;

/** * @author casidiablo * */public class RmiCliente extends JFrame implements ActionListener {

private JTextField cajaEnviar;

private JButton botonEnviar;

private JLabel estado;

private static InterfazReceptorMensajes rmiServidor;

private static Registry registro;

private static String direccionServidor = "192.168.1.15";

private static String puertoServidor = "3232";

Page 4: Rmi Serie de Fibonacci

public RmiCliente() {super("Cliente RMI");getContentPane().setLayout(new BorderLayout());cajaEnviar = new JTextField();cajaEnviar.addActionListener(this);botonEnviar = new JButton("Enviar");botonEnviar.addActionListener(this);estado = new JLabel("Estado...");

getContentPane().add(cajaEnviar);getContentPane().add(botonEnviar, BorderLayout.EAST);getContentPane().add(estado, BorderLayout.SOUTH);

setSize(300, 100);setVisible(true);

}

public void actionPerformed(ActionEvent e) {if (!cajaEnviar.getText().equals("")) {

enviarMensaje(cajaEnviar.getText());cajaEnviar.setText("");

}}

private static void conectarseAlServidor() {try {

// obtener el registroregistro =

LocateRegistry.getRegistry(direccionServidor,(new

Integer(puertoServidor)).intValue());// creando el objeto remotormiServidor = (InterfazReceptorMensajes)

(registro.lookup("rmiServidor"));

} catch (RemoteException e) {e.printStackTrace();

} catch (NotBoundException e) {e.printStackTrace();

}}

private void enviarMensaje(String mensaje) {estado.setText("Enviando " + mensaje + " a " +

direccionServidor + ":"+ puertoServidor);

try {// llamando el metodo remotormiServidor.recibirMensaje(mensaje);estado.setText("El mensaje se ha enviado!!!");

} catch (RemoteException re) {re.printStackTrace();

}}

Page 5: Rmi Serie de Fibonacci

static public void main(String args[]) {JFrame.setDefaultLookAndFeelDecorated(true);conectarseAlServidor();RmiCliente ventana = new RmiCliente();

ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}

}

SERVIDOR

import java.net.InetAddress;import java.rmi.*;import java.rmi.registry.*;import java.rmi.server.*;

import javax.swing.JFrame;

public class RmiServidor extends UnicastRemoteObject implementsInterfazReceptorMensajes {

private static GUIServidor ventana;

private int estePuerto;

private String estaIP;

private Registry registro;

public RmiServidor() throws RemoteException {try {

// obtener la direccion de este host.estaIP =

(InetAddress.getLocalHost()).toString();} catch (Exception e) {

throw new RemoteException("No se puede obtener la direccion IP.");

}estePuerto = 3232; // asignar el puerto que se

registraventana.anadirEntradas("Conexion establecida por...\

nEsta direccion="+ estaIP + ", y puerto=" + estePuerto);

try {

// crear el registro y ligar el nombre y objeto.registro =

LocateRegistry.createRegistry(estePuerto);registro.rebind("rmiServidor", this);

} catch (RemoteException e) {throw e;

Page 6: Rmi Serie de Fibonacci

}}

/* * (non-Javadoc) * * @see

InterfazReceptorMensajes#recibirMensaje(java.lang.String) */public void recibirMensaje(String texto) throws

RemoteException {int numero1, numero2;

numero2 = Integer.parseInt(texto); ventana.anadirEntradas(texto); /* for(int e=0;e<numero2;e++) { ventana.anadirEntradas("t"); }*/ int n = 0; int f = fibonacci(n); //Mando llamar al Metodo for(n=0; n<=numero2; n++){

f = fibonacci(n); ventana.anadirEntradas(f + ""); RmiCliente.recibir(f+ ""); }

/* if ("fer".equals(texto)) { ventana.anadirEntradas("texto correcto"); }*/

}

/** * @param args */

public static int fibonacci(int n) { if ( n == 0 ){ //Caso Base return 0; } else if ( n == 1){ //Caso Base return 1; } else{ return fibonacci(n - 1) + fibonacci(n - 2); //Metodo Recursivo

Page 7: Rmi Serie de Fibonacci

} }

public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(false);ventana = new GUIServidor();

ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);try {

new RmiServidor();} catch (Exception e) {

e.printStackTrace();System.exit(1);

}}

}