You are on page 1of 11

Java Fundamentals

Threads y Sockets
Objetivos:

Desarrollar aplicaciones que usen Thread y Sockets.

Temas: 7.1 Introduccin al desarrollo con Thread. 7.2 Aplicaciones con Thread. 7.3 Sockets Stream. 7.4 Crear el socket servidor. 7.5 Aceptar un cliente. 7.6 Leer y escribir datos del y al cliente.

CIBERTEC

Captulo 7

Java Fundamentals

7.1

Introduccin al desarrollo con Thread

Un thread es similar a un proceso real en el que un thread y un programa en ejecucin son un slo flujo secuencial de control. Sin embargo, un thread se considera un proceso de poco peso porque se ejecuta dentro del contexto de un programa completo y se aprovecha de los recursos asignados por ese programa y del entorno de ste. Como un flujo secuencial de control, un thread debe conseguir algunos de sus propios recursos dentro de un programa en ejecucin. (Debe tener su propia pila de ejecucin y contador de programa). El cdigo que se ejecuta dentro de un Thread trabaja slo en ste contexto.

Cuerpo del Thread Toda la accin tiene lugar en el cuerpo del thread, que es el mtodo run() del thread. Despus de crear e inicializar un thread, el sistema de ejecucin llama a su mtodo run(). El cdigo de este mtodo implementa el comportamiento para el que fue creado el thread. Es la razn de existir del thread. Frecuentemente, el mtodo run() de un thread es un bucle. Por ejemplo, un thread de animacin podra iterar a travs de un bucle y mostrar una serie de imgenes.

Estado de un Thread A lo largo de su vida, un thread tiene uno o varios estados. El estado de un thread indica qu est haciendo el thread y lo que es capaz de hacer durante su tiempo de vida: est en ejecucin?, est esperando? o est muerto?

La prioridad de un Thread Una prioridad del thread le dice al temporizador de threads de Java cuando se debe ejecutar este thread en relacin con otros threads.

7.2 Aplicaciones con Thread


Si tuvisemos que desarrollar aplicaciones que tengan procesos independientes que deben estar ejecutndose mientras la aplicacin esta atendiendo otros requerimientos, entonces, es all donde debemos programar un thread. Por ejemplo, podramos desarrollar una aplicacin para tomar un examen a los alumnos, pero en alguna esquina de su ventana le podemos mostrar un cronmetro, a fin de que este enterado cuanto tiempo le resta para terminar su examen.

Ejercicio N. 23
Para mostrar el uso de threads debe crear un proyecto y agregar a l un formulario con la siguiente presentacin:

CIBERTEC

Java Fundamentals

Entonces, programe una nueva clase Cronomentro que recibe un JLabel para actualizar el tiempo del examen y un JButton para cerrar la Ventana cuando el tiempo se acabo:

CIBERTEC

Java Fundamentals
En constructor del formulario debe instanciar e iniciar el Cronometro:

En el botn programe para cerrar la Ventana y terminar la aplicacin:

La aplicacin en ejecucin:

CIBERTEC

Java Fundamentals

7.3 Sockets Stream


Los sockets son puntos finales de enlaces de comunicaciones entre procesos. Los procesos los tratan como descriptores o apuntadores de archivos, de forma que se pueden intercambiar datos con otros procesos transmitiendo y recibiendo datos.

Sockets Stream (TCP, Transport Control Protocol) Son un servicio orientado a conexin donde los datos se transfieren en registros o bloques. El protocolo de comunicaciones con streams es un protocolo orientado a conexin, ya que para establecer una comunicacin utilizando el protocolo TCP, hay que establecer en primer lugar una conexin entre un par de sockets. Mientras uno de los sockets atiende peticiones de conexin (servidor), el otro solicita una conexin (cliente). Una vez que los dos sockets estn conectados, se pueden utilizar para transmitir datos en ambas direcciones. Por cortesa de Para Informticos en su libro Super Java 2 for Web, tenemos esta ilustracin sobre los pasos a seguir para el proceso de comunicacin con sockets:

PC Servidor

PC Cliente

Abrir canal de comunicacin


ServerSocket objServer

Abrir canal de comunicacin


Socket objCliente

Publicar en la Red el puerto del canal de comunicacin


objServer = new ServerSocket (puerto)

Queda en estado de espera


While / do / for

Atiende a clientes
objServer .accept()

Se conecta al Servidor
objCliente = new Socket (IP, puerto )

Crea proceso cliente


elCliente = objServer .accept()

Lee y enva datos


elCliente.read () / elCliente .write()

Enva y lee datos


objCliente .write() / objCliente .read()

Cierra canal el canal de comunicacin


objServer .close()

Cierra canal el canal de comunicacin


objCliente .close()

CIBERTEC

Java Fundamentals

7.4 Crear el socket servidor


Si estamos programando un servidor, la forma de apertura del socket es la que muestra el siguiente ejemplo: ServerSocket objServer; try { objServer = new ServerSocket( puerto ); } catch( IOException e ) { System.out.println( e ); }

Entonces a travs del puerto dado en el constructor del socket, esta estar atento a los flujos de datos que lleguen por l. El puerto puede ser el 8013, como usaremos en nuestro ejemplo posterior.

7.5 Aceptar un cliente


Si estamos programando un cliente, el socket se abre de la forma siguiente: Socket objCliente; objCliente = new Socket( IP, puerto );

Donde IP es el nmero IP de la mquina en donde estamos intentando abrir la conexin y puerto es el puerto a travs del cual nos queremos conectar. Cuando se selecciona un nmero de puerto, se debe tener en cuenta que los puertos en el rango 0-1023 estn reservados para usuarios con muchos privilegios (superusuarios o root). Estos puertos son los que utilizan los servicios estndar del sistema como email, ftp o http. Para las aplicaciones que se desarrollen, asegurarse de seleccionar un puerto por encima del 1023. En el ejemplo anterior no se usan excepciones; sin embargo, es una gran idea la captura de excepciones cuando se est trabajando con sockets. El mismo ejemplo quedara como: Socket objCliente; try { objCliente = new Socket(( IP, puerto ); } catch( IOException e ) { System.out.println( e ); }

CIBERTEC

Java Fundamentals

Luego de que ya tenemos el cliente, entonces por el lado del servidor, es decir para que el ServerSocket acepte un cliente, deber tener implementado el siguiente cdigo: Socket objCliente; try { objCliente = objServer.accept(); } catch( IOException e ) { System.out.println( e ); }

Mediante el mtodo accept() el servidor recoge la data del cliente como un arreglo de bytes.

7.6 Leer y escribir datos del y al cliente


Se puede utilizar la clase DataInputStream para crear un stream de entrada que est listo a recibir los mensajes enviados. DataInputStream entrada; try { entrada = new DataInputStream( objCliente.getInputStream() ); } catch( IOException e ) { System.out.println( e ); }

La clase DataInputStream permite la lectura de lneas de texto y tipos de datos primitivos de Java de un modo altamente portable; dispone de mtodos para leer todos esos tipos como: read(), readChar(), readInt(), readDouble() y readLine(). Deberemos utilizar la funcin que creamos necesaria dependiendo del tipo de dato que esperemos recibir del servidor.

Un stream de salida para enviar informacin puede ser utilizando la clase DataOutputStream: DataOutputStream salida; try { salida = new DataOutputStream( objCliente.getOutputStream() ); } catch( IOException e ) { System.out.println( e ); }

CIBERTEC

Java Fundamentals

La clase DataOutputStream permite escribir cualquiera de los tipos primitivos de Java, muchos de sus mtodos escriben un tipo de dato primitivo en el stream de salida. De todos esos mtodos, el ms til quizs sea writeBytes().

Ejercicio N. 24
Para mostrar el uso de sockets debe crear un proyecto, con el que podremos chatear con otros alumnos, por lo tanto, agregue un formulario con la siguiente presentacin:

Deber crear la clase SocketGet, que ser la clase servidora, es decir recepcionar los mensajes que lleguen a esta PC (donde se est ejecutando la aplicacin), su cdigo es el siguiente:

CIBERTEC

Java Fundamentals

Tambin, crear la clase SocketSend, que ser la clase que enva mensajes a otras PCs a travs del IP que se escoja. Su cdigo es el siguiente:

CIBERTEC

Java Fundamentals

10

Asimismo, en la clase del formulario (Ventana), crear 2 variables globales:

En el constructor de la clase del formulario (Ventana), instanciar e iniciar el socket servidor:

En el botn del formulario, para enviar los mensajes, digite el siguiente cdigo:

Finalmente, ejecute la aplicacin envindose un mensaje usted mismo, luego cambie el IP y envi otros mensajes a sus compaeros, pero asegurese que ellos tienen ejecutando la misma aplicacin en sus PCs.

CIBERTEC

Java Fundamentals

11

CIBERTEC

You might also like