Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FSD ProyectoChat PDF
FSD ProyectoChat PDF
Chat en Java - 1
Tipo de entrega: por grupos de prácticas
Fecha límite: sesiones de laboratorio
Lugar: Atenea (nou campus)
Objetivos del proyecto:
• Crear y utilizar objetos
• Crear y utilizar variables y métodos de clases
• Utilizar try, catch y finally para detectar y manejar excepciones
• Implementar clientes y servidores en Java que se comuniquen entre sí utilizando
sockets
• Implementar un servidor con subprocesamiento múltiple
Resultados a entregar:
• Los resultados esperados de esta práctica es la carpeta del Workspace del Eclipse
que contiene los códigos de las aplicaciones. Coloca los códigos de cada sesión en un
package llamado Chat_X
Descripción de la aplicación
En este proyecto vamos a desarrollar una aplicación distribuida con arquitectura
cliente/servidor. La aplicación distribuida es un Chat que permite a los clientes darse de alta y
de baja en el Chat, enviar mensajes a todos los clientes en línea y pedir la lista de clientes en
línea.
Estudio Previo
1. Estudio de los apartados (“Sockets, Clients, and Servers”, y “Programming
Examples”) de la sección 10.4 (“Networking”) del libro “Introduction to Programming
Using Java Version 4.0, July 2002” de David J. Eck (en el apartado comentarios
tienes cómo acceder on-line al contenido del libro)
Nota:
Para compilar DateServer.java y DateClient.java necesitas la clase TextIO.class que
es una clase que no pertenece al SDK.
Coloca el código fuente de TextIO.java en el mismo package que el código
DateServer.java y DateClient.java para que puedas usar la clase TextIO.
La clase TextIO sólo se usa como clase de soporte (no es necesario que la entiendas
para realizar la práctica)
1
escribir datos en un socket y un objeto de la clase TextReader para leer datos de un
socket.
Nota:
Para compilar estos ejemplos sucede lo mismo que en los ejemplos del apartado
anterior (aquí necesitas la clase TextReader.class)
Coloca el código fuente de TextReader.java en el mismo package que el código de
CLChatClient.java y CLChatServer.java para que puedas compilar los ejemplos.
En el apartado comentarios tienes donde hay una explicación de esta clase y de sus
métodos.
6. Analiza el protocolo que utiliza el servidor de nuestro chat formado por las clases
ServidorChat.java y Cliente.java. Si programamos el cliente en una clase
ClienteChat.java, ¿Qué deberá enviar ClienteChat por el socket para registrarse?
(tráelo a la sesión de laboratorio en papel)
Comentarios
Introduction to Programming Using Java Version 4.0, July 2002
El libro “Introduction to Programming Using Java Version 4.0, July 2002” de David J. Eck
(eck@hws.edu) está accessible on-line desde http://www.faqs.org/docs/javap/index.html
También puedes bajarte el manual y los ejemplos en un archivo comprimido para “Windows”,
“Linux/UNIX and MacOS X” y “Linux/UNIX” ( apartado “Downloading Links” ) o sólo el manual
en un archivo pdf.
Clase TextReader
Se describe la clase y cómo usarla en la sección 10.1 (“Streams, Readers, and Writers”) del
manual Introduction to Programming Using Java Version 4.0, July 2002.
Sockets
2
Un socket es un punto final de una comunicación bidireccional entre 2 programas
ejecutándose en la red. Un socket se asocia a un número de puerto de forma que el
protocolo de la capa de transporte (en nuestro caso TCP) pueda identificar la aplicación a la
que están destinados los datos. Así, los sockets permiten crear la ilusión al programador de
que mandar/recibir datos por la red es algo similar a escribir/leer datos de un disco.
El servidor corre sobre una máquina y tiene un socket asociado a un puerto determinado, por
el que está esperando la petición de una conexión de un cliente.
La clase Socket implementa un lado de la conexión bidireccional entre dos aplicaciones Java
en la red. Permite crear conexiones de clientes con servidores. La clase ServerSocket
implementa el otro lado de la conexión bidireccional. En concreto permite crear un socket que
puede escuchar en un puerto y aceptar conexiones de clientes.
Ambas son implementaciones que ocultan los detalles de las plataformas concretas (hardware
y sistema operativo) donde se ejecutan las aplicaciones cliente y servidor.
Sesión de laboratorio
Ejercicio 1: sockets
De momento los comandos que soporta nuestra aplicación son conectarse al servidor y
desconectarse. Si el usuario introduce cualquier otro comando distinto se printará un mensaje
por pantalla informativo en la consola de ClienteChat y se pedirá al usuario que introduzca un
nuevo comando.
Utiliza a clase BufferedReader para leer de un socket. Utiliza la clase PrintWriter para escribir
en un socket. Utiliza la clase JOptionPane para introducir el nick del usuario y para leer los
comandos que introduce el usuario.
3
Chat en Java - 2
Estudio Previo
1. Estudio de los apartados (“ArrrayLists ”, y “Vectors”) de la sección 8.3 (“Dynamic
Arrays, ArrayLists, and Vectors”) del libro “Introduction to Programming Using Java
Version 4.0, July 2002” de David J. Eck (en el apartado comentarios tienes cómo
acceder on-line al contenido del libro)
2. Estudio del apartado (“The Special Variables this and super”) de la sección 5.5 (“this
and super”) del libro “Introduction to Programming Using Java Version 4.0, July
2002” de David J. Eck (en el apartado comentarios tienes cómo acceder on-line al
contenido del libro)
3. Programa una clase llamada MyClass (en un archivo MyClass.java) que tenga un
método llamado myMethod. El método myMethod imprime por pantalla el mensaje
“Soy un método de la clase MyElement”.
Programa una clase llamada CheckAL (en un archivo CheckAL.java) que almacene en
un objeto de la clase ArrayList objetos de la clase MyClass, recorra el ArrayList y
ejecute para cada elemento el método myMethod programado en la clase MyClass.
(tráelo a la sesión de laboratorio en papel)
Comentarios
Introduction to Programming Using Java Version 4.0, July 2002
El libro “Introduction to Programming Using Java Version 4.0, July 2002” de David J. Eck
(eck@hws.edu) está accessible on-line desde http://www.faqs.org/docs/javap/index.html
También puedes bajarte el manual y los ejemplos en un archivo comprimido para “Windows”,
“Linux/UNIX and MacOS X” y “Linux/UNIX” (apartado “Downloading Links” ) o sólo el manual
en un archivo pdf.
La clase Vector
Analiza este fragmento de código que crea un Vector de objetos, añade un objeto de la clase
Client al Vector y llama al atributo name de cada objeto Client que hay en el vector, sin
necesidad de conocer cuantos clientes hay en el vector (método size() de la clase Vector):
import java.util.* ;
Vector clients = new Vector();
Client cl =new Client();
clients.addElement(cl);
for (int i=0; i<clients.size();i++){
((Client)(clients.elementAt(i))).name;
}
clients.removeElement(cl);
clients.toString();
4
• La sentencia import java.util.*; permite utilizar todo lo que contiene el package
java.util de Java y la clase Vector se encuentra en ese package(similar al include de
C)
• El método element.At(i) devuelve una referencia que apunta al objeto que hay en la
posición i del objeto Vector sobre el que se aplica (en nuestro caso apunta un objeto
Client).
• Como los elementos de un Vector pertenecen por defecto a la clase padre más
genérica (Object) para acceder al atributo name de la clase Cliente hay que forzar la
conversión del tipo (como en C)
((Client)(clients.elementAt(i))).name;
Sesión de laboratorio
Ejercicio 2: La clase Vector
Vector clientList
Cada vez que un usuario se desconecta (comando CLOSE), se elimina el objeto que
representa a ese usuario del Vector clientList.
Comando SEND_CLIENT_LIST
El cliente envía SEND_CLIENT_LIST (‘:’) al servidor y recibe una línea por cada usuario
registrado en el servidor “< + el atributo name de ese cliente” más una línea
con “>” que indica fin de comando SEND_CLIENT_LIST (‘:’). Por ejemplo, si el servidor
tuviera dos clientes registrados “Pablo” y “Toñi”, se recibiría:
>Pablo
>Toñi
<
Los caracteres ‘>’ y ‘<’ los declaramos como constantes de tipo char llamadas
CLIENT_INFO y END_CLIENT_INFO .
5
a) Modifica el código de nuestra aplicación añadiendo el Vector clientList en la parte de
servidor (se declara e inicializa en ServidorChat y se pasa por parámetro cuando se crea un
objeto Cliente), actualizando el Vector clientList cada vez que un usuario se conecte
(comando REGISTER) o se desconecte (comando CLOSE) y programando el nuevo
comando en nuestro Chat (tanto en la parte de cliente como en la parte de servidor)
Como nuestro Chat sólo atiende a un ClienteChat (es secuencial), sólo permite un ClienteChat
conectado al Chat no podemos probar que SEND_CLIENT_LIST devuelva más de un name.
Nota: Existen varias formas de compartir la lista de usuarios. Una es utilizando el comando
‘static’ y otra es pasando una referencia del objeto ‘clientList’. Cualquiera de las dos formas
es valida.
Chat en Java - 3
Estudio Previo
1. Estudio del tutorial “Threads (Scheme)” de javaHispano.
2. Programa una clase llamada MyThread (en un archivo MyThread.java) que sume
enteros de 1 a 10.000 y una clase llamada Prueba (en un archivo Prueba.java) que
cree un thread y lo ponga en marcha (tráelo a la sesión de laboratorio en papel)
Comentarios
javaHispano
El web javaHispano (http://www.javahispano.org) mantiene noticias, manuales, tutoriales de
Java en castellano.
Threads
Los threads o hilos de ejecución son segmentos de código de un programa que se ejecutan
secuencialmente de modo independiente de otras partes del programa. Un proceso puede
estar constituido por uno o más threads. Un
thread esta compuesto por: una CPU virtual, el
código que ejecuta el procesador y los datos
sobre los que trabaja el código. Dos threads
comparten código si ejecutan código de objetos
que pertenecen a la misma clase
6
Los threads se utilizan para aislar y coordinar tareas. Sin el uso de threads hay aplicaciones
que son casi imposibles de programar:
• Las que consumen muchos recursos de CPU e impiden que el procesador atienda
simultáneamente otros eventos o peticiones del usuario (por ejemplo, un chat)
Java soporta la ejecución paralela de varios threads. Los threads en una misma máquina
virtual comparten recursos (por ejemplo memoria). Los threads en varias máquinas virtuales
necesitan mecanismos de comunicación para compartir información. Hay dos modos de
conseguir threads en Java:
El constructor de la clase Thread recibe un argumento que debe ser una instancia de una
clase que implementa la interface Runnable, implementando el método run().
public class ClienteThread implements Runnable {
// Atributos y métodos de la clase . . .
public void run(){
// código propio del thread
}
}
public class Test{
public static void main(String args[]){
ClienteThread r = new ClienteThread();
Thread t = new Thread(r);
t.start();
}
}
7
Sesión de laboratorio
Ejercicio 3: Threads-1
Tal como funciona nuestra aplicación en este momento para cada ClienteChat que se
conecta a ServidorChat se crea un objeto de la clase Cliente donde se almacena su nick
(name) y el socket asignado en tiempo de ejecución en la máquina servidor para comunicarse
con la máquina cliente (ClienteChat.java), etc.
Nota: Si dentro del método run() de un thread utilizas métodos que generan
excepciones, es necesario poner ese código dentro de un bloque try/catch
Chat en Java – 4
Estudio Previo
3. Estudio del ejemplo de uso de Threads “Ejemplo.java” (que te facilitamos junto
con el código y que también puedes encontrar en la documentación de Wikipedia).
4. Modifica el ejemplo para que muestre por pantalla el nombre del thread que se está
ejecutando.
5. Ejecuta el nuevo ejemplo varias veces, analízalo y describe cuándo cada uno de los
threads ejecutan código, si aunque no printen por pantalla tienen asignada la CPU,
qué printa por pantalla cada thread y si ambos threads finalizan cuando se ejecuta la
sentencia System.exit(0) (tráelo a la sesión de laboratorio en papel)
Comentarios
javaHispano
El web javaHispano (http://www.javahispano.org) mantiene noticias, manuales, tutoriales de
Java en castellano.
Sesión de laboratorio
Ejercicio 4: Threads-2
En este ejercicio vamos a añadir a nuestro chat que la parte de cliente sea capaz de leer del
socket y de leer de teclado concurrentemente (en un chat en cualquier momento alguien
8
puede enviarte un mensaje mientras estás escribiendo tú un nuevo mensaje o pudiendo un
nuevo comando al servidor).
Chat en Java – 5
Estudio Previo
1. Estudio de la clase String de la sección “4.2. Strings and Characters” del libro “Java in
a Nutshell, 4th Edition” de David Flanagan (en el apartado comentarios tienes cómo
acceder on-line al contenido del libro).
Nota: No es necesario para realizar la práctica estudiar ninguno de los
subapartados 4.2.X.
Comentarios
Java in a Nutshell, 4th Edition
Puedes consultar el libro tanto desde un PC conectado a la red de la UPC como desde fuera
de la UPC (en este caso debes configurar tu navegador tal y como explica el link “Accés
remot” http://bibliotecnica.upc.es/remot/)
9
Sesión de laboratorio
Ejercicio 5: La clase String
En este ejercicio vamos a añadir a nuestro chat nuevos comandos. Los comandos son los
siguientes:
mensaje
Este comando envía un mensaje a todos los usuarios conectados en este momento al
chat. El mensaje no debe empezar ni por el carácter del comando SEND_CLIENT_LIST
(‘:’), ni por el REGISTER (‘[’), ni por el CLOSE (‘]’), ni por el PRIVADO (‘/’, reservado
para un futuro comando) Este mensaje aparece en cada una de las pantallas de los
usuarios conectados y la pantalla del usuario conectado muestra:
nickOrigen: mensaje
/nickDestino mensaje
Este comando envía un mensaje privado al usuario cuyo nick equivale al nickDestino
especificado en el comando. Este mensaje únicamente aparece en la pantalla del usuario
que envía el mensaje y la pantalla del usuario destinatario muestra:
En este ejercicio se trata de mejorar la aplicación del chat que tenemos con algún o algunos
detalles que se te ocurran. Por ejemplo: que no se permita a un usuario registrarse con un
nick de un cliente ya registrado, añadir un nuevo comando, añadir interficie gráfica a nuestra
aplicación, etc…
10