Programación Distribuida -...

50
Programación Distribuida JUAN CARLOS CONDE RAMÍREZ DISTRIBUTED COMPUTING

Transcript of Programación Distribuida -...

Page 1: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Programación DistribuidaJUAN CARLOS CONDE RAMÍREZ

DISTRIBUTED COMPUTING

Page 2: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Introducción

FCC-BUAP 2

•En esta parte del curso, se analizarán primitivas proporcionadas por el lenguaje de programaciónJava para construir aplicaciones distribuidas.

•Normalmente se comienza con dos estilos de programación: sockets e invocaciones aprocedimientos remotos.

◦ Los Sockets proporcionan una interfaz de bajo nivel para construir programas distribuidos pero son máseficientes y flexibles.

◦ Sin embargo, las Invocaciones a Métodos Remotos o RMI (Remote Method Invocation) son más fácilesde utilizar.

Page 3: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Introducción

FCC-BUAP 3

•A continuación se describirá la clase InetAddress, la cual es útil para programación en Redno importa qué estilo de comunicación se está utilizando.

•De este modo la programación de sockets puede utilizar tanto un Protocolo de DatagramasUniversal (UDP) como un Protocolo de Control de Transmisión (TCP).

Page 4: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase InetAddres

FCC-BUAP 4

•Para cualquier tipo de aplicación distribuida, está presente la noción de dirección de Internet.

•Cualquier computadora conectada a Internet (conocida como host) puede ser identificada deforma única por una dirección llamada Dirección-IP.

•Dado que las direcciones son difíciles de recordar, cada host también posee un hostname. Éstaes la tarea de un sistema de nombres de dominio (DNS) que sirve para proporcionar el mapeode un hostname a su Dirección IP.

Page 5: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase InetAddres

FCC-BUAP 5

•Java proporciona la clase java.net.Inetaddress.

•Los métodos más relevantes para la clase InetAddress se presentan a continuación:

PROTOTIPO DESCRIPCIÓN

public byte[] getAddress() Devuelve tal cual la dirección IP del objeto InetAddress que lo invoca.

public static InetAddress getByName(String) Determina la dirección IP de un host, dado su nombre del host.

public String getHostAddress() Devuelve la cadena "%d.%d.%d.%d" de la dirección IP.

public String getHostName() Devuelve el nombre complete del host para esta dirección.

public static InetAddress getlocalHost() Devuelve el host local.

Page 6: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Sockets

FCC-BUAP 6

•Los sockets son útiles para escribir programas basados en comunicación que utiliza mensajes.

•Un socket es un objeto que puede ser utilizado para enviar y recibir mensajes. Inicialmenteexisten dos protocolos: UDP y TCP.

◦ El UDP proporciona un protocolo no orientado a la conexión de bajo nivel.

◦ El protocolo TCP es un protocolo confiable orientado a la conexión

Page 7: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Sockets basados en UDP

FCC-BUAP 7

•No se garantiza el orden de la recepción de los paquetes enviados usando UDP, e incluso éstospodrían perderse en el camino.

•Por lo tanto el protocolo UDP no es confiable; no utiliza algún mecanismo de confirmación paradetectar la perdida de paquetes. Pero entonces ¿Por qué resulta útil UDP?, debido a que inclusocuando UDP pueda sufrir pérdida de paquetes, en la práctica, esto sucede muy rara vez.

•Dado que no hay costos asociados con chequeo de errores, UDP es un protocoloextremadamente eficiente.

Page 8: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Socket de datagramas

FCC-BUAP 8

•La primera clase que se usará es la de DatagramSocket que está basada en el protocolo UDP.

•Esta clase representa un socket para enviar y recibir paquetes de datagramas. Un Socket dedatagramas es el punto de envío o recepción para un servicio de entrega de paquetes sinconexión.

•Cada paquete enviado o recibido sobre un socket de datagramas es dirigido y enrutadoindividualmente.

Page 9: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Socket de datagramas

FCC-BUAP 9

•Múltiples paquetes enviados desde una máquina hacia otra pueden ser enrutados de diferentemanera, y quizá llegar en cualquier otra.

•Esta clase proporciona un nivel de interfaz muy bajo para enviar y recibir mensajes.

•Una ventaja de los sockets de datagramas es que estos permiten una rápida transmisión dedatos.

Page 10: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Socket de datagramas

FCC-BUAP 10

•Para construir un DatagramSocket, se pueden utilizar cualquier a de los siguientesconstructores.

•Estos constructores pueden caer en una SocketException si el socket no puede ser abiertoo si el socket no puede vincularse al puerto local especificado.

PROTOTIPO DESCRIPCIÓN

public Datagramsocket()Construye un socket de datagramas y lo vincula con cualquier puerto disponible en el localhost de la computadora.

public Datagramsocket(int port) Construye un socket de datagramas y lo vincula un puerto en específico.

public Datagramsocket(int port, InetAddress

laddr)

Construye un socket de datagramas vinculado al puerto y a la dirección local especificada.

Page 11: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Socket de datagramas

FCC-BUAP 11

•Los otros métodos importantes de esta clase son los que siguen:

PROTOTIPO DESCRIPCIÓN

public voud close() Cierra un socket de datagramas.

public int getLocalPort() Retorna el número de puerto sobre el local host con el que se vinculó este socket.

public InetAddress getLocalAddress() Retorna la dirección local para el que se vinculó este socket.

public void receive(DatagramPacket p)

Se recibe un paquete de datagramas, desde este socket. Cuando este métodoregresa, el buffer de DatagramPacket está lleno de los datos recibidos. Elpaquete de datagramas contiene también la dirección IP del emisor y el númerode puerto de la máquina del emisor. Nótese que bloquea hasta que un datagramaes recibido. La longitud del campo del objeto del paquete de datagramas contienela longitud del mensaje recibido. Si el mensaje es más grande que el buffer, elmensaje es truncado. Éste puede incurrir en una IOException. El bloqueopuede eludirse configurando el timeout.

public void send(DatagramPacket p)

Se envía un paquete de datagramas, desde este socket. El DatagramPacketincluye información indicando el dato a ser enviado, su longitud, la dirección IPdel host remoto, y el número de puerto en el host remoto.

Page 12: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase DatagramPacket

FCC-BUAP 12

•La clase java.net.DatagramPacket es utilizada para esto y su definición es la siguiente:

public final class java.net.DatagramPacket extends java.lang.Object

{

public Datagrampacket (byte ibuf[], int ilength);

public DatagramPacket(byte ibuf[], int ilength, InetAddress iaddr, int iport);

public InetAddress getAddress();

public byte[] getData();

public int getlength();

public int getport();

public void setAddress(InetAddress)

public void setData(byte[])

public void setLength(int)

public void setPort(int)

}

Page 13: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase DatagramPacket

FCC-BUAP 13

•El primer constructor crea un DatagramPacket para recibir paquetes de longitud ilength.El parámetro ibuf es el buffer para mantener los datagramas entrantes, y ilength es elnumero de bytes a leer.

•El segundo constructor crea un DatagramPacket para enviar paquetes de longitudilength a un número de puerto especificado sobre un host especifico. Los parámetros iaddry iport son utilizados para la dirección de destino y el número de puerto de destino,respectivamente.

•El método getAddress() devuelve la dirección IP de la máquina para la que el datagramaestá siendo enviado, o desde la cual el datagrama está siendo recibido.

Page 14: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase DatagramPacket

FCC-BUAP 14

•El método getData() devuelve los datos recibidos, o los datos a ser enviados.

•El método getLength() devuelve la longitud de los datos a ser enviados, o la longitud de losdatos recibidos.

•De forma similar el método getPort devuelve el número de puerto del host remoto para elcual este datagrama está siendo enviado, o desde donde el datagrama fue recibido.

• NOTA: los métodos set son utilizados para colocar la dirección IP, número de Puerto y otros elementosapropiadamente.

Page 15: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Ejemplo usando Datagramas

FCC-BUAP 15

•Este ejemplo consiste de dos procesos: un Cliente y un Servidor.

1. El cliente lee lo introducido por el usuario desde el teclado (System.in) para poder enviarlo alservidor.

2. El servidor recibe el paquete de datagramas y entonces replica de vuelta los mismos datos.

3. El proceso cliente recibe una respuesta del servidor y la muestra en consola.

¡ACTIVIDAD!

Page 16: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Sockets basados en TCP

FCC-BUAP 16

•Sí garantizan el orden de entrega de los paquetes, sin embargo TCP no es tan eficiente comoUDP.

•Este estilo de comunicación interprocesos está basado en la noción de flujos; una conexión esconfigurada entre el emisor y el receptor.

•Permite una mejor recuperación de errores y garantiza la entrega de todos los paquetes; lospaquetes se reciben en el mismo orden en el que fueron enviados.

Page 17: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase Socket

FCC-BUAP 17

•La clase Socket en Java hereda de la clase Object.

•A continuación se dará sólo un subconjunto de constructores y métodos disponibles para unSocket.

Page 18: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase Socket

FCC-BUAP 18

•El constructor public Socket(String host, int port) crea un socket de flujo y loconecta al número de puerto especificado sobre el host nombrado.

•Este puede incurrir en un UnknownHostException y IOException.

•Hasta aquí se ha utilizado el nombre del host. Alternativamente, la dirección IP puede serutilizada en la forma de la clase InetAddress como sigue:

◦ public Socket(InetAddress address, int port)

Page 19: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase Socket

FCC-BUAP 19

•Los métodos para el socket son:

◦ Nótese que muchos de estos métodos pueden caer en una IOException si ocurre un error I/O alutilizar algún método del socket.

PROTOTIPO DESCRIPCIÓN

public IndetAddress getInetAddress() Devuelve la dirección IP remota a la que este socket está conectado.

public IndetAddress getLocalAddress() Devuelve la dirección local a la que este socket está vinculado.

public int getPort() Devuelve el puerto remoto al que este socket está conectado.

public InputStream getInputStream() Devuelve un flujo de entrada para la lectura de bytes desde este socket.

public OutputAddress getOutputStream() Devuelve un flujo de salida para la escritura de bytes hacia este socket.

public synchronized void close() Cierra este socket.

Page 20: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Sockets de Servidor

FCC-BUAP 20

•Del lado del servidor la clase utilizada es ServerSocket. Una forma para crear un serversocket es public ServerSocket(int port).

•Esta llamada crea un socket de servidor sobre un puerto específico. Varios de los métodos sobreel socket de servidor son los siguientes:

PROTOTIPO DESCRIPCIÓN

public InetAddress getInetAddress()Devuelve la dirección a la que está conectada este socket o null si el sockettodavía no está conectado.

public int getLocalPort() Devuelve el puerto sobre el que está escuchando este socket.

public Socket accept()Se mantiene escuchando por si se realiza una conexión a este socket y la acepta.Este método bloquea hasta que se realiza la conexión.

public void close() Cierra este socket.

Page 21: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Ejemplo 1: Servidor de nombres

FCC-BUAP 21

•El servidor de nombres mantiene una tabla con: name, hostName, portNumber, paramapear un proceso de nombre name con el host y con el numero de puerto.

•Por simplicidad, asumimos que el tamaño máximo de la tabla es 100 y que existen solo dosoperaciones sobre la tabla: insert y search.

•Esta tabla es almacenada en el objeto NameTable definido por la clase del código adjunto.

Page 22: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Ejemplo 1: Servidor de nombres

FCC-BUAP 22

•El servidor de nombres crea un socket de servidor con el puerto especificado para que ésteescuche cualquier conexión entrante mediante el método accept.

•El método accept devuelve el socket siempre que una conexión se realice, por lo que éstemaneja la solicitud que llega a dicho socket mediante el método handleclient.

•Se llama a getInputStream y getOutputStream para obtener los flujos de entrada ysalida asociados con el socket, así simplemente se utilizan los métodos asociados para leer yescribir flujos de entrada y salida desde el socket.

Page 23: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Ejemplo 1: Servidor de nombres

FCC-BUAP 23

•En la implementación de la clase NameServer, al menos un cliente es manejado a la vez. Unavez una solicitud es manejada, el ciclo en el main de NameServer acepta otra conexión.

•Para muchas aplicaciones puede ser inaceptable que el procedimiento tome mucho tiempo paramanejar una solicitud .

•Para estas aplicaciones, es bastante común que el servidor sea multihilo; el servidor acepta unaconexión y entonces genera un hilo para manejar la solicitud.

Page 24: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Ejemplo 1: Servidor de nombres

FCC-BUAP 24

•Sin embargo, se debe observar que dado que los datos del servidor son compartidos pormúltiples hilos, es responsabilidad del programador asegurar que los datos son accedidos demanera segura (por ejemplo, usando métodos síncronos).

Page 25: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Invocaciones a Métodos Remotos (RMI)

FCC-BUAP 25

•Una forma popular de desarrollar aplicaciones distribuidas se basa en el concepto de llamadas aprocedimientos remotos (RPC) o invocaciones a métodos remotos (RMI).

•La idea principal es que un proceso puede realizar llamadas a métodos de un objeto remotocomo si este estuviera en la misma máquina. El proceso para realizar la llamada es conocidocomo cliente y el proceso que atiende la solicitud es llamado servidor.

•En RMI, el cliente puede incluso desconocer la ubicación del objeto remoto. Esto proporcionatransparencia de locación para el cliente.

Page 26: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Invocaciones a Métodos Remotos (RMI)

FCC-BUAP 26

•En Java, el objeto remoto podría ser localizado usando el rmiregistry.

•Alternativamente, las referencias al objeto remoto pueden enviarse a través de la aplicacióncomo si fueran referencias a objetos locales.

•Como es de suponerse, una llamada a un método puede tener algunos argumentos, y laejecución del método puede retornar algún valor.

Page 27: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Invocaciones a Métodos Remotos (RMI)

FCC-BUAP 27

•Los argumentos del método remoto son enviados vía mensaje. De forma similar, el valorretornado es transmitido al invocador vía mensaje.

•Todo este pase de mensajes es oculto para el programador, y por lo tanto RMI puede ser vistocomo un desarrollo de programación de alto nivel que envía o recibe mensajes.

•Aunque la idea detrás de RMI es muy simple, ciertos temas necesitan ser añadidos durante laimplementación y usando RMI. Se tiene que entender la semántica del paso de parámetros.

Page 28: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Implementación de RMI

FCC-BUAP 28

•Un RMI se implementa como sigue:

◦ Por cada objeto remoto existe un objeto asociado del lado del cliente y un objeto del lado del servidor.

◦ Una invocación a un método de un objeto remoto es administrada a través del uso de un objetosuplente u objeto sustituto local al que el cliente llama objeto recipiente (stub object)

◦ Una invocación a un método resulta en empaquetar el nombre del método y sus argumentos en unmensaje y enviarlo al servidor. Esto es conocido como clasificación u ordenamiento de parámetros(parameter marshalling).

Page 29: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Implementación de RMI

FCC-BUAP 29

◦ Este mensaje es recibido por el servidor mediante un objeto esqueleto u objeto armazón (skeletonobject) del servidor.

◦ El objeto esqueleto es responsable de recibir el mensaje, reconstruir los argumentos y así finalmenteinvocar al método.

◦ Nótese que una clase RMI requiere compilación desde un compilador RMI para generar las rutinas delrecipiente y del esqueleto.

Page 30: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

RMI: Objetos remotos

FCC-BUAP 30

•Un objeto es llamado objeto remoto si sus métodos pueden ser invocados desde otra máquinavirtual de Java (JVM) ejecutándose en el mismo host o en diferentes.

•Tal objeto es descrito usando una interface remota (remote interface). Una interfaz es remota sihereda de java.rmi.Remote y sirve para identificar todos los objetos remotos.

•Sólo aquellos métodos especificados en una interfaz remota están disponibles remotamente. Acontinuación una interfaz remota para un servicio de nombres (ver código NameService.java).

Page 31: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameService

FCC-BUAP 31

import java.rmi.*;

public interface NameService extends Remote

{

public int search(String s)throws RemoteException;

public int insert(String s, String hostHame, int portNumber)throws RemoteException;

public int getPort(int index)throws RemoteException};

public String getHostname(int index)throws RemoteException

}

Page 32: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameService

FCC-BUAP 32

•Cualquier objeto que implementa una interfaz remota y extienda de UnicastRemoteObjectes un objeto remoto.

•Claramente, una invocación a un método remoto corresponde a la invocación de uno de losmétodos de un objeto remoto.

•Ahora es posible proporcionar una clase que implemente al NameService (ver códigoNameServiceImpl.java).

Page 33: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameServiceImpl

FCC-BUAP 33

import java.rmi.* ;

import java.rmi.server.UnicastRemoteObject;

public class NameServiceImpl extends UnicastRemoteObject implements

NameService

{

final int maxSize = 100;

private String names[] = new String[maxSize];

private String hosts[] = new String[maxSize];

private int ports[] = new int[maxSize];

private int dirsize = 0;

Page 34: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameServiceImpl

FCC-BUAP 34

public NameServiceImpl()throws RemoteException

{}

public int search( String s )throws RemoteException

{

for( int i=0; i<dirsize; i++ )

if( names[i].equals( s ) )

return i;

return -1

}

Page 35: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameServiceImpl

FCC-BUAP 35

public int insert( String s, String hostName, int portNumber )throws RemoteException

{

int oldIndex = search(s);

if( ( oldIndex == -1 ) && ( dirsize < maxSize ) )

{

names[dirsize] = s;

hosts[dirsize] = hostName;

ports[dirsize] = portNumber;

dirsize++;

return 1;

}

else

return 0;

}

Page 36: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameServiceImpl

FCC-BUAP 36

public int getPort( int index )throws RemoteException

{

return ports[index];

}

public String getHostName( int index )throws RemoteException

{

return hosts[index];

}

Page 37: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameServiceImpl

FCC-BUAP 37

public static void main( String args[] )

{

// crear el manejador de seguridad

try

{

NameServiceImpl obj = new NameServiceImpl();

Naming.rebind( "MyNameServer", obj );

System.out.println("MyNameServer bound in regitry");

}catch( Exception e )

{

System.out.println( "NameServiceImpl err: " +

e.getMessage() )

}

}

}

Page 38: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameServiceImpl

FCC-BUAP 38

•Para instalar nuestro servidor, primero se compila el archivo NameServiceImpl.java.Entonces, se necesita invocar al compilador RMI para generar el objeto stub y el objeto skeletonasociado con el servidor.

•En una computadora con UNIX, se podrían utilizar los siguientes comandos para llevar a caboestos pasos:

> javac NameServiceImpl.java

> rmic NameServiceImpl

Page 39: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameServiceImpl

FCC-BUAP 39

•Ahora se asume que el servicio rmiregistry está corriendo en la máquina, entonces sepuede iniciar nuestro servidor.

> rmiregistry &

•Existe sólo una última cosa que se necesita tomar en cuenta: la seguridad. Se necesitaespecificar quién puede conectarse al servidor. Esta especificación es realizada por un archivo dedirectivas de seguridad. Por ejemplo, considera un archivo llamado policy (sin extensión)como sigue:

grant

{

permission java.net.SocketPermission "*:1024-65535", "connect,accept";

permission java.net.SocketPermission "*:82", "connect";

};

Page 40: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Clase NameServiceImpl

FCC-BUAP 40

•Esta directiva permite código descargado, a partir de cualquier código base, para hacer estas doscosas:

1. Conectarse a o aceptar conexiones en puertos sin privilegios (puertos mayores a 1024)

2. Conectarse al puerto 80 [el puerto para HTTP]

•Ahora podemos lanzar el servidor NameServiceImpl como sigue:

> java -Djava.security.manager -Djava.security.policy=policy NameServiceImpl

Page 41: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Pase de parámetros

FCC-BUAP 41

•Si un objeto local es pasado como argumento a un método local de un objeto local, entonces enJAVA simplemente se pasa la referencia al objeto.

•Sin embargo, si el método pertenece a un objeto remoto, la referencia a un objeto local no sirvepara nada del otro lado. Por lo tanto, se tratan de diferente manera los argumentos de métodosremotos.

•Existen tres formas de pasar argumentos (y obtener los resultados) en invocaciones a métodosremotos:

Page 42: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Pase de parámetros

FCC-BUAP 42

1. Los tipos primitivos en Java (int, float, boolean, etc.) son pasados mediante valores.

2. Los objetos que no son remotos son pasados por valor usando serialización de objetos(object serialitation), lo cual se refiere al proceso de convertir el estado del objeto en un flujode bytes:

◦ Cualquier objeto que implemente la interface Serializable puede ser comunicado a través deInternet usando serialización.

◦ El objeto está escrito como un flujo de bytes en un extremo (“serializado”) y al final del otro extremo esreconstruido a partir del flujo de bytes recibido (“de-serializado”).

Page 43: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Pase de parámetros

FCC-BUAP 43

◦ Una cuestión interesante es ¿Qué sucede si el objeto posee referencias a otros objetos? En este caso,aquellos objetos también necesitan ser serializados; de otra forma las referencias no tendrán sentidodel otro lado.

◦ Así, todos los objetos que son accesibles desde dicho objeto se serializan. El mismo mecanismofunciona cuando un objeto no remoto es retornado desde una invocación a método remoto.

◦ JAVA soporta integridad referencial, que es, si múltiples referencias al mismo objeto son pasadas desdeuna Máquina Virtual de Java (JVM) a otra, entonces dichas referencias se referirán en una copia simpledel objeto en la JVM que está recibiendo.

Page 44: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Pase de parámetros

FCC-BUAP 44

3. Finalmente, las referencias a objetos que implementan la interface remote son pasadoscomo referencias remotas. En este caso, se pasa el objeto stub para el objeto remoto.

Page 45: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Tratamiento de Fallas

FCC-BUAP 45

•Una diferencia entre invocar a un método local e invocar a un método remoto es que variascosas pueden salir mal cuando un método remoto es invocado: la máquina que contiene alobjeto remoto puede fallar, la conexión a dicha máquina puede fallar, o el mensaje enviadopuede ser corrompido o incluso perdido.

•A pesar de la posibilidad de todos estos problemas, el sistema de JAVA garantiza una semánticaat-most-once para la invocación de un método remoto, es decir, cualquier invocación resultaráen ejecución del método remoto al menos una vez.

•En este caso, la solicitud puede ser enviada de nuevo en caso de falla, pero al mismo tiempo esfiltrada en el servidor para evitar duplicados.

Page 46: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Programa cliente

FCC-BUAP 46

•El programa cliente primero necesita obtener una referencia al objeto remoto. La clasejava.rmi.Naming proporciona métodos para hacerlo.

•Se trata de un mecanismo basado en la sintaxis de una URL (Uniform Resource Locator) paraobtener referencias a objetos remoto.

•La URL para un objeto remoto se especifica utilizando el host habitual, puerto, y nombre:

rmi://host:port/name

Page 47: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Programa cliente

FCC-BUAP 47

•donde host es el nombre del host del registro (por defecto el host actual), port es el númerode puerto del registro (por defecto el número de puerto del registro), y name es el nombre delobjeto remoto.

•Los métodos clave en esta clase son:

PROTOTIPO DESCRIPCIÓN

bind( String, Remote ) Enlaza el nombre con el objeto remoto especificado.

list( String ) Retorna un arreglo de strings de las URLs en el registro.

lookup( String ) Retorna el objeto remoto para la URL

rebind( String, Remote) Re-enlaza el nombre a un nuevo objeto; reemplaza cualquier vínculo existente.

unbind( String) Des-enlaza el nombre.

Page 48: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Programa cliente

FCC-BUAP 48

•Ahora se muestra como un cliente puede usar el método lookup para obtener una referencia al objeto remoto y entonces invocar los métodos de este (ver código NameRmiClient.java).

port java.rmi.*;

public class NameRmiClient

{

public static void main( String args[] )

{

try{

NameService r = (NameService) Naming.lookup("rmi://linux02/MyNameServer" );

int i = r.insert( "p1", "tick.ece", 2058 );

int j = r.search( "p1" );

if( j != -1 )

System.out.println( r.getHostName(j) + ":" + r.getPort(j) );

}catch( Exception e ){

System.out.println( e );

}

}

}

Page 49: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Otras clases útiles

FCC-BUAP 49

•En esta sección, nos enfocamos en clases que permiten escribir programas distribuidos. Paracasos donde un proceso simplemente necesita datos desde una localización remota, JAVAproporciona la clase Uniform Resource Locator (URL).

•Una URL consiste de seis partes: protocolo, hostname, port, path, filename y document section.

Un ejemplo de una URL es:

http://www.ece.utexas.edu:80/classes.html#distributed

Page 50: Programación Distribuida - climate.cs.buap.mxclimate.cs.buap.mx/CondeJC/Cursos/Material/Distribuido_/Notas/07... · •A continuación se describirá la clase InetAddress, la cual

Otras clases útiles

FCC-BUAP 50

•La clase java.net.URL permite al programador leer datos desde una URL mediante métodostal como:

public final InputStream openStream()

•Este método retorna un InputStream desde el cual se pueden leer los datos. Para diferentestipos de datos tales como imágenes y clips de audio existen métodos tal como:

public Image getImage(URL u, String filename)

y

public void play(URL u)

•Sin embargo, no es importante por ahora ocuparse de estas clases y métodos.