estructura de computadores

39
Java RMI: Callback de cliente Grupo ARCOS Desarrollo de Aplicaciones Distribuidas Ingeniería Informática Universidad Carlos III de Madrid

Upload: others

Post on 13-Jan-2022

4 views

Category:

Documents


0 download

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

Java RMI:

Callback de cliente

Grupo ARCOS

Desarrollo de Aplicaciones Distribuidas

Ingeniería Informática

Universidad Carlos III de Madrid