How to: Mini chat en Java (clase Servidor)

Buenas noches!!, en este tutorial lo que vamos a hacer es como crear un mini chat en Java, comunicandose un servidor con un cliente mediante sockets de flujo, debido a que quedara muy completo este tutorial, lo separare en  dos partes, en esta parte solo veremos la clase Servidor!. Para empezar veamos el siguiente video para ver que es lo que vamos a hacer!:

En el video se muestra que son diferentes OS y en difentes equipos, pero en una red LAN. En este tutorial solo  lo haremos con un solo cliente a la vez!, se tendria que aplicar multithread para hacerlo con x numero de clientes!, pero bueno comenzemos!.

Como establecer un servidor simple utilizando sockets de flujo

Para establecer un servidor simple en Java se requieren cinco pasos. El paso 1 es crear un objeto ServerSocket. Una llamada al constructor ServerSocket como:

ServerSocket servidor = new ServerSocket( numeroPuerto, longitudCola);

registra un numero de puerto TCP disponible y especifica el maximo numero de clientes que pueden esperar para conectarse al servidor (es decir, la longitud de la cola). El numero dep uerto es utilizado por los clientes para localizar la aplicacion servidor en el equipo servidor. A menudo, a estos se le conoce como punto de negociacion (handshake). Si la cola esta llena, el servidor rechaza las conexiones de los clientes. El constructor establece el puerto en donde el servidor espera las conexiones de los clientes; a este proceso se le conoce como enlazar el servidor al puerto. Cada cliente pedira conectarse con el servidor en este puerto.

Los programas que administran cada conexion cliente mediante un objeto Socket. En el paso 2, el servidor escucha indefinidamente para esperar a que un cliente trate de conectarse. Para escuchar una conexion de un cliente, el programa al metodo accept de ServerSocket, como se muestra a continuacion:

Socket conexion = servidor.accept();

esta instruccion devuelve un objeto Socket cuando se establece la conexion con un cliente. El objeto Socket permite al servidor interactuar con el cliente. Las interacciones con el cliente ocurren realmente en un puerto del servidor distinto al del punto de negociacion. De esta forma, el puerto especificado en el paso 1 puede utilizarse nuevamente en un servidor con subprocesamiento multiple, para aceptar otra conexion cliente.

El paso 3 es obtener los objetos OutputStream e InputStream que permiten al servidor comunicarse con el cliente, enviando y recibiendo bytes. El servidor envia informacion al cliente mediante un objeto OutpuStream y recibe informacion del cliente mediante un objeto InputStream. El servidor invoca al metodo getOutpuStream en el objeto Socket para obtener una referencia al objeto OutpuStream del objeto Socket, e invoca al metodo getInputStream en el objeto Socket para obtener una referencia al objeto InputStream del objeto Socket.
Los objetos flujo pueden utilizarse para enviar o recibir bytes individuales, o secuencias de bytes, mediante el metodo write de OutputStream y el metodo read de InputStream, respectivamente. A menudo es util enviar o recibir valores de tipos primitivos (como int y double) u objetos Serializable (como objetos String u otros tipos serializbles), en vez de enviar bytes.
En este caso podemos utilizar una tecnica para envolver otros tipos de flujos (como lo son ObjectOutputStream y ObjectInputStream) alrededor de los objetos OutputStream e InputStream asociados con el objeto Socket. Por ejemplo,

ObjectInputStream entrada= new ObjectInputStream( conexion.getInputStream() );

ObjectOutputStream salida= new ObjectOutputStream( conexion.getOutputStream() );

Lo mejor de establecer estas relaciones es que, cualquier cosa que escriba el servidor en el objeto ObjectOutputStream se enviara mediante el objeto OutputStream y estara disponible en el objeto InputStream del cliente, y cualquier cosa que el cliente escriba en su objeto OutputStream(mediante su correspondiente objeto ObjectOutputStream) estara disponible a traves del objeto InputStream del servidor. La transmision de los datos a traves de la red es un proceso transparente, y se maneja completamente mediante Java.

El paso 4 es la fase del procesamiento, en la cual el servidor y el cliente se comunican a traves de los objetos OutputStream e InputStream. En el paso 5, cuando se completa la transmision, el servidor cierra la conexion invocando el metodo close en los flujos y en el objeto Socket.

Para comenzar con la programacion, creamos un JFrame para usar el formulario de Netbeans, lo llamaremos Servidor.java, y el diseño que utilizaremos sera el siguiente,

Usamos un JTextArea que llamaremos areaPantalla , JTextField que llamaremos campoIntroducir y un JButton. Recuerden que para crear el servidor he comentado 5 pasos!, asi que antes de empezar con estos pasos primeros crearemos un metodo llamado “mostrarMensaje”, de una forma nada comun!, lo que hara el metodo es solo usar el metodo append de JTextArea para agregar texto, pero lo haremos de una forma para utilizar el subproceso despachador de eventos.

Antes de comenzar con los 5 pasos, primero vamos a importar todas estas librerias;

Y declarar lo siguiente

Paso 1: El paso 1 es crear un ServerSocket, con el numero del puerto y el maximo de cola de espera, para esto crearemos un metodo que se llamara “ejecutarServidor”, este metodo llamara a otros metodos que vamos a definir mas adelante, pero se los pondre como debe de estar!

Nuestro objeto servidor le estamos asignando que su puerto sera el 12345 y el numero de la cola de espera sera 100, los metodos esperarConexion, obtenerFlujos, procesarConexion y cerrarConexion(), los veremos mas delante.

Paso 2: El paso 2 es escuchar indefinidamente a que un cliente se conecte, este sera el metodo esperarConexion(), lo cual sera de la siguiente manera

Bueno en este metodo se utiliza el metodo accept de ServerSocket para esperar una conexion de un cliente. Al ocurrir una conexion, el objeto Socket resultante se asigna a conexion. El metodo accept realiza un bloqueo hasta que se reciba una conexion( es decir, un subproceso en el que se haga la llamada a accep detiene su ejecucion hasta que un cliente se conecte). En las lineas 64 y 65 se imprime en pantalla el nombre del equipo host que realizo la conexion. El metodo getInetAddress de Socket devuelve un objeto InetAddress ( paquete java.net ), el cual contiene informacion acerca del equipo cliente.

Paso 3: En este paso crearemos el metodo obtenerFlujos, que como ya vimos trabajaremos con OutputStream e InputStream, el metodo quedara de la siguiente manera!:

Este metodo obtiene las referencias a los flujos de Socket y los utiliza para inicializar un objeto ObjectOutputStream y ObjectInputStream, respectivamente. Observe la llamada al metodo flush de ObjectInputStream en la linea 72. Esta instruccion hace que el objeto ObjectOutputStream en el servidor envie un encabezado de flujo al objeto ObjectInputStream correspondiente del cliente. El enbabezado de flujo contiene informacion como la version de la serializacion de objetos que se va a utilizar para enviar los objetos. Esta informacion es requerida por el objeto ObjectInputStream, para que pueda prepararse para recibir estos objetos de manera correcta.

Antes de seguir con el paso 4, es importante que definamos otro metodo, que se llamara enviarDatos, lo que hara es escribir en las salidas ObjectOutputStream, y mandarlas al cliente

Paso 4: El paso 4 entrara en el metodo procesarConexion:

En este metodo se hace una llamada al metodo enviarDatos para enviar la cadena “SERVIDOR dice: Conexion exitosa” al cliente. El ciclo de las lineas 83-92 se ejecuta hasta que el servidor recibe el mensaje “CLIENTE dice: TERMINAR”. En la linea  87 se utiliza el metodo readObject de ObjectInputStream para leer un objeto String del cliente. En la linea 88 se invoca al metodo mostrarMensaje para anexar el mensaje al JTextArea.

Paso 5: Cuando termina la transmision, el metodo procesarConexion regresa y el programa llama al metodo cerrarConexion para cerrar los flujos asociados con el objeto Socket, y para cerrar tambien a ese objeto Socket, el metodo sera de la siguiente manera:

Despues, el servidor espera el siguiente intento de conexion por parte de un cliente, continuando con la linea 45 al principio del ciclo while. Para iniciar el servidor, creamos otra clase que se llamara IniciarServer.java, y solo instanciamos la clase Servidor y llamamos a su metodo ejecutarServidor():

La clase IniciarServer es la que ejecutaremos para iniciar el servidor, el JFrame Servidor, te crea un metodo main!, este si quieren lo podemos eliminar, ya que Servidor no sera ejecutada en si misma, si no sera llamada desde IniciarServer.

Esperen proximamente la segunda parte que crearemos la clase Cliente

Anuncios

7 comentarios sobre “How to: Mini chat en Java (clase Servidor)

  1. Buenísimo tu post, tengo que hacer algo similar, pero se tienen que comunicar 2 (o más) clientes y el servidor solo esta recibiendo las acciones que realizan dichos clientes. Saludos y gracias

  2. Hola que tal, muy bueno el tutorial .. mira necesrito algo parecido, pero con otro cliente osea en total 2 clientes que interactuen con el servidor (Chat) … como puedo agragarle otro cliente a tu aplicacion

    1. Hola! nunca he hecho eso y habia querido hacerlo con un numero indeterminado de clientes, tal vez lo intente en el transcurso de la semana y veremos si puedo publicar algo!, saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s