Aspectos Avanzados Rmi C
Aspectos Avanzados Rmi C
Aspectos Avanzados Rmi C
ndice
Java RMI
JDBC
Extensiones Multimedia
Java RMI
Java RMI
RMI = Remote Method Invocation
Es la implementacin de Java de RPC (Remote Procedure Call)
Permite invocar a mtodos de objetos remotos a travs del
protocolo TCP/IP
Arquitectura Cliente/Servidor
Ambos conocen y comparten una interfaz
Comunicacin a travs de la red transparente
Arquitectura RMI
Service Directory
Servidor
Cliente
Servidor de Nombres RMI
Interfaz
Conjunto de mtodos que sern implementados por el objeto
excepcin java.rmi.RemoteException
Implementacin
Es una clase Java normal
Extiende la clase java.rmi.server.UnicastRemoteObject
Implementa el Interfaz definido anteriormente
Debe proporcionar una implementacin para todos los mtodos
de la clase UnicastRemoteObject
Hay que usar super()
Stub y Skeleton
Son clases intermedias que abstraen de la comunicacin por red
Cliente
Stub
[Red]
Skeleton
Servidor
Ahora no es necesario...
Skeleton se crea automticamente a partir de Java 1.2
Stub se crea automticamente a partir de Java 5
Servidor
Crea el objeto que ser accedido remotamente
Instancia el objeto que implementa la interfaz
la clase Implementacin
Cliente
Obtiene una referencia al objeto remoto con el que desea
conectar
Realiza una peticin a un Servidor de Nombres RMI
Mtodo Naming.lookup() pasando como argumento el nombre con el
que se registr el objeto remoto (en el mismo formato cualificado)
defecto, el 1099)
El cliente puede acceder a l de dos formas
A travs de Naming
Mediante una instancia del registro:
LocateRegistry.getRegistry()
RemoteException
Siempre que se invoque a un mtodo remoto o un mtodo del
servicio de nombres hay que capturar sus excepciones
Errores en la comunicacin entre los procesos (fallos de acceso o de
conexin)
Fallo en la invocacin del objeto remoto (objeto no disponible)
Fallo en el registro de un objeto
Etc.
super();
}
public void sendMessage(String msg) throws RemoteException {
System.out.println(msg);
}
public String getMessage() throws RemoteException {
try {
Naming.bind("HelloServ", obj);
catch (RemoteException e) {
catch (AlreadyBoundException e) {
catch (MalformedURLException e) {
}
}
System.out.println("RemoteException
" + e);
System.out.println("AlreadyBoundException");
System.out.println("MalformedURLException");
try {
HelloInterface obj = (HelloInterface)
Naming.lookup("HelloServ");
obj.sendMessage("Hello from the client");
//...
System.out.println(obj.getMessage());
//...
catch (RemoteException e) {
catch (NotBoundException e) {
catch (MalformedURLException e) {
}
}
System.out.println("RemoteException
" + e);
System.out.println("AlreadyBoundException");
System.out.println("MalformedURLException");
javac hello/*.java
Generacin del Stub (Opcional en Java 5+)
rmic hello.HelloImpl
Ejecucin del Servicio de Nombres RMI
rmiregistry <puerto>
Puerto por defecto: 1099
Ejecucin del servidor
java hello.HelloServer
Ejecucin del cliente
java hello.HelloClient
Ejercicio
Crear una aplicacin que implemente una calculadora
La ventana tendr dos cajas de texto para los operandos y otra para
mostrar el resultado
La operacin a realizar se seleccionar de la manera que nos
parezca ms oportuna (ComboBox, Buttons, RadioButtons, etc.)
Slo se podr seleccionar una operacin si los operandos son
vlidos
La operacin debe realizarse en un servidor local
La interfaz tendr un mtodo por cada operacin vlida
El cliente invocar a dichos mtodos a travs de una instancia
El servidor realizar la operacin correspondiente y devolver el
resultado
Ejercicio
bytes
Almacenamiento (persistencia)
Transmisin (invocacin de procedimientos remotos)
normalmente?
Objeto remoto exportado: se transmite el stub del objeto
por defecto
Si los redefinimos en una jerarqua de clases, en cada clase slo hay que
serializar lo correspondiente a dicha clase
Ejercicio
Escribir un programa que trabaje con Personas y Estudiantes
La clase Persona almacena nombre, apellidos y edad
La clase Estudiante extiende la clase Persona y almacena un
vector de Asignaturas
Crear un objeto remoto que devuelva objetos de tipo Persona
y Estudiante por medio de sendos mtodos
Imprimir en el cliente las personas y estudiantes devueltos
Recordatorio: Los objetos a enviar deben ser serializables...
Clase LocateRegistry
Permite crear y recuperar objetos que implementan Registry
Clase Naming
Invoca mtodos de un objeto remoto que implementa Registry
Interfaz Registry
stos son sus mtodos ms importantes:
Clase LocateRegistry
Antes vimos que el registro de nombres poda iniciarse desde
Clase Naming
Permite acceder a los mtodos de un objeto remoto que
Ejercicio
Modificar el programa Hola Mundo de ejemplo para que use
la clase LocateRegistry
El servidor tendr ahora que crear su propio servidor de
nombres (createRegistry)
El cliente recuperar el registro (getRegistry) que ejecuta en
la IP y puerto donde lo cre el servidor
El cliente utilizar la interfaz del objeto devuelto para realizar
la bsqueda del objeto remoto
Ejercicio
Modificar el ejercicio anterior para probar los mtodos de la
y otro?
list: desde el cliente, imprimir la lista de objetos registrados en
el servidor de nombres
unbind: des-registrar el objeto remoto desde el servidor. Qu
pasa si el cliente intenta acceder a dicho objeto ms tarde?
Mtodo exportObject()
Mtodo de la clase UnicastRemoteObject
Permite exportar un objeto
configuracin
java -Djava.security.policy=D:/directorio/java.policy
program
El fichero java.policy
Fichero de sintaxis muy completa (y compleja)
Permite configurar permisos con un hilo muy fino
grant {
permission java.net.SocketPermission "*:1024-65535",
"connect,accept";
permission java.io.FilePermission "c:\\home\\ann\\public_html\
\classes\\-", "read";
permission java.io.FilePermission "c:\\home\\jones\\public_html\
\classes\\-", "read";
};
Ejercicio
Escribir un programa cliente/servidor
Hacer que el cliente use un RMISecurityManager
Asociarle un fichero de poltica vaco. Observar lo que pasa.
Garantizar permisos para conectar a los puertos 1024-65535
Ahora, aadir al cliente la funcionalidad de escribir un
dinmicamente
Otras veces interesa poder definir una interfaz y hacer que
Ejercicio
Modificar el programa Hola Mundo que hicimos
Ejercicio
Crear un programa donde:
Cliente y servidor estarn en directorios distintos
Los ficheros ObjetoRemotoInterfaz y OperacionInterfaz deben estar
Ejercicio (continuacin...)
El servidor debe estar configurado para poder descargar clases
La estructura sera:
Servidor: Servidor.java, ObjetoRemotoInterfaz.java,
OperacionInterfaz.java, ObjetoRemotoImpl.java
Cliente: Cliente.java, ObjetoRemotoInterfaz.java,
OperacionInterfaz.java, Operacion1.java, Operacion2.java, etc.
Callbacks de clientes
Qu pasa si queremos que el servidor pueda comunicarse
Posibles soluciones:
Polling: El usuario invoca otro mtodo del servidor hasta que
Callbacks
El cliente define una interfaz como sta
public interface CallbackInterface extends Remote {
public String notifyme(String msg) throws RemoteException;
}
CallbackImpl
En la clase cliente hay que aadir cdigo para instanciar un
callback y registrarlo en el servidor (a travs de un mtodo que
habremos de implementar)
Server srv = Naming.lookup("Server");
CallbackImpl callback = new CallbackImpl();
server.registerCallback(callback);
Callbacks
En el objeto remoto del servidor, habra que aadir un
Ejercicio: JMessenger
JDBC
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
otra:
Se usa el smbolo % para sustituir a cualquier cosa (comodn)
Ma%: Comienza por Ma
%no: Termina en no
Ma%no: Empieza por Ma y termina por no
%ria%: contiene la cadena ria en cualquier sitio
Ejemplo:
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
tabla
columnas: Nombres de las columnas de las que damos valores
(opcional si se dan todos)
Ejemplo:
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
8797
Q&T Asociados
91 7884520
4590.40
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
8797
Q&T Asociados
91 7884520
4590.40
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
8797
Q&T Asociados
Marketing
91 7884520
4590.40
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
8797
Q&T Asociados
Marketing
91 7884520
4590.40
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
Nombre
Tipo
Telfono
Saldo
8788
Suministros Ruiz
Electricidad
91 3987872
1288.00
8789
Transportes TSS
Transporte
91 5993725
433.00
8790
Segurinsa S.A.
Seguridad
923 847002
-120.50
8791
Desarrollos Tyna
Diseo
91 4513172
3901.00
8792
Elektronics
Electricidad
91 3342244
-233.50
8793
Obras Marcos
Albailera
91 7111132
2921.00
8794
Muebles Prados
Mobiliario
91 3120072
90.55
8795
Internal
Mobiliario
93 4287910
340.00
8796
Trabajos Cruz
Fontanera
672 112991
790.55
a la electricidad
Obtener el nombre de las empresas madrileas
Modificar el saldo de las empresas con identificador en el
intervalo [8790, 8793] e incrementarlo en 1000 euros
Borrar de la BBDD las empresas con saldo negativo
(SGBD) primero
En el cdigo del programa, hay que importar las clases que nos
Class.forName(com.mysql.jdbc.Driver);
Connection conn = DriverManager.getConnection
(jdbc:mysql://localhost/empresas, user, pass);
ResultSet
ResultSet res = stat.executeQuery
(SELECT * FROM Empresas);
usar executeUpdate()
los metadatos
mtodos
Ejemplo:
while (res.next()) {
for (i = 1; i <= nCols; i++)
System.out.print( + res.getObject(i));
System.out.println();
}
IMPORTANTE: Siempre usar next() antes del primer acceso a resultados
Ejercicio
Crear una aplicacin que trabaje gestione una pequea
agenda de contactos
Hay que crear una tabla en la BBDD que almacene la
informacin de los contactos: DNI (clave), Nombre,
Apellidos, Direccin, e-mail, etc.
La la aplicacin nos debe permitir: Introducir nuevos datos,
visualizar los datos de un contacto (de una lista o mediante
bsqueda), modificar dichos datos y borrar un contacto
Recomendacin: Usar distintas ventanas para cada funcionalidad
Ejercicio 2
Crear una aplicacin que nos permita gestionar una biblioteca
Habr distintas tablas:
Libro: con informacin sobre libros: ISBN (clave), Ttulo,
Ejercicio 2 (Continuacin)
La aplicacin debe permitir introducir libros, junto con su
ejecucin
stat.setString(1, Marketing);
stat.setInt(2, 8795);
stat.executeUpdate();
Lo mismo en el caso de executeQuery()
Los valores de los campos variables permanecen hasta que
Ejercicio
Repetir el ejercicio de consultas a la BBDD usando
Usando transacciones
Permiten ejecutar bloques de sentencias conjuntamente
O todas o ninguna
Permiten volver al estado anterior al comienzo del bloque si
Usando transacciones
Despus de ejecutar cada sentencia (executeQuery()/
este comportamiento
conn.setAutoCommit(false);
Cuando acabemos, restauramos el comportamiento por defecto
conn.setAutoCommit(true);
Tras toda la secuencia de operaciones, hay que hacer el
commit manualmente
conn.commit();
Usando transacciones
Ejemplo:
conn.setAutoCommit(false);
int rows = stat.executeUpdate(INSERT INTO Empresas
VALUES (8797, Q&T Asociados, , 917884520, 4590.40));
int rows2 = stat.executeUpdate(UPDATE Empresas SET
Saldo=0.0 WHERE Saldo < 0.0)
con.commit();
conn.setAutoCommit(true);
Ejercicio
Rehacer el ejercicio de la biblioteca para que las inserciones/
Extensiones Multimedia
Pintando imgenes
Usamos los mtodos paint de la superficie donde vayamos a
Ejercicio
Crear una ventana que muestre imgenes de distintos tipos
simultneamente
Usar tanto objetos de tipo Image como ImageIcon
Probar los distintos mtodos para cargar imgenes
Probar los distintos mtodos de dibujado (con y sin escalado)
Reproduciendo sonidos
Una opcin es utilizar los mtodos que nos proporcionan la
Reproduciendo sonidos
Para recuperar una instancia de tipo AudioClip usaremos los
Ejercicio
Crear un reproductor de sonidos
Debe permitir seleccionar el fichero desde un dilogo
Debe tener tres botones (aparte del de seleccin del fichero)
Reproducir
Parar
Reproducir en bucle
Se puede descargar de
java.sun.com/products/java-media/jmf/2.1.1/download.html
Vamos a ver su funcionamiento con un pequeo ejemplo...
import javax.media.*;
La clase Manager es el punto de partida para recuperar los
controles multimedia
Podemos recuperar una instancia de un reproductor de medios
Player mp = Manager.createRealizedPlayer(mediaURL);
reproductor
un panel
mtodo start
mp.start();
La clase MediaPlayer proporciona todos los mtodos