Chat |
||||||
Archivos necesarios: |
||||||
En este trial vamos a utilizar todos nuestros conocimientos para armar un servidor que esuche a varios clientes, y maneje las conexiones con todos, mandando los mensajes que reciba. Vamos a utilizar estructuras de datos como el Vector, vamos a utilizar un Thread para manejar paralelismo y vamos a utilizar el paquete java.net que incluye mucha funcionalidad para redes. El archivo de ejemplo que vamos a utilizar contiene cinco clases, las dos más importantes son ChatClient y ChatServer que son el cliente y el servidor que se van a comunicar en nuestra aplicación. Para dar soporte a algunas funciones de estos dos están la clase ChatClientListener que se encarga de oir cuando llega un mensaje y ChatServerThread que maneja un hilo de ejecución (es decir, una conexión) al servidor. |
|
|||||
¿Qué es TCP/IP, qué es un Socket? |
||||||
Para poder agregar la conexión debemos utilizar un Socket. Un Socket consta de dos partes, la primera es la dirección de internet y la segunda es el puerto al que se va a conectar. Esto es muy importante para nuestro programa de chat ya que el servidor debe escuchar en un puerto y el cliente debe conectarse a ese mismo puerto. Ya que sabemos esto son necesarias dos cosas, primero que nada tenemos que hacer que el servidor abra un puerto en la computadora a la que se pueden conectar los clientes y segundo, que los clientes se conecten a ese puerto. TCP/IP es un protocolo (un conjunto de reglas que nos dicen cómo mandar mensajes). Utilizando TCP podemos mandar mensajes seguros, es decir, que estemos seguros que llegaron a su destino final. |
||||||
Cliente |
||||||
![]() |
Para crear un Socket en el cliente debemos utilizar el constructor que recibe como parámetros un String que representa el Host y un int que representa el puerto. Una vez que hayamos creado el Socket podemos utilizar los métodos getInputStream() y getOutputStream() para leer y mandar streams por medio de ese Socket. | |||||
| Una vez que ya tenemos los manejadores de streams podemos utilizar sus métodos para mandar y recibir mensajes del servidor. Utilizando el método println() del objeto PrintWriter mandamos el mensaje pasado como parámetro al servidor, con el método readLine() del objeto BufferedReader podemos leer cosas del servidor. Tambíen podemos utilizar isReady() para saber si hay algo que leer antes de leerlo (para evitar que el programa se quede esperando por siempre). | ![]() |
|||||
Servidor |
||||||
![]() |
En el servidor tenemos que crear un SeverSocket que es el encargado de manejar las conexiones. El constructor del ServerSocket recibe únicamente el puerto en el que debe escuchar como parámetro. | |||||
Una vez que hayamos creado el ServerSocket debemos utilizar el método accept() para aceptar una conexión. El método accept() va a poner a nuestro servidor a esperar una conexión y se va a detener ahí hasta que se haya conectado con algun cliente, una vez que suceda esto va a devolvernos un Socket que podemos utilizar para comunicarnos con el cliente utilizando los streams como lo vimos antes. Con esto ya logramos hacer que un cliente se conecte al servidor y podemos utilizar los métodos println() y readLine() para mandar mensajes entre el cliente y el serivdor. |
||||||
¿No que muy difícil? |
||||||
| Bueno, hasta ahora no se ha puesto difícil porque no hemos tomado en cuenta un detalle importante, no hemos manejado mas que un solo cliente. Para poder manejar muchos clientes vamos a tomar en cuenta el siguiente caso de ejemplo: | ||||||
Una vez que abrimos nuestro Socket el sevidor nos va a contestar y vamos a inicar una conexión (1). Al iniciar la sesión el servidor tiene que decirle a alguien que se encargue del cliente, porque el mismo servidor no puede ya que tiene que seguir escuchando si alguien se conecta. Esta clase encargada de administrar al cliente es ChatServerThread. Para entender un poco mejor qué es un Thread hay que pensar que un programa es algo similar a una soga. Tenemos varios hilos que van avanzando juntos, de vez en cuando podemos jalar alguno de esos hilos y hacerlo ejecutarse por su cuenta para que en caso de que el programa necesite detenerse (para abrir un archivo o para esperar alguna conexión) no se detenga todo el programa. |
![]() |
|||||
El ChatServerThread se va a encargar de atender a los clientes que están conectados escuchando cuando manden algún mensaje y reportandoselo al servidor. Ahora vamos a pensar que hay hay varios clientes conectados. Cada cliente debe poder realizar dos cosas, la primera es mandar mensajes (2) y la segunda es recibir mensajes (3). De la misma manera que el servidor no puede hacer nada más al mismo tiempo que escucha si hay conexiones, el clienteno puede hacer nada más al tiempo que escucha si hay mensajes. Resolvemos el problema de la misma manera que lo resolvimos hace un segundo, vamos a crear una clase que se encargue de escuchar si hay eventos y que corra en su propio Thread. |
||||||