AWT

1. (CHAT) Como ejercicio en este tema vamos a desarrollar una aplicación visual para  un chat. El motor de chat se hizo ya en el tema anterior, cuando se vio la comunicación por red y la entrada / salida. Aquí tenéis un ejemplo de motor hecho, por si no os dio tiempo a terminar el vuestro.

Se tienen unos scripts (BAT para Windows, SH para Linux) para poder compilar y ejecutar el ejemplo. Sólo hay que colocarse en el directorio donde estén y ejecutar el comando apropiado.

compilar		(Windows)
. ./compilar.sh		(Linux)
servidor		(Windows)
. ./servidor.sh		(Linux)
cliente	<ip>		(Windows)
. ./cliente.sh <ip>	(Linux)

Ahora se trata de realizar un programa AplicChat para chatear en modo gráfico:

 

Tendrá 4 zonas al menos:

Se os proporciona un esqueleto de aplicación en el fichero AplicChat.java, que iremos modificando hasta obtener la aplicación completa. 

La clase sólo tiene el código para conectar a la dirección IP del servidor (sólo tiene los controles de la parte superior para conectar con la IP que se escriba en el cuadro de texto. Tendréis que modificar el código si utilizais vuestro propio motor de chat y es distinto al que se os da). 

Lo que haremos será construir el resto de la aplicación (lo que queda abajo). Todo el código lo tenéis que colocar en el método init(), puesto que luego en posteriores sesiones se convertirá esta aplicación en applet. Aparte podéis definir vuestros propios métodos si queréis (sin tocar el constructor ni el método main()).

Todo el sistema de comunicación cliente / servidor está hecho en el motor ejemplo, o en el ejercicio que se hizo en el tema anterior. Ahora simplemente hay que hacer que AplicChat haga lo mismo que el EjemploChat del ejemplo proporcionado.

a) Primero vamos a colocar los controles en la aplicación:

panelSup.setLayout(new GridLayout(3, 3));

Para colocar  las dos filas que faltan, basta con replicar el código para la línea de conexión que hay (cambiando los nombres de las variables a los que nos interese), y definir el evento correspondiente para cada botón:

Label lblIP = new Label ("IP Servidor:");
txtIP = new TextField();
panelSup.add(lblIP);
panelSup.add(txtIP);

Button btnConectar = new Button ("Conectar");
btnConectar.addActionListener(new ActionListener()
{
	public void actionPerformed(ActionEvent e)
	{
		...// Codigo que se necesite
	}
});
panelSup.add(btnConectar);
TextArea txtBuffer = new TextArea("", 5, 5, 
		     TextArea.SCROLLBARS_BOTH);
add(txtBuffer, BorderLayout.CENTER);
Panel panelInf = new Panel();
panelInf.setLayout(new GridLayout(2, 1));
		
TextField txtMensaje = new TextField();
panelInf.add(txtMensaje);
		
Button btnEnviar = new Button("Enviar");
btnEnviar.addActionListener(new ActionListener()
{
	public void actionPerformed(ActionEvent e)
	{
		... // Codigo que se necesite
	}
});
panelInf.add(btnEnviar);
		
add(panelInf, BorderLayout.SOUTH);		

b) Una vez tenemos todos los controles colocados (compilad y ejecutad para ver que se colocan como queríais), añadimos los eventos sobre los botones:

try {
	chat.registraUsuario(txtLogin.getText(), 
			     txtPassword.getText());
} catch(Exception ex) {
	txtBuffer.append("Error al registrar\n");
}

Le definimos un campo de tipo Thread (fuera del constructor):

Thread t = new Thread(this);

Finalmente, definimos el método run() que se encargará de ir tomando continuamente los datos del servidor. Podemos hacer que los saque al cuadro de texto central llamando al método append(...) del mismo, para no borrar el texto previo:

public void run() 
{		
   String msg = null;
   while((msg=chat.recibeMensaje())!=null) 
   {
	txtBuffer.append(msg + "\n");
   }
}

En el evento del botón validar sólo habrá que iniciar el hilo si se valida correctamente:

try {
   chat.loginUsuario(txtLogin.getText(), 
		     txtPassword.getText());
   t.start();
} catch(Exception ex) {
   txtBuffer.append("Error al validar\n");
}
chat.enviaMensaje(txtMensaje.getText());

Una vez esté todo colocado y compilado, a la hora de probarlo simplemente tenemos que ejecutar esta aplicación en lugar del EjemploChat o el programa ejemplo que estuviéramos utilizando. El servidor no cambia.

Para entregar: Debéis entregar un ZIP e3_1.zip con: