Lección 09, parte b


Sockets


Los sockets permiten comunicacarse directamente desde una computadora cliente a un servidor. Para abrir un socket basta dar el nombre del servidor y el número del puerto de comunicación que se va a usar. Del socket se pueden obtener corrientes de entrada y salida con getInputStream() y getOutputStream() y a través de ellas se puede realizar la comunicación. La idea es muy sencilla pero es necesario tener un servidor con quien comunicarse y conocer los protocolos de comunicación o tener acceso como programador a un servidor. Incluimos aquí un ejemplo de un applet que usa un socket para enviar un e-mail. Para que el ejemplo funcione es necesario que esté Ud. conectado a Internet pues el applet no se puede comunicar más que con el servidor en el que se encuentra su código. Así que en este caso el applet se ha colocado en http://www.cimat.mx/~jlabreu/CursoJava/ para que pueda funcionar. Envíese Ud. mismo un mensaje. Compruebe que el invento funciona verificando el correo y recibiendo su mensaje. ejem09.emailApplet no sólo es un applet, también es ejecutable.

Nota: En general los servidores smtp no aceptan e-mail de cualquiera, así que tendrán que buscar alguno que sí lo acepte.. 

El applet está basado en una clase llamada Mail que se encarga de crear el socket, abrir las corrientes de entrada y salida, enviar la información, esperar la respuesta y cerrar las corrientes y el socket. Estudie cada uno de estos pasos en el código de la clase Mail.

Los mensajes que se envían en las primeras líneas son parte del protocolo SMTP para servidores de correo.

Aquí está el código del applet:

El segundo ejemplo de trabajo con Sockets es un sencillo programa de comunicación entre varios clientes a través de un servidor. Arranque el servidor en su computadora con la llamada

java ejem09.myServer

Abra otra ventana del DOS y arranque una copia del cliente con:

java ejem09.myClient login1 SERVIDOR

donde SERVIDOR debe ser el nombre de red su computadora.

Abra una o dos ventanas más del DOS y realice en abra en ellas otras copias de ejem09.myClient usando diferente login pero el mismo SERVIDOR.

Desde cualquiera de las ventanas se puede escribir una línea y dar intro. Al hacerlo en todas las ventanas de clientes aparecerá la línea indicando su procedencia. Este sistema puede entonces funcionar como un sencillo "chat". Este pequeño sistema funciona perfectamente en red y en internet, basta instalar el servidor ejem09.myServer en un servidor de internet y ejem09.myClient en los diferentes clientes y hacer las llamadas a dichos programas correctamente.

Estudie el código de myServer.java y myClient.java buscando especialmente cómo se abre el ServerSocket en myServer y los Sockets en myClient y cómo de los sockets se construyen Streams, Readers y Writers para realizar la comunicación. Preste también especial atención a los hilos del servidor y del cliente. Observer que dentro de myServer.java existe otra clase llamada myConnection que se usa para representar cada una de las conexiones de un cliente al servidor y hay otra clase llamada quiter que se encarga de cerrar el proceso y volver al DOS cuando en la ventana del servidor se da un intro o return.  Observe cómo el servidor lleva control de todos los clientes activos para enviarles (método broadcast)   los mensajes de cualquiera de ellos.

Por otro lado, myClient.java tiene también una clase llamada keyboardReader que se encarga de leer lo que el cliente escribe y enviarlo al servidor.

El estudiante debe estudiar este ejemplo con detenimiento. Se trata de un ejemplo sencillo pero completo de lo que se conoce como programa cliente-servidor. El uso de hilos, sockets y streams es imprescindible para lograr este tipo de comunicación.


Índice

Ejercicios de la Lección 09.


José Luis Abreu y Marta Oliveró