lunes, 20 de julio de 2015

SOCKETS Y THREADS

SOCKETS

Los sockets son un mecanismo que nos permite establecer una acomunicación entre dos programas que se ejecutan independientes el uno del otro (generalmente un programa cliente y un programa servidor) Java por medio de la librería java.net nos provee dos clases: Socket para implementar la conexión desde el lado del cliente y ServerSocket que nos permitirá manipular la conexión desde el lado del servidor.


El servidor estará a la espera de una conexión, en cuanto el cliente inicie enviará un mensaje de petición al servidor, éste le responderá afirmativamente y una vez recibida la confirmación, el cliente enviará un par de mensajes y la conexión finalizará.


THREADS

En Java,  la principal estructura de ejecución de instrucciones es la estructura secuencial, en la que cada comando, cada línea, cada instrucción se ejecuta una después de otra.




En ocasiones puede que el usuario necesite llevar a cabo 2 o más procesos a la vez. Supongamos que queremos realizar 3 procesos al mismo tiempo, como el siguiente diagrama:

Como sabemo el procesador solo puede realizar una tarea a la vez, por o que no se puede tener un paralelismo entre los procesos ejecutandose, a menos que se tengan varios procesadores como tareas se requiera. Por eso se crearon los Threads, haciendo posible la multitarea nos permite ejecutar varios procesos a la vez; es decir, de forma concurrente y por tanto eso nos permite hacer programas que se ejecuten en menor tiempo y sean más eficientes. Con los hilos o threads, podemos obtener una ejecución lo más cercana posible al modelo de los 3 hilos que presenté arriba. Los threads son estructuras secuenciales que combinan las líneas de 2 o más procesos en un solo proceso.


SOCKET ECHO CLIENTE-SERVIDOR CONCURRENTE

Veremos una aplicación de la arquitectura servidor cliente, y la utilizacion de los hilos en java para eso crearemos 2 proyectos:
ConcurrentEcoServer: tiene las clases AppServidor y GestionClientes. 
ConcurrentEcoClient: tiene la clase AppCliente


Clase AppCliente

En la clase AppCliente lo que tenemos es el control de parametros de entrada, ya que los argumentos que recibe el cliente son el ip y el puerto a donde se va aconectar.



Luego se declaran las variables de entrada y de salida de datos por medio de las cuales se enviaran al servidor que esta escuchando las peticiones del cliente, cada que el cliente este mandando un mensaje el servidor lo repetira.



Se crea la conexión y el cliente pedirá el mensaje que va a enviar al servidor indefinidamente.



Cuando el cliente envie "salir" la conexion con el servidor se terminará y el servidor enviará un mensaje de confirmación, pero este seguirá escuchando mas peticiones.



Obviamente se trabajaran con excepciones.


Clase AppServidor

De la misma manera tenemos un control de parámetros de entrada, ya que el servidor tendrá que ingresar el puerto por donde va a escuchar.




Se crea el socket del servidor y se declara los parametros por donde el servidor va a recibir y enviar mensaje, con el acept() el servidor esta escuchando y luego creamos un objeto del tipo Thread que será nuestro nuevo hilo de ejecución y lo creamos con start().



Manejo de escepciones.


Clase GestionClientes

Esta clase hereda de la superclase Thread, el cual nos va a permitir crear hilos de ejecución. Primero tenemos como atributos un socket que será el del cliente que se conecte, el constructor inicializa al socket.



El metodo run es propio de la superclase y en ella se escriben las lineas de código que se ejecutará en el nuevo hilo de ejecución, asi cada vez que un cliente se conecte al servidor, este creará un hilo de ejecución para cada cliente, teniendo nuestro programa concurrente.




Manejo de escepciones.



Salida










Bibliografía

http://jarroba.com/multitarea-e-hilos-en-java-con-ejemplos-thread-runnable/
http://panamahitek.com/multiprocesos-en-java-como-usar-hilosthreads/
http://www.programarya.com/Cursos/Java-Avanzado/Sockets/