estructura de computadores
TRANSCRIPT
Java RMI:
Callback de cliente
Grupo ARCOS
Desarrollo de Aplicaciones Distribuidas
Ingeniería Informática
Universidad Carlos III de Madrid
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M2
1. Introducción:
1. Callback de cliente
2. Callback de cliente en Java RMI
1. Arquitectura del sistema
2. Elementos a desarrollar
3. Ajustes en desarrollo y despliegue
1. Descarga del resguardo
2. Políticas de seguridad
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M3
1. Introducción:
1. Callback de cliente
2. Callback de cliente en Java RMI
1. Arquitectura del sistema
2. Elementos a desarrollar
3. Ajustes en desarrollo y despliegue
1. Descarga del resguardo
2. Políticas de seguridad
Félix García Carballeira, Alejandro Calderón Mateos
Callback de cliente
ARCOS @ UC3M4
En el modelo cliente-servidor el servidor es pasivo
El cliente pide un servicio y el servidor devuelve unos resultados como respuesta en un plazo de tiempo
C1
C2
C3
C4
C5
Servidor Clientes
Llamadas RMI
Félix García Carballeira, Alejandro Calderón Mateos
Callback de cliente
ARCOS @ UC3M5
¿Qué pasa cuando el
cliente quiere una o
varias respuestas de
forma asíncrona?
Ejemplo: apuntarse
para ser informados
de los cambios en la
bolsa
C1
C2
C3
C4
C5
Servidor Clientes
Llamadas RMI
Félix García Carballeira, Alejandro Calderón Mateos
Callback de cliente
ARCOS @ UC3M6
Alternativas:
Polling
Preguntar cada cierto
tiempo
Peticiones sin cambios
causan sobrecarga
Callback
Registrarse en el servidor
para que nos avise ante los
eventos
Lista de callback
C1
C2
C3
C4
C5
callback
Servidor Clientes
Llamadas RMI
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M7
1. Introducción:
1. Callback de cliente
2. Callback de cliente en Java RMI
1. Arquitectura del sistema
2. Elementos a desarrollar
3. Ajustes en desarrollo y despliegue
1. Descarga del resguardo
2. Políticas de seguridad
Félix García Carballeira, Alejandro Calderón Mateos
Arquitectura de RMI (no callback)
ARCOS @ UC3M8
stub
Referencia remota
Transporte
skeleton
Referencia remota
Transporte
Ruta de datos lógica
Ruta de datos física
Cliente de
objetos
Servidor
de objetos
Servicio de directorios
Félix García Carballeira, Alejandro Calderón Mateos
Arquitectura de RMI (callback)
ARCOS @ UC3M9
stub
Referencia remota
Transporte
skeleton
Referencia remota
Transporte
Cliente invoca método remoto del servidor
Cliente de
objetos
Servidor
de objetos
Servicio de directorios
Skeleton stub
Servidor invoca método callback del cliente
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M10
1. Introducción:
1. Callback de cliente
2. Callback de cliente en Java RMI
1. Arquitectura del sistema
2. Elementos a desarrollar
3. Ajustes en desarrollo y despliegue
1. Descarga del resguardo
2. Políticas de seguridad
Félix García Carballeira, Alejandro Calderón Mateos
Invocación remota (no callback)
ARCOS @ UC3M11
Servidor de objetos
Interface.class
Impl.class
Server.class
Skel.class
Client.class
Cliente de objetos
Interface.class
Stub.class
Félix García Carballeira, Alejandro Calderón Mateos
Invocación remota (callback)
ARCOS @ UC3M12
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl _Stub.class
ServerImpl _skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
Invocación remota (callback)
ARCOS @ UC3M13
Los clientes se registran
como servidor de objeto
remoto para callbacks.
Dos conjuntos de proxies.
Piezas clave:
Interface remota de cliente.
Servicio de registro de interfaces
de cliente en servidor
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
ClientInterface.java
ARCOS @ UC3M14
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
import java.rmi.*;
public interface ClientInterface extends java.rmi.Remote
{
public String notifyMe ( String message )
throws java.rmi.RemoteException ;
}
o Interfaz remota del cliente
o Debe contener, al menos,
un método a ser invocado por el servidor
Félix García Carballeira, Alejandro Calderón Mateos
import java.rmi.*;
import java.rmi.server.*;
public class ClientImpl
extends UnicastRemoteObject
implements ClientInterface
{
public ClientImpl() throws RemoteException
{ super( ); }
public String notifyMe ( String message ) {
String returnMessage = "Call back received: " + message;
System.out.println(returnMessage);
return returnMessage;
}
}
ClientImpl.java
ARCOS @ UC3M15
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
o Implementación de la Interfaz remota del cliente
o Generación the proxies con rmic ClientImpl
Félix García Carballeira, Alejandro Calderón Mateos
import java.io.*;
import java.rmi.*;
public class Client
{
public static void main(String args[])
{
try
{
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
System.out.println("Enter the RMIRegistry host namer:");
String hostName = br.readLine();
System.out.println("Enter the RMIregistry port number:");
String portNum = br.readLine();
System.out.println("Enter how many seconds to stay registered:");
String timeDuration = br.readLine();
int time = Integer.parseInt(timeDuration);
Client.java (1/3)
ARCOS @ UC3M16
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
String regURL = "rmi://" + hostName + “:" + portNum + "/callback";
ServerInterface h = (ServerInterface)Naming.lookup(regURL);
System.out.println("Lookup completed “);
System.out.println("Server said " + h.sayHello());
ClientInterface callbackObj = new ClientImpl();
h.registerForCallback(callbackObj);
System.out.println("Registered for callback.");
Client.java (2/3)
ARCOS @ UC3M17
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
try {
Thread.sleep(time * 1000);
h.unregisterForCallback(callbackObj);
System.out.println("Unregistered for callback.");
} catch (InterruptedException ex){ /* sleep over */ }
} // try
catch (Exception e)
{
System.out.println("Exception in CallbackClient: " + e);
}
} // main
} // class
Client.java (3/3)
ARCOS @ UC3M18
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
import java.rmi.*;
public interface ServerInterface extends Remote
{
public String sayHello( )
throws java.rmi.RemoteException;
public void registerForCallback(
ClientInterface callbackClientObject
) throws java.rmi.RemoteException;
public void unregisterForCallback(
ClientInterface callbackClientObject
) throws java.rmi.RemoteException;
}
ServerInterface.java
ARCOS @ UC3M19
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
o Extensión en la parte servidora
o Método remoto de registro del cliente para callback
Félix García Carballeira, Alejandro Calderón Mateos
import java.rmi.*;
import java.rmi.server.*;
import java.util.Vector;
public class ServerImpl
extends UnicastRemoteObject
implements ServerInterface {
private Vector clientList;
public ServerImpl() throws RemoteException {
super( );
clientList = new Vector();
}
public String sayHello( ) throws RemoteException {
return("hello");
}
ServerImpl.java (1/4)
ARCOS @ UC3M20
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
public synchronized void unregisterForCallback (
ClientInterface callbackClientObject
) throws RemoteException
{
if (clientList.removeElement(callbackClientObject)) {
System.out.println("Unregistered client. ");
} else {
System.out.println("unregister: client wasn't registered.");
}
}
ServerImpl.java (2/4)
ARCOS @ UC3M21
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
public synchronized void registerForCallback(
ClientInterface callbackClientObject
) throws RemoteException
{
if (!(clientList.contains(callbackClientObject)))
{
clientList.addElement(callbackClientObject);
doCallbacks();
}
}
ServerImpl.java (3/4)
ARCOS @ UC3M22
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
private synchronized void doCallbacks( ) throws RemoteException
{
for (int i = 0; i < clientList.size(); i++)
{
System.out.println("doing "+ i +"-th callback\n");
ClientInterface nextClient =
(ClientInterface) clientList.elementAt(i);
nextClient.notifyMe("Number of registered clients="
+ clientList.size());
} // for
} // function
} // class
ServerImpl.java (4/4)
ARCOS @ UC3M23
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.net.*;
import java.io.*;
public class Server
{
public static void main(String args[])
{
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
Server.java (1/3)
ARCOS @ UC3M24
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
String portNum, registryURL;
try
{
System.out.println("Enter the RMIregistry port number:");
portNum = (br.readLine()).trim();
int RMIPortNum = Integer.parseInt(portNum);
startRegistry(RMIPortNum);
ServerImpl exportedObj = new ServerImpl();
registryURL = "rmi://localhost:" + portNum + "/callback";
Naming.rebind(registryURL, exportedObj);
System.out.println("Callback Server ready.");
} catch (Exception re) {
System.out.println("Exception in HelloServer.main: " + re);
}
} // end main
Server.java (2/3)
ARCOS @ UC3M25
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
private static void startRegistry (int RMIPortNum)
throws RemoteException
{
try {
Registry registry = LocateRegistry.getRegistry(RMIPortNum);
registry.list( );
} catch (RemoteException e) {
// No valid registry at that port.
Registry registry = LocateRegistry.createRegistry(RMIPortNum);
}
} // end startRegistry
} // end class
Server.java (3/3)
ARCOS @ UC3M26
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
Compilación del ejemploguernika.lab.inf.uc3m.es
ARCOS @ UC3M27
# javac -cp /usr/lib/jvm/java-1.4.2-gcj-4.1-1.4.2.0/jre/lib/rt.jar \
-g ClientInterface.java ClientImpl.java
# rmic ClientImpl
# javac -cp /usr/lib/jvm/java-1.4.2-gcj-4.1-1.4.2.0/jre/lib/rt.jar -g *.java
Client.class
ClientInterface.class
ServerInterface.class
ClientImpl.class
ServerImpl_Stub.class
ClientImpl_skel.class
Cliente de objetos
Server.class
ServerInterface.class
ClientInterface.class
ServerImpl.class
ClientImpl_Stub.class
ServerImpl_skel.class
Servidor de objetos
Félix García Carballeira, Alejandro Calderón Mateos
Ejecución del ejemploguernika.lab.inf.uc3m.es
ARCOS @ UC3M28
# rmiregistry 9090 &
# java -Djava.security.policy=policy.all Server
Enter the RMIregistry port number:
9090
Callback Server ready.
^Z
# bg
# java -Djava.security.policy=policy.all Client
Enter the RMIRegistry host namer:
localhost
Enter the RMIregistry port number:
9090
Enter how many seconds to stay registered:
60
Lookup completed
Server said hello
doing 0-th callback
Call back received: Number of registered clients=1
Registered for callback.
…
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M29
1. Introducción:
1. Callback de cliente
2. Callback de cliente en Java RMI
1. Arquitectura del sistema
2. Elementos a desarrollar
3. Ajustes en desarrollo y despliegue
1. Descarga del resguardo
2. Políticas de seguridad
Félix García Carballeira, Alejandro Calderón Mateos
Descarga del resguardo
ARCOS @ UC3M30
Objetivo: eliminar la necesidad de que el cliente
deba tener el stub.
El stub es descargado dinámicamente desde un
servidor web.
Es necesario conocer la URL del servidor.
La clase resguardo no es persistente.
Félix García Carballeira, Alejandro Calderón Mateos
Descarga del resguardo
ARCOS @ UC3M31
Cliente Servidor
RMI registry
SomeServer.class
SomeInterface_stub.class
SomeInterface_skel.class
Client.class
SomeInterface _stub.class
1
2
3
4
Servidor HTTP
Félix García Carballeira, Alejandro Calderón Mateos
Gestor de seguridad (por defecto)
ARCOS @ UC3M32
Security Manager
Supervisión del programa:
Acceso a ficheros
Conexiones de red
Nivel de seguridad inicial:
Únicamente conexiones locales.
No es posible la transferencia del resguardo.
Félix García Carballeira, Alejandro Calderón Mateos
Gestor de seguridad RMI
ARCOS @ UC3M33
Es posible usar una gestor de seguridad que
configurado adecuadamente permita la descarga del
resguardo.
Clase RMISecurityManager
Fichero de política de seguridad
Félix García Carballeira, Alejandro Calderón Mateos
Gestor de seguridad RMI
ARCOS @ UC3M34
Inicio del servicio de seguridad:
Añadir el anterior fragmento de código tanto al programa
principal (main) del cliente como del servidor.
Usar antes de utilizar los servicios del registro RMI.
try {
System.setSecurityManager(
new RMISecurityManager());
} catch {
//…
}
Félix García Carballeira, Alejandro Calderón Mateos
Gestor de seguridad RMI
ARCOS @ UC3M35
Ejemplo de fichero de políticas de seguridad:
grant
{
permission java.net.SocketPermission
"*:1024-65535", "connect,accept,resolve";
permission java.net.SocketPermission
"*:80", "connect";
} ;
Félix García Carballeira, Alejandro Calderón Mateos
Gestor de seguridad RMI
ARCOS @ UC3M36
Ejemplo de despliegue de políticas de seguridad:
Java –Djava.rmi.server.codebase=<http://...URL>-Djava.rmi.server.hostname=<nombre servidor>-Djava.security.policy=<ruta completa al fichero
de política de seguridad>
Félix García Carballeira, Alejandro Calderón Mateos
Resguardos y gestor de seguridad RMI
ARCOS @ UC3M37
1. Crear directorio
2. Definir interfaz remoto.
3. Realizar su implementación.
4. Generar ficheros resguardo y esqueleto.
5. Diseñar programa servidor.
6. Copiar fichero resguardo al servidor HTTP.
7. Activar registro RMI.
8. Construir fichero de políticas de seguridad.
9. Activar servidor.
Félix García Carballeira, Alejandro Calderón Mateos
Resguardos y gestor de seguridad RMI
ARCOS @ UC3M38
java.policy
SomeClient.class
java.policy
SomeServer.class
SomeImplementation_stub
SomeImplementation.Skeleton.class
SomeInterface.class
Cliente Servidor
Servidor HTTP
SomeInterface.class
SomeImplementation.class