Programación Concurrente y Distribuida
Ingeniería Informática
Facultad de Ciencias
Universidad de Cantabria.
Documento:
Red Ferroviaria con Sockets
Autores: José M. Drake
Laura Barros
Santander, 9-10 noviembre, 2011
1. Objetivo
Particionar un aplicación distribuída utilizando la API de sockets, proxys y
servants.
En esta versión del proyecto Red Ferroviaria se distribuye el código en varios
procesadores.
El procesador NodoInfraestructura ejecuta el código relativo a los
elementos situados en tierra (infraestructura) (RedFerroviaria, Tunel,
TramoFerroviario y CentroRegulación).
Hay un procesador NodoTren por cada uno de los trenes que circulan que
ejecuta el código relativo al control de su marcha (Tren). La interacción
entre los trenes y la infraestructura se realiza utilizando el paradigma Proxy-
Servant, y la comunicación entre estos se realiza utilizando sockets.
port [2000]
port [2040] Rojo
port [2050] Azul
n <<Internet>>1
port [2010]
port [2020] Rojo
port [2030] Azul
2. Punto de partida
Partimos de la aplicación RedFerroviariaLockJava, a la que hemos cambiado su
estructura para poder ser distribuida en varios procesadores.
El código se ha separado en dos particiones (paquetes):
El paquete infraestructura: contiene las clases que se instancian en el
procesador NodoInfraestructura.
El paquete equipoMovil: contiene las clases que se embarcan en el
procesador NodoTren.
Las modificaciones que se han hecho respecto de RedFerroviariaLockJava son:
• Finalización de la actividad de los trenes: El método entro() de la clase
CentroRegulación retorna un booleano. Destinado para el tren cuando se accede
al CentroRegulación para anunciar que entra en el centro de regulación.
si es true :actividad del tren debe finalizar definitivamente.
si es false: el tren debe continuar.
la
infraestructura se ha realizado a
• Proxys y Servants: Para facilitar la distribución, la conexión de cada tren con
las clases de
través de parejas
complementarias Proxy-servant. Se han agregado a cada tren instancias de las
clases RedFerroviaria Proxy, TunelProxy y CentroRegulacionProxy, que
constituyen el mecanismo por el que los trenes acceden a los correspondientes
objetos RedFerroviaria, Tunel y CentroRegulacion. Cada proxy ofrece
localmente al tren, el conjunto de operaciones que éste requiere del objeto que
representa.
la RedFerroviaria
instancia de
tiene agregada una
Así mismo,
la clase
RedFerroviariaServant, el Tunel tiene agregado una instancia de la clase TunelServant y
cada CentroFerroviario y TramoFerroviario tienen agregados respectivamente una
instancia de las clases CentroFerroviarioServant y TramoServant. Los servant ejecutan
por delegación en el elemento al que pertenecen los requerimientos que se reciben de
los trenes (a través de los proxies).
Cuando un tren interacciona con un elemento de la infraestructura, lo hace invocando
un método del correspondiente Proxy que es local. Éste, a través de un socket, se
comunica con el correspondiente servant, que se constituye en el intermediario que
ejecuta la interacción con el elemento.
Las interacciones que los trenes realizan sobre los elementos de la infraestructura
pueden ser de dos tipos:
- No bloqueante: No implica ningún bloqueo del thread del tren más allá del
envío de la información y el retorno del cómputo. Ejemplos de este tipo de
interacción son:
o salgo():void de la clase Tunel
o esPosicionLibre(posición,tramo):boolean de la clase RedFerroviaria.
:Tren
:TramoFerroviarioProxy
:TramoFerroviarioServant
:RedFerroviaria
esPosicionLibre()
socket [2000]
sendMsj (esPosicionLibre)
sendMsj (return esPosicionLibre)
esPosicionLibre()
-Bloqueante: El thread del tren se suspende a la espera de un evento de otro
thread. Estas son:
o entro():boolean de la clase Tunel.
o entro(tramo):void de la clase CentroRegulacion.
En este caso el correspondiente servant delega en un thread agente para que
quede a la espera del evento y permita al servant procesar otras peticiones.
:Tren
:TunelProxy
:TunelServant
:Tunel
entro()
sockets [port 2010]
sendMsj (entro())
Toma el lock de
TunelProxy
Suspendido en
read() de socket
sendMsj (return entro())
notify()
x Arquitectura de la aplicación.
Clases incluidas en la partición infraestructura:
:Agente
entro()
Suspendidoen lock
de Tunel
notify()
salgo()
En el siguiente diagrama de clases se muestran las clases del paquete infraestructura
que se instancian en el procesador NodoInfraestructura. Las clases RedFerroviaria,
TramoFerroviario y Tunel son básicamente iguales a las utilizadas en la aplicación no
distribuida RedFerroviariaLockJava.
La clase CentroRegulación es también la misma, salvo que incorpora el mecanismo de
finalización de los trenes. Los cambios son:
Atributo nuevo:
terminado:boolean=false => Vale True si la actividad de los trenes debe
finalizar.
Métodos nuevos:
termina() => Establece que la actividad de los trenes del tramo ferroviario debe
finalizar.
entro():boolean =>
o Bloquea el thread entrante hasta que llegue la hora de salida de tren.
o Retorna true si la actividad del tren que invoca debe terminar.
3. Nuevas Clases
Clase RedFerroviariaServant: Servant que ejecuta los metodos de la RedFerroviaria
que requiere cualquier tren a través del *Proxy complementario utilizando el socket que
se establece entre ellos. Recibe por el socket de puerto 2000 como mensajes los
métodos que los trenes realizan sobre la RedFerroviaria.Invoca el método requerido en
RedFerroviaria y retorna el resultado.
Constructor:
RedFerroviariaServant(laRed:RedFerroviaria)=> Recibe como parámetro
referencia a la RedFerroviaria de la que es servant.
la
Atributos:
laRed:RedFerroviaria => Referencia a la RedFerroviaria sobre el que opera. Se
establece en su constructor
<<final>>PORT:int=2000 => Puerto del socket por el que el
espera de recibir mensajes de los *Proxies complementarios. Es constante [2000].
ServerSocket serv => Server que atiende los requerimientos que recibe de los *Proxies
complementarios por su puerto.
*Servant queda a la
Clase TunelServant: Servant que ejecuta los métodos del Tunel que requiere cualquier
tren a través del *Proxy complementario utilizando el socket que se establece entre
ellos. Recibe por el socket de puerto 2010 como mensajes las invocaciones de los
métodos que los trenes realizan sobre el Tunel. Invoca por el método requerido en
Tunel. Retorna el resultado.
Constructor:
TunelServant(elTunel:Tunel)=> Recibe como parámetro la referencia al Tunel del que
es servant.
Atributos:
elTunel:Tunel => Referencia el Tunel sobre el que opera. Se
constructor.
<<final>>PORT:int=2010 => Puerto del socket por el que el
espera de recibir mensajes de los *Proxies complementarios. Es constante [2010].
ServerSocket serv => Server que atiende los requerimientos que recibe de los *Proxies
complementarios por su puerto.
*Servant queda a la
establece
en
su
Clase CentroRegulacionServant: Servant
del
CentroRegulacion que requiere cualquier tren a través del *Proxy complementario
utilizando el socket que se establece entre ellos. Recibe por el socket de puertos 2020
(tramo Rojo) y 2030 (tramo Azul) como mensajes los métodos que los trenes realizan
sobre el correspondiente CentroRegulacion.
método requerido en
CentroRegulacion. Retorna el resultado.
los métodos
Invoca el
ejecuta
que
Constructor:
CentroRegulacionServant(elCentroRegulacion:CentroRegulacion,
port:int)=> Recibe como parámetro la referencia al CentroRegulación del
que es servant, y el puerto (2020 - tramo Rojo ,2030 - tramo Azul).
Atributos:
elCentroRegulacion:CentroRegulacion => Referencia el CentroRegulacion sobre el
que opera. Se establece en su constructor.
<<final>>PORT:int => Puerto del socket por el que el *Servant queda a la
de recibir mensajes de los *Proxies complementarios. Se establece
en
constructor. Puede tomar los valores [2020] tramo rojo y [2030] tramo azul.
espera
el
ServerSocket serv => Server que atiende los requerimientos que recibe de
*Proxies complementarios por su puerto.
los
TramoFerroviarioServant: Servant
Clase
del
TramoFerroviario que requiere cualquier tren a través del *Proxy complementario
utilizando el socket que se establece entre ellos. Recibe por el socket de puertos 2040
(tramo Rojo) y 2050 (tramo Azul) como mensajes los métodos que los trenes realizan
sobre el correspondiente TramoFerroviario.
método requerido en
TramoFerroviario. Retorna el resultado.
los métodos
que
ejecuta
Invoca el
Constructor:
TramoFerroviarioServant(elTramo:TramoFerroviario,port:int)=> Recibe como
parámetro la referencia al TramoFerroviario del que es servant, y el puerto 2040 -
tramo Rojo ,2050 - tramo Azul).
Atributos:
elTramo:TramoFerroviario => Referencia el TramoFerroviario sobre el que
opera. Se establece en su constructor.
<<final>>PORT:int => Puerto del socket por el que el *Servant queda a la
espera de recibir mensajes de los *Proxies complementarios. Se establece
en el constructor. Puede tomar los valores [2040] tramo rojo y [2050] tramo
azul.
ServerSocket serv => Server que atiende los requerimientos que recibe de
los
*Proxies complementarios por su puerto.
Clases incluidas en la partición equipoMovil:
La clase Tren es básicamente igual a las utilizadas en la aplicación no distribuida, salvo
que se comunica con los elementos incluidos en el paquete infraestructura a través de
Comentarios de: P4_RedFerroviariaSockets_doc.pdf (0)
No hay comentarios