Práctica laboratorio Sistemas Distribuidos curso 2014/2015
Nombre : Gustavo Javier Apellidos : e! ""ama DN# : 4$0%&'54( e)mail : *us+i,*200%-.otmailcom *us+i,*200%-.otmailcom
Descripci, trabao realiado Para a3ro,tar la realiaci, de la práctica realic u,a prueba a,terior basá,dome e, la descripci, dada para compre,der el 3u,cio,amie,to de la misma ! para te,er u, primer co,tacto co, los callbac+s Para ello utilic material ue e,co,tr por i,ter,er sobre todo de la pá*i,a de pá*i,a 6racle de soporte de ava ! varios sitios más Además del eemplo ue aparece e, el libro Distributed 7omputi,* ) 7o,cepts a,d applicatio, b! pro3esor 8""iu e, el sitio .ttp://9992csuicedu/i441/8#7allbac+/ ;abie,do realiado esta proto práctica co, más 3u,cio,es ue las ue se ,os pide e, la práctica come,c a realiar la práctica pedida la creaci, del re*istr!> asi*,aci, de puertos para las publicacio,es de puertos ! demás> come,c co, u,a estructura básica ! cree las clases ue se ,os pide, para tal 3i, (sta estructura básica solo impleme,taba el re*istro de u, usuario Para ello tuve ue crear a los actores i,volucrados: el usuario> el servidor ! la base de datos co, sus respectivas co,e=io,es a travs del re*istr! A medida ue todo 3ue 3u,cio,a,do 3ui a*re*a,do más 3u,cio,alidades .asta lle*ar a la práctica 3i,al> pero te,ie,do por el cami,o muc.os problemas ue resolver 8i práctica co,sta de las clases obli*atorias ! al*u,as más
7lases creadas por mi Arc.ivador: clase ue e,capsula los datos de los usuarios 7odebase: clase ue establece la propiedad codebase 8e,sae: clase ue crea me,saes 8e,us: clase ue escribe me,us por pa,talla Se*uidores: clase ue e,capsula la lista de se*uidores de cada usuario Se*uridad: clase ue establece la propiedad de se*uridad
Descripci, de cada clase Arc.ivador #mpleme,ta Serialiable 7lase ue e,capsula los datos de los usuarios Sus campos so, : ,ombre del usuario ?mail ?pass9ord ?estado ?i,dice
mi ?me,saPe,d lista de me,saes pe,die,tes: arra!list ue almace,a los i,dices de los me,saes pe,die,tes Posee mtodos para obte,er ! actualiar los datos Para e,te,der las dos @ltimas estructuras .a! ue e=plicar ue todos los me,saes se almace,a, e, u,a estructura *lobal do,de se asocia u, e,tero a u, me,sae 7ada ve ue al*@, usuario escribe u, me,sae se almace,a, e, esta estructura> orde,ados se*@, precede,cia a travs de este ,dice As e, Arc.ivador e, ve de almace,ar de ,uevo los me,saes almace,amos el i,dice del me,sae e, la estructura *lobal As para recuperar el me,sae basta buscar el i,dice e, la estructura *lobal de me,saes "a clase Arc.ivador la utilia, Basededatos> Servidor ! los usuariosC Basededatos para recibir los datos ue e,via, los usuarios> Servidor para e,viar los datos de u, usuario cua,do al*u,o lo solicita ! los usuarios para poder almace,ar ! ver sus datos 7odebase 7lase ue establece la propiedad avarmiservercodebase ecibe la i,ter3a de la clase do,de co, su ubicaci, poder buscar las clases para car*ar ! sea, accesibles para e,viar de 3orma remota "a clase es utiliada Basededatos ! Servidor ue so, las clases ue publica, e, el re*istr! sus servicios para ue sea, accesibles por eemplo para suario> los servicios de Servidor ! para Servidor los servicios de Basededatos 8e,sae #mpleme,ta Serialiable (,capsula los me,saes de la Basededatos .acia su receptor true o 3alse ! u, me,sae asociado (sta clase se utilia para e,viar respuestas de la Basededatos al Servidor ! del Servidor al suario Posee mtodos para obte,er ! actualiar u, me,sae 8e,us (s u,a clase au=iliar ue escribe por pa,talla los me,@s de cada actor> usuario> servidor o basededatos 7ada actor posee su propio me,u ue se desplie*a al llamar a sus mtodos Además posee u, mtodo para leer por teclado la opci, del me,@ ue se eli*e e, cada caso ! devolver el resultado al actor para ue eecute la acci, ele*ida borrar ! co,sultar estos se*uidores o la lista completa de se*uidores Basededatos la utilia para almace,ar los se*uidores de u, usuario
Se*uridad 7lase ue establece la propiedad de poltica de se*uridad utilia,do el arc.ivo /se*uridadpolic! ! crea de 3orma temporal u,a copia de este arc.ivo para ue sea accesible a la clase Busca el arc.ivo> crea u,a copia ! la i,clu!e e, u, directorio accesible por el classpat. e, 7:sersEF,ombre usuarioEAppDataE"ocalE es all permissio,> para permitir todas las co,e=io,es> !a ue ,o es ,ecesaria más se*uridad e, este caso para los 3i,es de la práctica (sta clase la utilia, los tres actores> para de3i,ir su poltica de co,e=io,es usuarios> servidor ! basededatos
Descripci, clases obli*atorias Del usuario
, suario utilia las clases de3i,idas por mi : ) Se*uridad ) 8e,@s ) 8e,sae ) Arc.ivador Para poder utiliar los obetos remotos ue le bri,da el Servidor utilia: ) ServicioGestor#,ter3ace ) ServicioAute,ticacio,#,ter3ace Para e,viar u, callbac+ utilia ) 7allbac+suario#,ter3ace ) 7allbac+suario#mpl
Para e,viar u, me,sae ! su propietario: )
re*istrarHI: re*istra u, ,uevo usuario utilia re*istroHI de ServicioAute,ticacio,#mpl
salirHI: establece la variable de corte a 3alse para salir del se*u,do me,@ de usuario e=itHI: a,tes de termi,ar el usuario po,e a ,ull todas sus variables ! eecuta recolector de basura ! termi,ar el .ilo usuariosSistemaHI: devuelve u,a lista co, los usuarios re*istrados del sistema utilia usuarios de ServicioAute,ticacio,#mpl
i,3ormacio,HI: pide la i,3ormacio, del usuario ! la escribe por pa,talla utilia obte,erDatosHI de ServicioAute,ticacio,#mpl
lo*633HI: cambia el estado del usuario e, la BD ! si operacio, se realia sale del sistema de 3orma se*ura tilia deslo*earHI
e,viar
se*uirsuarioHI: permite se*uir a u, usuario dado A*re*a mi ,ic+ a la lista de se*uidores del usuario ue se especi3ica utilia addSe*uidorHI
dearDeSe*uir: permite dear de se*uir a u, usuario dado> ,os borra de sus se*uidores utilia borrarSe*uidorHI
De 7allbac+suario#,ter3ace 7allbac+suario#,ter3ace declara e, su i,ter3a u, solo mtodo callBac+Noti3icacio,HI ue 7allbac+suario#mpl impleme,ta (ste mtodo recibe u,a cade,a> u, me,sae ! la imprime e, pa,talla> se ,os ,oti3ica de u, me,sae e,viado por u, usuario al ue se*uimos De actor Servidor
ServicioAute,ticacio,#mpl mtodos remotos (sta clase .ace uso de las clases a,tes descritas Arc.ivador ! 8e,sae e implemeta la i,ter3a ServicioAute,ticacio,#,ter3ace "os usuarios se comu,ica, co, los mtodos remotos de ServicioAute,ticacio,#mpl ! estos a su ve co, los servicios remotos de Basededatos para poder realiar la operativa Para ello busca e, el re*istro> el obeto remoto : URL_Basededatos = "rmi://localhost:"+numeroDePuertoBD+ "/ServicioDatos/basededatos" .
"os mtodos !a los .emos ,ombrado a,tes cua,do describimos a los mtodos de suario: lo*i,HI: e,via los datos a la BD a travs del mtodo lo*i,SistemaHI ! este devuelve u, me,sae co, el resultado de la operaci, al usuario
re*istroHI:e,va los datos para re*istro a la BD a travs del mtodo re*istrarBDHI ! este devuelve u, me,sae co, el resultado de la operaci, al usuario usuariosHI:devuelve u,a lista de los usuarios del sistema ue e,va la BD al Servidor tilia listarsuariosHI estadoHI: obtie,e el estado de u,a usuario dado a travs de *et(stadoHI deslo*earHI: a travs del mtodo salirSistemaHI e,via u,a petici, para re*istrar e, la BD la salida del sistema ! este devuelve u, me,sae co, el resultado de la operaci, al usuario obte,erDatosHI: obtie,e los datos de la BD co, *etDatosHI ! este devuelve u, me,sae co, el resultado de la operaci, al usuario ue será u,a i,sta,cia de Arc.ivador
De ServicioGestor#mpl mtodos remotos De 3orma similar a los mtodos de SevicioAute,ticacio,#mpl pero su 3u,ci, es di3ere,te Si SevicioAute,ticacio,#mpl se e,car*a de los datos de los usuarios> SevicioGestor#mpl se e,car*a de todo lo relacio,ado co, los me,saes de los usuarios (sta clase utilia las clases de apo!o 8e,saes tilia los metodos remotos de la BD ! e,va u, callbac+ de lo la clase 7allbac+suario#mpl "os usuarios se comu,ica, co, los mtodos remotos de ServicioGestor#mpl ! estos a su ve co, los servicios remotos de Basededatos para poder realiar la operativa Para ello busca e, el re*istro> el obeto remoto : URL_Basededatos = "rmi://localhost:"+numeroDePuertoBD+ "/ServicioDatos/basededatos" .
"os mtodos !a los .emos ,ombrado a,tes cua,do describimos a los mtodos de suario: e,viar utilia a,adir usa cutSe*uidorHI ! recibe u, me,sae de la operacio, mis8e,saesPe,dHI: busca los me,saes pe,die,tes de u, usuario ! le devuelve la lista co, ellos usa *etPe,die,tesHI borrarPe,dHI: u,a ve ue el Servidor e,va los me,saes al usuario ! los lee> el usuario borra estos
me,saes utilia,do este mtodo ue a su ve utilia clearPe,dHI para borrarlos e, la BD re*istro7allbac+HI: usa add7allbac+HI para a*re*ar u, obeto remoto de ,oti3icaci, e, la BD procede,te de u, usuario
Servidor 7lase pri,cipal del actor Servidor> posee el mai, del mismo tilia las clases de apo!o 8e,us> Se*uridad> 7odebase Ademas de al*u,os mtodos de la clase ServicioDatos#mpl para realiar al*u,a de sus 3u,cio,es como devolver la lista de usuarios lo*eados Publica sus dos servicios e, el re*istr! para ue sus mtodos sea, accesibles de 3orma remota Sus mtodos ,o so, remotos> so, locales al Servidor: listarsuarios"o*: lista los usuarios lo*eados e, ese mome,to tilia el mtodo lista"o*eadosHI de la BD i,3ormaci,: escribe por pa,talla i,3ormaci,> del ,ombre de los obetos remotos ue o3rece e, 3ormato "
(l actor Basededatos "a clase ServicioDatos#mpl Aporta los mtodos remotos a los servicios ServicioAute,ticacio,#mpl ! ServicioGestor#mpl además de a la clase Servidor ! a la clase Basededatos tilia las clases de apo!o Arc.ivador> Se*uidores> 8e,sae>
8todos remotos "os divido e, los ue presta, servicio al ServicioAute,ticacio,#mpl del actor Servidor ! a ServicioGestor#mpl del mismo actor> como a la clase Servidor ! a la clase Basededatos Al ServicioAute,ticacio,#mpl: re*istrarBDHI: este mtodo re*istra u, ,uevo usuario a partir de su ,ic+ Leri3ica si el ,ic+ está dispo,ible para re*istro> ! si lo está almace,a el ,ic+ ! le asocia u,a estructura Arc.ivador co, sus datos ! su estado a desco,ectado para ue !a pueda ser se*uido por usuarios Devuelve u,a respuesta del resultado de la operaci, lo*i,SistemaHI: comprueba si los datos pasados so, correctos ! devuelve u,a respuesta del resultado de la operaci, listarsuariosHI: busca e, la estructura de datos datossuario todas las claves> todos los usuarios re*istrados ! las tra,s3orma a Stri,* ! las devuelve como u,a lista salirSistemaHI: realia u,a serie de comprobacio,es co, el ,ombre del usuario ! si todo es correcto cambia su estado a desco,ectado Devuelve u,a respuesta del resultado de la
operacio, *et(stadoHI: devuelve el estado del usuario: *etDatosHI: devuelve u,a estructura Arc.ivador co, los datos del usuario Al ServicioGestor#mpl a,adir utilia,do el callbac+ almace,ado e, la estructura para ello> el me,sae siempre ue este e, estado co,ectado> si,o almace,a e, el Arc.ivador de cada usuario u,a re3ere,cia al me,sae de la lista *lobal de me,saes> para ue cua,do .a*a lo*i, se les e,vie, a,adirSe*uidorHI: aKade u, se*uidor e, u,a lista de se*uidores asociada a cada usuario cutSe*uidorHI: borra de esta estructura al se*uidor del usuario *etPe,die,tesHI: devuelve los me,saes pe,die,tes a u, usuario dura,te el proceso de lo*i, del mismo clearPe,dHI: 7ua,do el usuario .a leido sus me,saes pe,die,tes este e,va u, mtodo> ue a travs del servidor borra la lista de me,saes pe,die,tes add7allbac+HI: aKade u, callbac+ ue e,va u, usuario al lo*earse ! lo almace,a e, u,a estructura de datos asociada al ,ombre de uie, lo e,va (ste mtodo realia otra modi3icaci, e, el usuario 7ua,do u, usuario realia u, lo*i, su estado es desco,ectado 7ua,do e, la BD se almace,a el callbac+ el usuario pasa a estado co,ectado> !a ue si lo .iciese e, el mome,to del lo*i, si tra,scurriese u, tiempo e,tre ue el estado es co,ectado ! el callbac+ ,o .a lle*ado au,> ! el usuario del callbac+ estuviera si*uie,do a al*@, otro usuario ! este e,va u, me,sae> ,o podra co,ectarse ! te,dramos u,a e=cepci, 7ua,do el usuario se lo*ea el mtodo ue lo .ace i,voca tres mtodos u,o para lo*earse otro para e,viar el callbac+ ! otro para recibir me,saes ,uevos As cua,do el primero se eecuta co, =ito ! el se*u,do todava ,o .a lle*ado .asta la BD> a travs del servidor> este usuario puede se*uir almace,a,do me,saes pe,die,tes ! ,o perder ,i,*u,o "ue*o cua,do el callbac+ lle*a cambia de estado a co,ectado ! lue*o recibe la lista de me,saes pe,die,tes
"ocales a la clase co,vert previame,te almace,ados respaldarBDHI: a,tes de cerrar la BD se *uarda, todas las (D e, u, arc.ivo t=t *et"ista8e,saHI: devuelve la lista de todos los me,saes
A la clase Servidor lista"o*eadosHI: devuelve la lista de usuarios lo*eados e, ese mome,to A ServicioAute,ticacio,#mpl ! a Servidor listarsuariosHI: devuelve la lista> el ,ic+> de todos los usuarios re*istrados .asta el mome,to 7lase Basededatos
(sta clase implemta el mai, de la BD ! publica el servicio de la misma e, el re*istr! tilia las clases de apo!o Se*uridad> 7odebase> 8e,us> ! además utilia al*u,os mtodos de la clase ServicioDatos#mpl realia varias 3u,cio,es como ver todos los me,saes del sistema ! todos los usuarios del mismo> ademas del ,ombre del obeto remoto e, 3ormato " rmi://localhost:"+numeroDePuertoBD+"/ServicioDatos/basededatos
6tra 3u,ci, ue realia es ue cua,do se cierra> pide la lista de usuarios lo*eados e, ese mome,to ! po,e su estado a desco,ectado> para evitar i,co,siste,cias Si la BD se cierra ! .a! usuarios lo*eados> e,to,ces estos ,o puede, cambiar su estado> ! la sesi, uedara abierta ! ,o ,os podramos lo*ear ,uevame,te "os usuarios e, todo mome,to c.euea, su estado para saber si .a! al*@, problema co, la base de datos Si la BD esta caida *e,erará u, e=cepcio, e, el usuario ! se cerrará (structuras de datos para almace,ar los datos Map
So, cuatro estructuras
Mu,cio,amie,to 7ua,do u, usuario se re*istra sus datos se almace,a, e, datossuario e, u, Arc.ivador De a.i se puede, recuparar 7ua,do el usuario .ace lo*i, se e,va el callbac+ ! se almace,a e, lista7allBac+ ! se recupera, desde lista8e,saes los me,saes pe,die,tes cu!a re3ere,cia estaba e, Arc.ivador Si u, usuario e,va u, me,sae> el me,sae se almace,a e, la lista8e,saes> la posici, ue tie,e el me,sae e, la (D ue lo co,tie,e se almace,a e, Arc.ivador> para te,er u,a re3ere,cia del me,sae e, la lista Se busca e, la lista listaSe*uidores por su ,ic+ ! se busca, sus se*uidores ! lue*o para cada u,o de ellos si su estado es desco,ectado> lo buscamos e, su Arc.ivador> *uardamos los me,saes e, pe,die,tes> u,a re3ere,cia al me,sae e, lista8e,saes Si el estado es co,ectado> se busca co, su ,ic+ e, la lista7allBac+ para obte,er el obeto remoto ! eecutar su mtodo para devolver al usuario ue si*ue al ue .a escrito el me,sae> el me,sae Si ueremos se*uir a u, usuario co, el ,ic+ del usuario al ue vamos a se*uir lo buscamos e, listaSe*uidores ! a*re*amos ,uestro ,ic+ a su lista de se*uidores Si ueremos dear de se*uir a u, usuario> co, su ,ic+ buscamos ! borramos el ,uestra de la lista Si ueremos co,ocer todos los usuarios del sistema buscamos e, datossuario los ,ombre de los usuarios re*istrados 7apturas de pa,talla
i,icio de la base de datos
,o e=iste, usuarios re*istrados
i,icio del servidor
,o e=iste, usuarios lo*eados
i,icio ! re*istro de u, usuario
!a aparece el usuario re*istrados
lo*i, de asd
re*istro ! lo*i, de 9ert
se*uir a 9ert ! recepcio, del me,sae de 9ert
9ert e,via u, me,sae
asd se lo*ea ! recibe el me,sae pe,die,te> 9ert vuelve a escribir ! asd vuelve a recibir el
me,sae de 3orma automatica
lista de usuarios lo*eados ! de me,saes del sistema
asd se .a deslo*eado ! se ve, desde 9ert todos los usuarios del sistema
asd ! 9ert se .a, deslo*eado el servidor ! la basededatos de .a, cerrado> se .a, vuelto a po,er e,
3u,cio,amie,to ! se ve, los usuarios re*itrados los me,saes ! ue ,o .a! usuarios lo*eados 7o,clusio,es: Para los ue ,o estamos acostumbrados al mu,do ava ! mas a 8# es u, desa3o compre,der los co,ceptos para lue*o aplicarlos 7o, el tiempo los co,ceptos se asie,ta, ! las cosas parece, más 3áciles (, i,ter,et .a! muc.a i,3ormaci, al respeto de ava> eemplos de 8# ! de callbac+s Pero si, duda el video de Merm, ! las vdeo tutorias me .a, sido mu! @tiles pero sobre todo e=perime,tar u, poco co, las .erramie,tas Nu,ca .aba usado eclipse ! e, esta ocasi, lo .e utiliado ! el resultado .a sido mu! bue,o uias 3alta, e=plicar u, poco meor lo de los classpat. ue da, muc.o dolor de cabea Pero e, de3i,itiva .a sido u, proceso e,trete,ido 8todos de las clases Arc.ivador void
addIndiceTrino(int indice)
void addPendiente (int indice)
void borraListaPend ()
String getEstado ()
Integer getIndicePend (int indice)
Integer getIndiceTrino (int indice)
int getLargoLista ()
int getLargoListaPend ()
String getMail ()
String getNombre ()
String getPassword ()
void setEstado (String estado)
void setMail (String mail)
void setNombre (String nombre)
void setPassword (String password)
Basededatos static void
informacion()
static void
listarTrinos()
static void
listarUsuarios()
static void main(String[] args)
7allbac+suario#mpl void
callBackNotificacion (String mensaje)
7odebase static void setCodeBase (Class> c)
8e,us String
leerTeclado()
void menuBD ()
void menuCliente1 ()
void menuCliente2 ()
void menuer!idor ()
8e,sae String get"es#uesta ()
String getTe$to ()
void set"es#uesta (String respuesta)
void setTe$to (String texto)
Se*uidores void addeguidor (String usuario)
void borrareguidor (String seguidor)
rra!"ist<
getListaeguidores ()
String> String geteguidor (int indice)
Se*uridad tatic String
getLocation%fPolic&'ile()
static void main(String[] args)
Servidor static void
informacion()
static void
listarUsuariosLog()
static void main(String[] args)
ServicioAute,ticacio,#mpl #ensaje
deslogear(String nombre)
String estado (String usuario)
#ensaje login (String usuario$ String contrasena)
rc%ivador obtenerDatos (String usuario)
#ensaje registro (String nic&$ String nombre$ String mail$
String password) rra!"ist< usuarios String>
ServicioDatos#mpl void addCallback (String usuario$
Callbac&'suarioInterace objCallbac&) #ensaje anadireguidor (String seguidor$ String aSeguir)
void anadirTrino (rino trino)
void cargarBD ()
void clearPend (String usuario)
String con!ertirMillis (long milliseconds)
String con!ertTotring (rino trino)
#ensaje cuteguidor (String seguidor$ String aSeguir)
rc%ivador getDatos (String usuario)
String getEstado (String usuario)
rra!"ist< String>
getListaMensa()
rra!"ist< String>
getMiseguidores(String usuario)
rra!"ist< String>
getPendientes(String usuario)
rra!"ist< String>
listaLogeados()
rra!"ist< String>
listarUsuarios()
#ensaje loginistema (String usuario$ String contrasena)
#ensaje registrarBD (String nic&name$ String nombre$ String mail$
String password) void res#aldarBD ()
#ensaje saliristema (String nombre)
void setEstado (String usuario)
ServicioGestor#mpl #ensaje
addeguidor(String sigue$ String sigue)
void borrarPend (String usuario)
#ensaje borrareguidor (String sigue$ String sigue)
void en!iarTrino (rino trino)
rra!"ist< misMensa(esPend (String usuario) String> void registroCallback (String usuario$
Callbac&'suarioInterace objCallbac&)
%btenerNickPro#ietario ()
long %btenerTimestam# ()
String %btenerTrino ()
String totring ()
suario static void
de(ardeeguir()
static void
entrar ()
static void
en!iarTrino()
static void
e$it ()
static void
informacion()
static void
log%ff ()
static void
main(String[] args)
static void
registrar()
static void
salir()
static void
seguirUsuario()
static void usuariosistema ()