You are on page 1of 11

Actividad Aplicativa Colaborativa: Unidad 1

Mi taller de sockets e hilos en Java

Titulacin: Grado en Ingeniera Informtica Asignatura: Programacin Concurrente y de Tiempo Real

Madrid, e!rero de "#$"

Tabla de Contenidos
1 OBJETIVOS............................................................................................................................3 2 ENUNCIADO..........................................................................................................................3 3 DESARROLLO DE LA PRCTICA....................................................................................3 3.1 QUEOCURRE CUANDO VARIOS CLIENTES, AL MISMO TIEMPO, INTENTAN CONTACTAR CON EL SERVIDOR DE TIEMPO?...........................................................................................................3 3.2 SOLUCIONE EL PROBLEMA DEL PUNTO 3.1 Y OBTENGA UN CDIGO EN JAVA PARA QUE EL SERVIDOR GESTIONE PETICIONES DE CLIENTE SIMULTNEAS. COMENTE LA SOLUCIN PROPUESTA.................................................................................................................................4 3.3 REALICE UN PROGRAMA QUE PIDA AL USUARIO UNA RUTA Y UNA LISTA DE DIRECCIONES
EB Y LUEGO DESCARGUE EL TE!TO CONTENIDO EN CADA UNA DE LAS DIRECCIONES EB EN UN "IC#ERO DISTINTO $DENTRO DE LA RUTA%. LA DESCARGA DE TODAS LAS PA GINAS EB DEBE REALI&ARSE EN PARALELO................................................................................................'

4 ANEXO: CDIGO FUENTE.................................................................................................6 4.1 CDIGO "UENTE APARTADO 3.1...........................................................................................( 4.1.1 ClienteHora.java........................................................................................................7 4.1.2 ServidorHora.java......................................................................................................7 4.2 CDIGO "UENTE APARTADO 3.2...........................................................................................) 4.2.1 ClienteHora.java........................................................................................................9 4.2.2 ServidorHora.java....................................................................................................10 4.2.3 HiloCliente.java........................................................................................................11 4.3 CDIGO "UENTE APARTADO 3.3.........................................................................................11 4.3.1 DescargaTextoWeb.java...........................................................................................11

1 Objetivos
Interpretar el funcionamiento de los sockets e hilos en Java. Aplicar los conocimientos adquiridos a travs de la elaboracin de un programa. Probar el correcto funcionamiento del programa.

2 Enunciado
e proponen varias cuestiones ! e"ercicios pra#cticos que los estudiantes debera#n resolver$ entregando una pequen%a memoria donde vendra#n resueltos ! comentados. olo e&isten dos calificaciones posibles' Apto si se ha entregado esta memoria ! se han reali(ado de forma correcta los e"ercicios ! cuestiones ! )o *ntregado si no se han entregado. i se entregan pero e&isten errores$ el alumno sera# instado a repetir la memoria hasta que este# correcta. +, -.ue# ocurre cuando varios clientes$ al mismo tiempo$ intentan contactar con el servidor de tiempo/ 2, olucione el problema visto en el punto +$ obteniendo un co#digo en Java para el servidor ! comente la solucio#n propuesta 0en la memoria ha! que ad"untar el co#digo como parte de la solucio#n,.

1, 2ealice un programa que pida al usuario una lista de direcciones 3eb ! luego descargue el te&to contenido en cada una de las direcciones 3eb en un fichero distinto 0la ruta do#nde han de ir los ficheros tambie#n ha! que pedi#rsela al usuario,. 4a descarga de todas las pa#ginas 3eb debe reali(arse en paralelo. a. Como ayuda para la realizacion de este ejercicio, vease el Javadoc de la clase URL, que ofrece un metodo capaz de devolver un InputStream asociado a la cone ion con la URL.

3 Desarrollo de la prctica
3.1 Queocurre cuando varios clientes, al mismo tiempo, intentan contactar con el servidor de tiempo?
*n este apartado se ha utili(ado el cdigo 5liente6ora."ava !ver ane o ".#.#$ ! ervidor6ora."ava !ver ane o ".#.%$ para demostrar que ocurre cuando varios clientes intentan contactar de manera simult7nea con el servidor . - 5liente6ora' implementa la recepcin de informacin mediante socket al invocar el mtodo getInput tream0,. ervidor6ora."ava' o Implementa un servidor que acepta cone&iones mediante la clase erver ocket ! el mtodo accept0, o Adem7s$ reali(a el env8o de informacin mediante socket al invocar al mtodo get9utput tream0,. 1

Para comprobar que ocurre cuando varios clientes son e"ecutados al mismo tiempo hemos reali(ado la siguiente e"ecucin' +, *"ecutar ervidor6ora."ava 2, *"ecutar 5liente6ora."ava Al reali(ar la e"ecucin$ hemos comprobado como la llamada servidor.accept0, slo permite aceptar cone&iones de un cliente ! despus de haberlas gestionado es capa( de aceptar cone&iones de otro cliente. Pero$ de manera secuencial$ no de manera concurrente.

3.2 Solucione el problema del punto 3.1 y obtenga un cdigo en Java para que el servidor gestione peticiones de cliente simult neas. !omente la solucin propuesta.
*l ob"etivo de este apartado es reali(ar un servidor de socket que pueda atender a varios clientes a la ve(. Para ello$ vamos a dar al ervidor6ora la funcionalidad necesaria para que pueda crear un hilo por cada uno de los clientes que tiene que atender. A continuacin e&plicamos la solucin que hemos implementado. Clase ClienteHora 4a clase 5liente6ora se ha mantenido como estaba en el apartado anterior !a que para implementar una solucin que permita peticiones simult7neas$ es el servidor$ el que debe atender dichas peticiones. Por tanto$ la programacin de los clientes seguir7 siendo la misma ! los clientes estar7n solicitando la hora al servidor. 5liente6ora - :ragmento de cdigo representativo' 0ver cdigo en ane&o ;.2.+,

Clase ServidorHora y Clase HiloCliente *n la clase ervidor6ora hemos tenido que reali(ar una importante modificacin. 5omo coment7bamos al principio de este apartado$ para poder permitir peticiones de manera concurrente$ necesitamos crear un hilo por cada una de estas peticiones. <e esta manera$ ninguna tiene que esperar para ser atendida. Para llevarlo a cabo$ hemos creado la clase 6ilo5liente que implementa la interfa( runnable ! permite la creacin de hilos. <esde la clase ervidor6ora seguiremos creando un servidor que atienda peticiones$ pero en ve( de atender las peticiones desde el servidor$ crearemos hilos de la clase 6ilo5liente para que sea dentro del hilo donde se env8e el cliente la informacin solicitada. *n nuestro caso$ se le enviar7 al cliente la hora actual. A continuacin incluimos los fragmentos de cdigo m7s representativos de ambas clases' ;

ervidor6ora - :ragmento de cdigo representativo' 0ver cdigo en ane&o ;.2.2,

6ilo5liente - :ragmento de cdigo representativo' 0ver cdigo en ane&o ;.2.1,

TEST1: Prueba de la concurrencia de clientes Para comprobar que se ha reali(ado correctamente lo concurrencia de peticiones$ se van a mostrar las salidas que nos ha dado el programa por consola. *n estas salidas se puede comprobar el PI< inicial del servidor ! el PI< de los hilos que se han creado conforme hemos e"ecutado peticiones de cliente. Paso +' Iniciali(amos ervidor6ora'

Paso 2' 4an(amos varias peticiones simult7neas 5liente6ora ! el servidor crea tantos hilos como necesita'

Paso 1' 5liente recibe la respuesta del hilo !&ostramos la salida de una de las ejecuciones de la clase Cliente'ora$ =

TEST2: Prueba de la concurrencia de clientes <espus de reali(ar el >* >+ que consist8a en ir pulsando ?2un@ desde eclipse para ir e"ecutando varios clientes simult7neos$ hemos planteado implementar un bucle for de = iteraciones en el cliente para que la concurrencia fuera m7s visual. *ste es el resultado' alida ervidor6ora'

alida 5liente6ora'

3.3 "ealice un programa que pida al usuario una ruta y una lista de direcciones #eb y luego descargue el te$to contenido en cada una de las direcciones #eb en un %ic&ero distinto '(entro de la ruta). *a descarga de todas las paginas #eb debe reali+arse en paralelo.
*&plicar la solucin propuesta e incluir el cdigo en el ane&o

4 Anexo: Cdigo uente

,.1 !digo %uente apartado 3.1


4.1.1 ClienteHora.java
BC C 5liente6ora."ava C Autores' 5arlos Dorales Eecerra ! Andres vargas Eeato CB package clienteF import "ava.io.Euffered2eaderF import "ava.io.I9*&ceptionF import "ava.io.Input treamF import "ava.io.Input tream2eaderF import "ava.net. ocketF import "ava.net.Gnkno3n6ost*&ceptionF import servidor. ervidor6oraF public class 5liente6ora H public static void main0 tringIJ args, H ocket sF tr! H !stem.out.println0K5liente solicita horaK,F BB5reamos un nuevo socket para conectarnos al servidor s L ne3 ocket0K+2M.N.N.+K$ ervidor6ora.puerto,F BB5reamos una variable Input tream donde recibiremos la informacin del servidor Input tream entrada L s.getInput tream0,F BBA partir del inputstream creamos un buffer de lectura que almacenar7 la informacin recibida Euffered2eader lector L ne3 Euffered2eader 0ne3 Input tream2eader0entrada,,F BBDostramos por pantalla el contenido del buffer$ en nuestro caso la hora. !stem.out.println0lector.read4ine0,,F BB5erramos el socket s.close0,F O catch 0Gnkno3n6ost*&ception e, H e.print tack>race0,F O catch 0I9*&ception e, H e.print tack>race0,F O O O

4.1.2 ServidorHora.java
package servidorF import "ava.io.I9*&ceptionF M

import "ava.io.PrintPriterF import "ava.net. erver ocketF import "ava.net. ocketF import "ava.te&t.<ate:ormatF import "ava.util.<ateF import "ava.util.Qregorian5alendarF public class ervidor6ora H public static final int puerto L RMRMF private static tring dar6ora0,H Qregorian5alendar calendario L ne3 Qregorian5alendar0,F <ate date L calendario.get>ime0,F <ate:ormat hora L <ate:ormat.get>imeInstance0<ate:ormat. 692>,F return hora.format0date,F O BCC C Sparam args CB public static void main0 tringIJ args, H erver ocket servidorF tr! H BB5reamos un servidor de socket para atender peticiones servidor L ne3 erver ocket 0puerto,F !stem.out.println0K ervidor esperando...K,F 3hile 0true,H BB*speramos a recibir ! aceptar alguna peticin ocket au& L servidor.accept0,F BCA partir del mtodo get9utput tream creamos un PrintPriter que nos servir7 para enviar informacinCB PrintPriter escritor L ne3 PrintPriter0au&.get9utput tream0,,F BB*nviamos la informacin de la hora actual escritor.println0dar6ora0,,F BB5erramos el printPriter escritor.close0,F BB5erramos el socket au&.close0,F O O catch 0I9*&ception e, H BB >9<9 Auto-generated catch block e.print tack>race0,F O O O T

,.2 !digo %uente apartado 3.2


4.2.1 ClienteHora.java
package clienteF import "ava.io.Euffered2eaderF import "ava.io.I9*&ceptionF import "ava.io.Input treamF import "ava.io.Input tream2eaderF import "ava.net. ocketF import "ava.net.Gnkno3n6ost*&ceptionF import servidor. ervidor6oraF public class 5liente6ora H BCC C Sparam args CB public static void main0 tringIJ args, H ocket sF tr! H for 0int i L NF iU=FiVV,H !stem.out.println0K5liente solicita horaK,F BB5reamos un nuevo socket para conectarnos al servidor s L ne3 ocket0K+2M.N.N.+K$ ervidor6ora.puerto,F BB5reamos una variable Input tream donde recibiremos la informacin del servidor Input tream entrada L s.getInput tream0,F !stem.out.println0K5liente lee la hora enviada por el servidorK,F BBA partir del inputstream creamos un buffer de lectura que almacenar7 la informacin recibida Euffered2eader lector L ne3 Euffered2eader 0ne3 Input tream2eader0entrada,,F BBDostramos por pantalla el contenido del buffer$ en nuestro caso la hora. !stem.out.println0K on las' KVlector.read4ine0,,F BB5erramos el socket s.close0,F O O catch 0Gnkno3n6ost*&ception e, H e.print tack>race0,F O catch 0I9*&ception e, H e.print tack>race0,F O O O

4.2.2 ServidorHora.java
package servidorF import "ava.io.I9*&ceptionF import "ava.net. erver ocketF import "ava.net. ocketF import "ava.te&t.<ate:ormatF import "ava.util.<ateF import "ava.util.Qregorian5alendarF public class ervidor6ora H public static final int puerto L RMRMF public static tring dar6ora0,H Qregorian5alendar calendario L ne3 Qregorian5alendar0,F <ate date L calendario.get>ime0,F <ate:ormat hora L <ate:ormat.get>imeInstance0<ate:ormat.D*<IGD,F return hora.format0date,F O BCC C Sparam args CB public static void main0 tringIJ args, H !stem.out.println0KPI< ervidor' KV tring.value9f0>hread.current>hread0,.getId0,,,F erver ocket servidorF tr! H BB5reamos un servidor de socket para atender peticiones servidor L ne3 erver ocket 0puerto,F !stem.out.println0KIniciamos servidorK,F 3hile 0true,H BB*speramos a recibir ! aceptar alguna peticin !stem.out.println0K ervidor esperando cone&ionesK,F ocket au& L servidor.accept0,F !stem.out.println0K ervidor recibe cone&in ! crea nuevo hiloK,F >hread hilo L ne3 >hread0ne3 6ilo5liente0au&,,F hilo.start0,F O O catch 0I9*&ception e, H BB >9<9 Auto-generated catch block e.print tack>race0,F O O O +N

4.2.

HiloCliente.java

package servidorF import "ava.io.I9*&ceptionF import "ava.io.PrintPriterF import "ava.net. ocketF public class 6ilo5liente implements 2unnableH ocket socketF public 6ilo5liente0 ocket socket,H this.socket L socketF O S9verride public void run0, H PrintPriter escritorF tr! H !stem.out.println0KPI< 6ilo5liente' KV tring.value9f0>hread.current>hread0,.getId0,,,F BCA partir del mtodo get9utput tream creamos un PrintPriter que nos servir7 para enviar informacinCB escritor L ne3 PrintPriter0socket.get9utput tream0,,F BB*nviamos la informacin de la hora actual escritor.println0 ervidor6ora.dar6ora0,,F BB5erramos el printPriter escritor.close0,F O catch 0I9*&ception e, H e.print tack>race0,F O O O

,.3 !digo %uente apartado 3.3


4. .1 !escar"aTe#to$eb.java
Incluir cdigo

++

You might also like