ELO-330: Programación de Sistemas
Tarea 3: Recuento en Votaciones Electrónicas Sincrónicas

Objetivos: En esta tarea usted aplicará: Uso de hilos, manejo de zonas de acceso exclusivo, comunicación TCP y pruebas de escalabilidad.

Introducción:
La televisión digital que está emergiendo en muchos países del mundo viene acompañada de interactividad. La interactividad en los nuevos receptores de televisión es lograda a través de aplicaciones incrustadas en y difundidas junto al flujo digital que trae el vídeo y audio del canal sintonizado. Estas aplicaciones son descargadas en memoria del televisor y son ejecutas parar permitir la interacción con el usuario "televidente". Esta interacción puede ser local o remota. Cuando la interacción es local, el usuario interactúa con la aplicación que corre en el televisor o set-top-box usando su control remoto. Podemos verla en forma similar a una aplicación corriendo en un computador pequeño no conectado a Internet. Un ejemplo de estas aplicaciones es el juego de cartas "solitario" o una aplicación que muestre el pronóstico del tiempo. Usuarios con servicio de Internet, al conectar sus televisores a Internet podrán correr aplicaciones con interacción remota. Con este tipo de aplicaciones los "televidentes" podrán, por ejemplo, correr aplicaciones para votar por el cantante que mejor interpretó una canción, el artista con mejor show cómico, o decidir el rumbo que tomará la historia en desarrollo. Por ejemplo el televidente podría expresar su intención de voto por un candidato a alcalde en el contexto de un debate político en vivo. Esta respuesta puede ser acumulada en un servidor central y en tiempo real ser conocida por los televidentes del programa. Este es el contexto de la tarea que usted deberá desarrollar.

Problema: En aplicaciones con algún tipo de votación sincrónica de tiempo real, es decir la respuesta se requiere dentro de un tiempo, las aplicaciones interactivas generarán en forma sincrónica una gran demanda del servidor que acumula las respuestas. Exploraremos la capacidad de atención de consultas simultáneas provenientes de muchos clientes. Se pide así que usted desarrolle un servidor concurrente que acepte conexiones de "televisores", los cuales sólo enviarán un paquete con un número entero que representará el número de la opción seleccionada. El servidor irá acumulando la estadísticas de respuestas; es decir el número de preferencias de cada opción. Además de recibir las opciones de los usuarios (televidentes), el servidor enviará la estadística acumulada cada vez que un cliente monitor se conecte a un puerto específico.

Programas a desarrollar:
    $ acumulador <puerto_votación> <puerto_monitor>
    $ televisor <servidor_acumulador> <puerto_votación> <opción_seleccionada>
    $ monitor <servidor_acumulador> <puerto_monitor>
    $ testEsfuerzo <servidor_acumulador> <puerto_votación> <número_clientes_simulados>

acumulador es el servidor concurrente que acumula el número de preferencias por cada opción. Considere que la opción sólo puede adoptar un valor entre 0 y 5 inclusive. acumulador recibe conexiones de clientes (televisores) en puerto <puerto_votación>. Por esta conexión lee un número entero (que debe estar en el rango 0..5 y luego cierra la conexión. Por otro lado para cada cliente que se conecta al puerto <puerto_monitor> reporta una línea de texto con 6 enteros separados por espacios, para referirse al número de preferencias de cada opción, y cierra la conexión.

televisor sólo establece una conexión TCP con el acumulador ubicado en <servidor_acumulador> <puerto_votación> y envía un string que sólo contiene un número entero <opción _seleccionada> en el rango 0 a  5 inclusive. Luego cierra la conexión.

monitor permite consultar por el valor acumulado de las preferencias por cada opción. Una vez recibida la respuesta, éste muestra la estadística en la salida estándar y termina.

Finalmente testEsfuerzo es un programa que genera <número_clientes_simulados> de hebras. Cada hebra inicia una conexión con el servidor <servidor_acumulador> puerto <puerto_votación>, envía un número aleatorio entre 0..5, cierra la conexión y termina la hebra. TestEsfuerzo termina cuando todas las hebras han terminado.

Evaluación de la Tarea y qué entregar: revisar procedimiento de entrega y criterios usados para evaluar su trabajo.

Recomendaciones
* El servidor concurrente, acumulador, lo puede programar usando hebras o el llamado "select".
* Ante cualquier duda escríbame, estoy leyendo el correo cada noche, atenderé con gusto aclaraciones y sus consultas.

Comentarios: Para un canal nacional en Chile (16 millones de habitantes), no sería raro que el 1 % responda una encuesta en un programa de alta atracción, esto es 160 mil respuestas. Como el canal no puede esperar mucho, lo más probable es que un servidor no sea suficiente. En este caso la IP del televisor puede ingresar a una función hash y mapear la IP de un servidor de acumulación parcial, el cual puede reportar su resultado a uno central.