Servicio de chat UDP – parte II

Parte II ChatServidor

La clase ChatServidor define la clase privada Conversación que se encarga de crear y mantener la lista FIFO y de proporcionar los métodos de acceso necesarios: InsertarMensaje y DameMensajes; ImprimeMensajes es un método útil para hacer seguimientos de funcionamiento de la clase.

La aplicación servidora del Chat se instancia en el método main, Toda la funcionalidad del servidor de Chat se implementa en su constructor; en primer lugar se definen sus propiedades: PUERTO_ORIGEN define el puerto que utiliza el servidor del Chat, mientras que PUERTO_DESTINO indica el puerto que utilizan los clientes que emplean el servicio. El resto de constantes definen el tamaño máximo de los mensajes, el número de mensajes que se almacenan, dos códigos que se utilizan para distinguir el tipo de los mensajes entrantes y, por ultimo, el tiempo que se espera la llegada de un mensaje (un timeout de cero significa tiempo de espera indefinido).

El núcleo del servidor se encuentra en el interior del bucle do while infinito. En primer lugar se espera indefinidamente (timeout a cero) a que recibaun mensaje; los mensajes pueden ser de 2 tipos

1. proporcionar texto a insertar en la lista FIFO (caracterizados en este ejemplo por contener un cero en el primer carácter del mensaje).

2. Solicitan el envio del contenido de la lista FIFO (caracterizados en este ejemplo por contener un uno en el primer carácter del mensaje)

Se aísla el primer carácter del mensaje, se consulta su contenido, si nos encontramos ante una petición de insercio de texto en la lista FIFO, se elimina el primer carácter(cero) del mensaje, se inserta el texto en la lista FIFO y se imprime el contenido por la consola del servidor del Chat.

Si el mensaje proveniente del cliente es del tipo “solicitud de envió de la lista FIFO”, se realizan las siguientes acciones:

· Inicialización de la variable MensajeAEnviar.

· Obtención de los mensajes contenidos en la lista FIFO, utilizando el método DameMensajes de los de la clase Conversación.

· Concatenación de todos los mensajes en la variable MensajesAEnviar, separados por un salto de linea “\n”.

· Determinación de la dirección IP del cliente.

· Envió del texto contenido en MensajeAEnviar al cliente que realizo la petición.

 

ChatServidor.java

public class ChatServidor {

ChatServidor() {

final int PUERTO_ORIGEN = 5002;

final int PUERTO_DESTINO = 5000;

final int TAMANIO_MENSAJE=40;

final int NUM_MENSAJES=10;

final char INSERTAR_FRASE=‘0’;

final char DEVOLVER_FRASES=‘1’;

final int TIMEOUT=0;

String MensajeRecibido, MensajeAEnviar,IPRemota;

String[] MensajesRecibidos;

char TipoMensaje;

int PuertoRemoto;

TRecibeUDP InstanciaRecibeUDP = new TRecibeUDP();

TEnviaUDP InstanciaEnviaUDP = new TEnviaUDP();

Conversacion ConversacionChat = new

Conversacion(NUM_MENSAJES);

do {

MensajeRecibido = InstanciaRecibeUDP.Recibe(PUERTO_ORIGEN,

TAMANIO_MENSAJE,TIMEOUT);

TipoMensaje = MensajeRecibido.charAt(0);

if (TipoMensaje==INSERTAR_FRASE) {

MensajeRecibido=MensajeRecibido.substring(1,

MensajeRecibido.length());

ConversacionChat.InsertarMensaje(MensajeRecibido);

System.out.println(“Se ha recibido el mensaje:

+MensajeRecibido);

} else { // (TipoMensaje==DEVOLVER_FRASE)

MensajeAEnviar=“”;

MensajesRecibidos=ConversacionChat.DameMensajes();

for (int i=0;i<NUM_MENSAJES;i++)

MensajeAEnviar = MensajeAEnviar+MensajesRecibidos[i]+“\n”;

IPRemota=InstanciaRecibeUDP.DameIPRemota();

InstanciaEnviaUDP.Envia(MensajeAEnviar,

TAMANIO_MENSAJE*NUM_MENSAJES,IPRemota,PUERTO_DESTINO);

}

} while (true);

}


public static void main(String[] args){

ChatServidor InstanciaChat = new ChatServidor();

}

private class Conversacion {

private String[] Mensajes;

private int NumMensajes;

Conversacion(int NumMensajes) {

Mensajes = new String[NumMensajes];

this.NumMensajes = NumMensajes;

for (int i=0;i<NumMensajes;i++)

Mensajes[i]=“”;

}

public void InsertarMensaje(String Mensaje) {

for (int i=NumMensajes-2;i!=-1;i–)

Mensajes[i+1]=Mensajes[i];

Mensajes[0] = Mensaje;

}

public String[] DameMensajes() {

return Mensajes;

}

public void ImprimeMensajes() {

for (int i=0;i<NumMensajes;i++)

System.out.println(Mensajes[i]);

System.out.println();

}

}

} // ChatServidor

Anuncios

About exequielc

Hola! Estás en el blog de Exequiel Catalani. Como es un blog, se trata de una extensión más o menos lineal de las cosas que hago y pasan por mi cabeza: ciberculturas, videos de la red, nuevos medios y tecnologia, y Programacion etc...

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

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

A %d blogueros les gusta esto: