Está en la página 1de 20

Aplicación sencilla de RMI con el SGBD MySQL

Desarrollado por:

Cristino Calihua Panzo


Ing. En Sistemas Computacionales

Grupo 803

Zongolica ver., a 25 de junio de 2011


Ing. En Sistemas Computacionales

Índice

Definiciones........................................................................................................................................................2
Ficheros de código para el servidor....................................................................................................................3
InterfazRemota:..............................................................................................................................................3
ObjetoRemoto:...............................................................................................................................................4
ObjetoRemoto_Stub:......................................................................................................................................6
Servidor:.........................................................................................................................................................6
Pantalla:..........................................................................................................................................................8
Ficheros de códigos para el cliente...................................................................................................................10
InterfazRemota:............................................................................................................................................10
Cliente:.........................................................................................................................................................11
Compilando los ficheros desde consola............................................................................................................16
Creando la base de datos..................................................................................................................................21
Configuración para la conexión entre el Servidor y el Cliente...........................................................................23
Realizando la configuración..........................................................................................................................23
Ejecutando el servidor......................................................................................................................................25
Ejecutando el Cliente........................................................................................................................................26

Definiciones

2
Ing. En Sistemas Computacionales

RMI: Es una invocación de métodos remotos, es decir, un método puede llamar a otro
método que está a una distancia, esto se logra utilizando conexiones cableadas,
inalámbricas o internet, donde una computadora puede ser el servidor y las demás pueden
ser clientes, así los clientes harán peticiones al servidor, estas peticiones son las
invocaciones remotas de los métodos.

RMI trabaja con dos aplicaciones, un servidor y un cliente. Además de estos dos, también
se requiere de una aplicación llamado RMIREGISTRY, esta aplicación es la que registra los
métodos del servidor para que puedan ser llamados remotamente y también admite
peticiones de los clientes para que los métodos del servidor puedan ser ejecutados.

RMIREGISTRY: Es una aplicación que java nos proporciona para utilizarlo, esta aplicación
se localiza en la carpeta /bin de la maquina virtual de Java.

MySQL: Es un Sistema Gestor de Bases de Datos (SGBD) para la manipulación de los


datos. Para que este pueda ser conectado con RMI Java, en primer lugar se requiere un
puente o conector para que haya conexión. En este tutorial proporcionare uno que se
llama: mysql-connector-java-5.1.10-bin.jar

Ficheros de código para el servidor

InterfazRemota:
Define los métodos remotos sin la implementación, para el RMI es obligatorio definir una
InterfazRemota, puesto que solamente así funcionará la aplicación.

import java.rmi.*;
import java.io.Serializable;
/**
* Define los metodos remotos sin la implementacion.
* Writed by: CRISTINO CALIHUA PANZO
*/
public interface InterfaceRemota extends Remote {
public void datos(String nombre, String apellidoP, String apellidoM, int semestre)
throws RemoteException;
public String mensaje() throws RemoteException;
}

ObjetoRemoto:
Es una clase con la implementación de los métodos de InterfaceRemota. A esta clase sólo
la ve el servidor de rmi.

3
Ing. En Sistemas Computacionales

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.*;
import java.sql.*;
/**
* Este es el objeto remoto que implementa los métodos de la InterfaceRemota
* writed by: CRISTINO CALIHUA PANZO
*/
public class ObjetoRemoto extends UnicastRemoteObject implements InterfaceRemota {
public String message = "";
pantalla pant = new pantalla();

//Este es el contructor del ObjetoRemoto con la excepcion.


public ObjetoRemoto () throws RemoteException {
super();
}

//Estos son los metodos que hacen las operaciones que le pide el cliente.
public void datos(String nombre, String apellidoP, String apellidoM, int semestre) {
try{
Class.forName("com.mysql.jdbc.Driver");
Connection conexion = DriverManager.getConnection
("jdbc:mysql://localhost/tecnologico", "root", "");
Statement st = conexion.createStatement();
st.executeUpdate("INSERT INTO alumno()
VALUES('"+nombre+"','"+apellidoP+"','"+apellidoM+"',"+semestre+")");
message = "Se registraron los datos en SGBD MySQL.";

String mensaje = "\nNombre: "+nombre+"\nApellido p: "+apellidoP+


"\nApellido m: "+apellidoM+"\nSemestre:
"+semestre+"\n\n";
pant.agregando(message+mensaje); //la informacion lo
mando a la pantalla con este metodo.
st.close();
} catch (Exception e){
message = "Intento de conexion fallida con SGBD MySQL\nNo se registro
nada.\n";
pant.agregando(message);
}
}

public String mensaje(){


return message;
}

ObjetoRemoto_Stub:
Es una clase que implementa InterfaceRemota, pero cada método se encarga de hacer
una llamada a través de red al ObjetoRemoto del servidor, esperar el resultado y
devolverlo. Esta clase es la que ve el cliente y no necesitamos codificarla, java lo hace
automáticamente para nosotros a partir de ObjetoRemoto.

4
Ing. En Sistemas Computacionales

Servidor:
Es una clase con el método Main y crea una instancia de la InterfazRemota y
ObjetoRemoto, además indica al RMIREGISTRY donde se ubican los ficheros binarios.
Este es la clase ejecutable.
import java.rmi.*;

/**
* Este es el servidor que ejecuta al objeto remoto.
*/
public class Servidor {

public Servidor() {
try {
// Se le indica a rmiregistry dónde están las clases que he creado (*.class).
// Es importante mantener la barra al final (/).
System.setProperty("java.rmi.server.codebase",
"file:/C:/Users/Mariana/Documents/java-rmi-mysql/servidor/");
System.out.println("The server is running...");
// Se crea una instancia de la interface remota y el objeto remoto
InterfaceRemota objetoRemoto = new ObjetoRemoto();
//Naming.rebind ("//localhost/ObjetoRemoto", objetoRemoto);
Naming.rebind("//" +java.net.InetAddress.getLocalHost().getHostAddress()
+"/ObjetoRemoto", objetoRemoto);

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

public static void main(String[] args) {


new Servidor();
}
}

Pantalla:
Es un complemento más pero no es necesario para que la aplicación funcione. La
aplicación puede trabajar bajo consola, pero actualmente llama la atención la interfaz
gráfica.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class pantalla extends JFrame implements ActionListener{

JPanel panel = new JPanel();


TextArea textoArea = new TextArea("", 12, 60, TextArea.SCROLLBARS_VERTICAL_ONLY);
JButton boton = new JButton("Detener servidor");

public pantalla(){
setTitle("Servidor de SGBD MySQL");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 300);
setLocation(300,250);

panel.add(textoArea);

5
Ing. En Sistemas Computacionales

textoArea.setEditable(false);
textoArea.setText("");
panel.add(boton);

boton.addActionListener(this);
setContentPane(panel);
setVisible(true);
}

public void agregando(String texto){


textoArea.append(texto);
}

public void actionPerformed(ActionEvent evento){


Object fuente = evento.getSource();
if (fuente == boton){
System.exit(0);
}
}

Ficheros de códigos para el cliente

InterfazRemota:
Define métodos para el cliente, pero no los implementa.
import java.rmi.*;
import java.io.Serializable;

/**
* Llama los metodos remotos del servidor.
* Writed by: CRISTINO CALIHUA PANZO
*/
public interface InterfaceRemota extends Remote {
public void datos(String nombre, String apellidoP, String apellidoM, int semestre)
throws RemoteException;
public String mensaje() throws RemoteException;
}

Cliente:
Llama los objetos remotos que están en otra computadora de la red.
import java.rmi.*;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

/**
* Este es la implementacion de la interfaceRemota del cliente, para llamar los metodos al
servidor.
* Writed by: CRISTINO CALIHUA PANZO
*/
public class Cliente extends JFrame implements ActionListener, FocusListener{

6
Ing. En Sistemas Computacionales

JMenuBar barra = new JMenuBar();

JLabel labelNombre = new JLabel("Nombre: ");


JLabel labelApP = new JLabel("Apellido Paterno: ");
JLabel labelApM = new JLabel("Apellido Materno: ");
JLabel labelSem = new JLabel("Semestre: ");
JTextField nombre = new JTextField("", 20);
JTextField apellidoP = new JTextField("", 20);
JTextField apellidoM = new JTextField("", 20);
JTextField semestre = new JTextField("0", 20);
JButton boton = new JButton("Aceptar");
JLabel mensajes = new JLabel("",10);

public Cliente() {
setTitle("Envio de datos por RMI");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(250, 300);
setLocation(300,250);
setResizable(false);

setJMenuBar(barra);
barra.add(mensajes);
mensajes.setForeground(Color.red);
barra.setBackground(Color.white);

JPanel panel = new JPanel();


panel.add(labelNombre);
panel.add(nombre);
panel.add(labelApP);
panel.add(apellidoP);
panel.add(labelApM);
panel.add(apellidoM);
panel.add(labelSem);
panel.add(semestre);
panel.add(boton);

boton.addActionListener(this);
semestre.addFocusListener(this);
this.setContentPane(panel);
this.setVisible(true);
}

public void actionPerformed(ActionEvent evento){


Object fuente = evento.getSource();
if (fuente == boton){
try {
String nom = nombre.getText();
String apP = apellidoP.getText();
String apM = apellidoM.getText();
int sem = Integer.parseInt(semestre.getText());
if (nom.length() != 0){
if (apP.length() != 0){
if (apM.length() != 0){
if ((sem >= 1) && (sem <=9)){
/*Se hace una instancia de la interface y llama al objeto
remoto que se localiza en el host servidor. */
InterfaceRemota objetoRemoto = (InterfaceRemota)Naming.lookup (
"//localhost/ObjetoRemoto");
objetoRemoto.datos(nom, apP, apM, sem);
String recibido = objetoRemoto.mensaje();
mensajes.setText("");
nombre.setText("");
apellidoP.setText("");
apellidoM.setText("");
semestre.setText("0");

7
Ing. En Sistemas Computacionales

JOptionPane.showMessageDialog(null, "Cliente: Los datos se


enviaron...\n\nServidor: "+recibido+"\n\n");

}else{ mensajes.setText("El semestre debe ser de 1-9"); }


}else{ mensajes.setText("Escribe Apellido Materno"); }
}else{ mensajes.setText("Escribe Apellido Paterno"); }
}else{ mensajes.setText("Escribe un Nombre"); }

}catch (NumberFormatException f){


mensajes.setText("El semestre debe ser Numerico");
}catch (Exception e) {
JOptionPane.showMessageDialog(null, "La conexion con el servidor ha
fallado.");
}
}
}

public void focusGained(FocusEvent evento){


Object fuente = evento.getSource();
if (fuente == semestre){
semestre.setText("");
}
}
public void focusLost(FocusEvent evento) { }

public static void main(String[] args) {


new Cliente();
System.out.println( "The client is running...");
}

Compilando los ficheros desde consola

Una forma fácil de compilar los ficheros java, es creando un archivo por lotes (comandos
de ms-dos). La extensión de este fichero puede ser .bat ó .cmd, ya que en este fichero se
agregan todos los comandos que se desea ejecutar al momento de dar doble click sobre
éste.

Primer paso: Colocar un archivo por lotes en la carpeta personal, para así al momento de
abrir la consola, simplemente se escribirá el nombre del fichero por lotes y nos llevará a la
dirección donde estén los ficheros de java y de paso ejecuta el RMIREGISTRY.
El siguiente código es un ejemplo y hay que cambiarle y ponerle la dirección exacta donde
están guardadas los ficheros.

@echo off mysql.bat


cd C:\Users\Cristino\Documents\java-rmi-mysql\servidor
start RMI_SERVIDOR.bat

cd C:\Users\Cristino
set PATH=%PATH%;C:\Program Files\Java\jdk1.6.0_03\bin
title RMIREGISTRY Corriendo...
color a
cls
echo.
echo.
echo. ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo. º±±±±±±±± WRITED BY: CRISTINO CALIHUA ±±±±±º º±±±±± INSTITUTO ±±±±±º
echo. ºÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͺ º±±±± TECNOLOGICO ±±±±º
echo. º²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²º º±±±± SUPERIOR DE ±±±±º
echo. º²²²²²²²²²²²²² RMI CON MySQL ²²²²²²²²²²²²²²º º±±±±± ZONGOLICA ±±±±±º
echo. º²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²º º±±±±±±±±±±±±±±±±±±±±±º
echo. ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ 8
echo.
echo.
echo running...
rmiregistry
Ing. En Sistemas Computacionales

Segundo paso: Colocar otro archivo por lotes junto con los ficheros java, es decir la
aplicación RMI.
El siguiente fichero se ejecuta a partir del primer fichero por lotes. Primero agrega las
variables de entorno y segundo agrega el conector de MySQL.
Para este ejemplo este fichero se llamará RMI_SERVIDOR.bat

RMI_SERVIDOR.bat

@echo off
set PATH=%PATH%;C:\Program Files\Java\jdk1.6.0_03\bin
set CLASSPATH=%CLASSPATH%;C:\Users\Cristino\Documents\java-rmi-mysql\mysql-connector-
java-5.1.10-bin.jar
title RMI SERVIDOR
cls

En la consola se escribe mysql.bat +ENTER, puesto que asi se llama el archivo por lotes.
Se mostraran las siguientes pantallas.

9
Ing. En Sistemas Computacionales

Una vez corriendo las dos consolas. La primera está ejecutando el RMIREGISTRY y en la
segunda se compilan los ficheros de java. Así:
javac nombre_del_fichero.java

Si no sale ningún error quiere decir que todo va bien.

10
Ing. En Sistemas Computacionales

Al compilar el fichero ObjetoRemoto.java se procederá a crear el fichero STUB. Así:


rmic ObjetoRemoto

El fichero _Stub.class se copiará en la carpeta donde se ubican los ficheros del cliente. De
esta forma funcionará, en caso contrario no habrá comunicación.

Para el cliente se hará de la misma forma, pero en los archivos por lotes no será necesario
agregar el conector de MySQL, puesto que la base de datos se localiza en el Servidor.

11
Ing. En Sistemas Computacionales

mysql.bat
@echo off
cd C:\Users\Cristino\Documents\java-rmi-mysql\cliente
start RMI_CLIENTE.bat

cd C:\Users\Cristino
set PATH=%PATH%;C:\Program Files\Java\jdk1.6.0_03\bin
title RMIREGISTRY Corriendo...
color a
cls
echo.
echo.
echo. ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo. º±±±±±±±± WRITED BY: CRISTINO CALIHUA ±±±±±º º±±±±± INSTITUTO ±±±±±º
echo. ºÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͺ º±±±± TECNOLOGICO ±±±±º
echo. º²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²º º±±±± SUPERIOR DE ±±±±º
echo. º²²²²²²²²²²²²² RMI CON MySQL ²²²²²²²²²²²²²²º º±±±±± ZONGOLICA ±±±±±º
echo. º²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²º º±±±±±±±±±±±±±±±±±±±±±º
echo. ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo.
echo.
echo running...
rmiregistry

RMI_CLIENTE.bat
@echo off
set PATH=%PATH%;C:\Program Files\Java\jdk1.6.0_03\bin
title RMI CLIENTE
cls

12
Ing. En Sistemas Computacionales

Creando la base de datos

Bueno la base de datos se llamará tecnológico (solo en esta práctica) y para la tabla del
ejemplo aquí está el código.

CREATE TABLE IF NOT EXISTS alumno(


nombre VARCHAR(20) NOT NULL,
apellidoP VARCHAR(20) NOT NULL,
apellidoM VARCHAR(20) NOT NULL,
semestre INT NOT NULL
)
ENGINE = MyISAM;

Para crear la base de datos y crear una tabla en dicha base de datos, en seguida se
detalla el procedimiento.
Abrir el Internet Explorer, en la barra de direcciones escribir la dirección donde se localiza
el motor de base de datos, para este ejemplo se utilizará el localhost ó 127.0.0.1, quiere
decir que el motor de la base de datos lo tenemos en esta máquina donde estamos
programando.
Despues de haber entrado con localhost, aparecerá una pantalla como la siguiente y le
damos phpMyAdmin para acceder a crear la base de datos.

13
Ing. En Sistemas Computacionales

Procederemos a crear la base de datos. Donde dice “Crear nueva base de datos”
escribiremos “ tecnologico ” y le damos crear. Hasta aquí ya hemos creado la base de
datos. Ahora falta crear la tabla, simplemente seleccionaremos la base de datos hay
opciones en la parte izquierda, en seguida copiaremos el código que ya tenemos para
crear la tabla, para eso darle en la pestaña SQL y pegaremos el código, posteriormente le
damos Continuar. Y listo!!!

Configuración para la conexión entre el Servidor y el Cliente

En este caso la conexión será Inalámbrico, para eso se creará una conexión inalámbrica
de punto – punto. Utilizando una dirección IP, con esto ya es más que suficiente para que
haya comunicación entre dos computadoras o más.

En esta práctica utilicé la 192.168.1.10 para el servidor y para el cliente tiene que ser
diferente a éste.

14
Ing. En Sistemas Computacionales

Realizando la configuración

Esta configuración se puede hacer en la computadora del servidor para así las demás
computadoras se conecten a ella.

Ir al menú Inicio -> panel de control -> centro de redes y recursos compartidos ->
configurar una conexión o red.

Al dar click en configurar una conexión o red se abrirá la siguiente pantalla

Seleccionar la opción Configurar una red ad hoc inalámbrico (de equipo a equipo) y darle
siguiente – siguiente, después aparecerá otra pantalla y proporcionar los datos necesarios.
En nombre de red: ponemos el nombre que queremos, en mi caso puse “maxwell”. Tipo de
seguridad lo dejamos en “WAP2-Personal”. En clave de seguridad o frase de contraseña
“la clave secreta”. Y activar la casilla “Guardar red”.

15
Ing. En Sistemas Computacionales

Le damos siguiente y la configuración se ha terminado. Por default la cuenta de red queda


activada y está listo para que se conecten las demás computadoras en él.

Ahora solo falta agregarle una IP a la configuración.


Ir al menú Inicio -> panel de control\Centro de redes y recursos compartidos\Conexione de
red\
Seleccionamos: conexion de red inalámbrica y le damos click derecho e ir en propiedades.
En la pantallita que saldrá le damos doble click en protocolo de internet versión
4(TCP/IPv4) y procederemos a activar la casilla que dice “usar la siguiente dirección IP”
debe ser así:

16
Ing. En Sistemas Computacionales

Quedara nada mas así y le damos “aceptar”. Y listo !!!


Para las demás computadoras se le asignará una IP de igual forma, solo hay que cambiar
el 10 por otro numero diferente.

Ejecutando el servidor

Supongamos que todo va bien, para entonces se procederá con la ejecución del servidor y
después el cliente. Desde la consola se hace con el siguiente comando.

java nombre_del_fichero //sin la extensión

17
Ing. En Sistemas Computacionales

Se ejecutará solamente el fichero servidor, porque es el único que tiene el método main,
esto quiere decir, que es el único ejecutable de todos los ficheros.

Una vez ejecutado saldrá una pantalla muy simple pero funcional. Como la siguiente:

La consola nos indica que el servidor está corriendo, por lo tanto el programa esta
esperando eventos, es decir, esperando a que un cliente se conecte a este servidor. Los
eventos se mostraran en la pantallita de enfrente.

Ejecutando el Cliente

Se hace de la misma forma como se hizo con el servidor.

18
Ing. En Sistemas Computacionales

Ya se puede escribir los datos y enviarle al servidor. Se supone que debe de conectar si
todo está bien.

Si esto va bien, ahora veamos que apareció en la ventana del servidor.

Si, ya llegaron los datos en la base de datos. Pero falta comprobar si en realidad están los
datos en la base de datos. Veamos:

19
Ing. En Sistemas Computacionales

Si, ahí están los datos.


Misión cumplida…

20