Chat en Java usando Hilos y Sockets

16 03 2008

Con la finalidad de aplicar nuestros conocimientos acerca de Modelos de Lenguajes de Programación, hemos desarrollado un Chat. La aplicación llamada JavaChat ha sido implementada en Java por ser este un lenguaje orientado a objetos,ademas por la facilidad para implementar Sockets e Hilos ,técnicas empleadas en este aplicación.
Ventana cliente

Ventana cliente

Ventana Privado

Ventana Privado

(Editado Marzo del 2009) Agradecería a las personas que han mejorado este proyecto y/o modificado enviarlo a mi correo electronico: valsrock@gmail.com . Espero sus mails .Salu2

Javachat: Idea del Proyecto
La implementación del programa servidor sigue las siguientes ideas:
  1. Se inicia el servidor
  2. El servidor se mantiene escuchando cualquier petición de un cliente para conectarse.
  3. El servidor acepta al cliente.
  4. El servidor lanza un hilo de comunicación con el cliente.
  5. Por el hilo se envían y reciben mensajes a través del servidor entre todos los clientes.
  6. Si el cliente cierra la comunicación el hilo se rompe y se corta la comunicación con ese cliente.
La implementación del programa cliente sigue las siguientes ideas:
  1. Se inicia el cliente
  2. El cliente lanza una petición al servidor para conectarse
  3. El servidor asigna un hilo al cliente al ser aceptado.
  4. El cliente envía y recibe mensajes por el hilo hacia todos o hacia algun usuario específico, usando al servidor como puente para las comunicaciones.
Para esto se ha empleado objetos de la clase ServerSocket y Socket para el servidor y cliente respectivamente que permiten la conexion entre cliente y servidor mientras que los Hilos sirven para hacer que el servidor se mantenga escuchando y no interrumpa su proceso mientras los clientes se comunican a traves de mensajes.A continuacion unas definiciones:
Sockets:Los sockets no son más que puntos o mecanismos de comunicación entre procesos que permiten que un proceso hable ( emita o reciba información ) con otro proceso incluso estando estos procesos en distintas máquinas. Esta característica de interconectividad entre máquinas hace que el concepto de socket nos sirva de gran utilidad.
Hilos: Un hilo es un flujo de ejecución de código, y mediante hilos, podemos hacer que nuestros programas aparentemente realicen varias tareas al mismo tiempo.Por ejemplo, un código podría interaccionar con el usuario mientras realiza tareas de segundo plano de gran consumo de tiempo.Los hilos separados realmente no se ejecutan al mismo tiempo(a menos que se tenga una maquina multiprocesador); en realidad cada hilo obtiene secuencias de tiempo del mismo procesador.Ayuda para la aplicación: Siga los siguientes pasos:
  1. Inicie el IDE Netbeans
  2. Abra el proyecto
  3. Ejecute la el archivo servidor.java
  4. Ejecute cuantas veces desee el archivo VentCliente.java
  5. Ingrese “localhost” si los clientes se ejecutan sobre una misma PC.
  6. Ingrese un nick, con el que sera identificado.
  7. En la ventana que le aparece Ud. podrá conversar con todos a la vez.
  8. Para conversar en privado con un solo contacto, elija en la lista de contactos a un usuario y luego pulse el botón privado.
  9. A continuación le aparecerá una ventana mas pequeña en la que podrá comunicarse solo con su contacto.
  10. Para salir simplemente cierre la ventana y el cliente se desconectará automáticamente.

Aqui dejo los link para que prueben este proyecto:


Acciones

Información

50 respuestas

2 07 2008
Carlos

Hola:

Felicitaciones! – Es un excelente aporte para las personas que se inician en comunicaciones y manejo de hilos.

Carlos

23 07 2008
pancho

me hiciste el proyecto final muchisisssimas gracias

25 08 2008
saul

gracias por el codigo
no me servio de nada

10 09 2008
pola

buenisimo loco

28 09 2008
ariverar

Hola buen aporte e interesante. Tengo una duda , q clase utilizo par medir el tiempo de conexion entre el cliente y el servidor . Responderme al correo albertriz_1@hotmail.com
gracias de antemano

17 11 2008
Jimmy

Buen material . no se si me puedas ayudar como se haria algo parecido a un netmeeting .. mostrar imagenes es decir capturo imagenes en el servidor y las envio y lasmuestro en el cliente automaticamente

Gracias

18 11 2008
Valsrock

Hola Jimmy gracias por visitar el blog.Con respecto a tu duda deberás saber que cada tarea que ejecutas es un hilo,si tu deseas ejecutar 2 o mas tareas a la vez a cada una de ellas deberás asignarle su propio hilo; en el caso de las imagenes se me ocurre crear una clase que administre las imagenes que se pasan,dentro de ella el socket establecerá una nueva conexion entre el servidor y el cliente y luego crea un hilo para que el server le pase la imagen al cliente , y luego eso de mostrar pues es muy sencillo ;) .Aun no lo implemento, pero eso es lo q se me ocurre :) .Salu2

19 11 2008
Nathalia

Hola!!!!!

Quisiera saber como podría aplicar este codigo para hacer un reproductor de musica en java, es decir es algo similar pero en lugar de enviar texto, un cliente envie el nombre de la cancion que desea que el servidor reproduzca.

Gracias…. ;o)

19 11 2008
Valsrock

Hola Nathalia gracias por visitar el blog. Para tu reproductor creo q deberias modificar el servidor, es decir seguir la misma dinámica del chat(leer informe adjunto) pero debería haber una clase que -se me ocurre- valide el nombre de las canciones ingresadas y acceda a reproducirlas; con respecto a los hilos no habría nada que modificar salvo que en vez de enviar los mensajes que tu escribes a otro usuario devolverlo al usuario que hace la peticion con un mensaje como:” reproduciendo cancion Maná” por ejemplo.Espero te pueda ayudar,si tienes dudas nos comentas. Salu2

19 11 2008
jhony

Bueno la verdad mas que para felicitarlos por este Excelente programa, me comunico con ustedes para que me hagan un favor, soy un estudiante de sistemas y no me identifico con la programación mas bien me identifico con la parte de redes y telemática, por esto acudo a ustedes ya que en la institución donde estudio nos colocaron un trabajo, y el cual consiste en realizar un programa muy parecido a este Chat, por esto me gustaría saber para que sirve cada método de cada clase del Chat que ustedes hicieron y como es su funcionamiento, muchas gracias por su atención.
Mi correo es jhony8306@hotmail.com
Y si algún día necesita de mi ayuda para algo de redes cuenten con migo. Gracias

20 11 2008
Valsrock

Saludos jhony, gracias por visitar el blog. Puedes ver el informe del javachat en

http://valsrock.files.wordpress.com/2008/03/informechat.pdf

ahi en ese link puedes ver las funciones que hay en el programa y para que sirven, tambien puedes leer

http://valsrock.wordpress.com/2008/03/16/chat-en-java-usando-hilos-y-sockets/

esa informacion para que sepas que es lo que incluye el
proyecto y como ejecutarlo. Salu2 amigo y tendremos en cuenta tu sugerencia .Esperamos tu critica y /o consultas.Hasta pronto.

PD: Agradeceriamos poner tus comentarios en el blog ya que una duda tuya la podemos compartir con los demás visitantes del blog y ayudaríamos a mas personas con la respuesta.Gracias

20 11 2008
jhony

hola, disculpen nuevamente por molestarlos, gracias por responderme, tengo una dudo, porque es nesesario de realizar 2 sockets para la coneccion, porque hay una entrada y dos salidas, en la parte del servidor? gracias. (y):p

20 11 2008
Valsrock

OK, tu duda me sirvió para recordar un poco.El servidor tiene 2 sockets porq cuando tu ejecutas el programa (primero servidor.java y luego cuantas veces desees VentCliente.java) la ventana del cliente tiene dos formas de comunicacion: una para chatear con todos los usuarios y otra para comunicarse con un usuario en privado;de ahi que se necesitan 2 sockets.

Espero haber respondido a tu duda.Salu2

20 11 2008
jhony

bueno gracias. sera que tienes msn de hotmail. para que podamos charlar bien, y no por este medio tan incomodo, la verdad viejo es que nesecito de su ayuda para el trbajo que le comente anteriormente. muchas gracias. y geracias por responderme a la cuestion de los 2 socket de los cliente, PERO MI DUDA ERA CON LOS SOCKET DEL LA CLASE SERVIDOR :P . mi correo le recuerdo es jhony8306@hotmail.com.

PD: EL TRABAJO ES PARA ESTE SABADO. :d

21 11 2008
Valsrock

Hola mi estimado amigo. Ya creo entender porq lado va tu duda; los clientes jamas se comunican entre si, sino que es el servidor el que tramita todos los mensajes, por ello lo de los 2 sockets: uno va para comunicarse con un cliente que chatea con todos los otros clientes y el otro socket para aquel cliente que se comunique con otro cliente en privado.Espero aclarar tus dudas.Salu2

21 11 2008
Nathalia

Hola!!!

Gracias por tu pronta respuesta, ahora tengo poco mas claro como implementarlo a mi proyecto, gracias…. ;o)

21 11 2008
christian

hola, entendi bien el codigo pero quisiera saber como puedo implementar este chat para conectarse con una camara web, espero tu respuesta, saludos ;) .

21 11 2008
Valsrock

Hola Christian gracias por visitar el blog.Tu proyecto es muy interesante.Para tu pregunta: recuerdas que hay 2 sockets? uno de ellos es para conversar en privado, pues la idea vendría a ser la misma, es decir crear un socket para las camaras web y posteriormente su hilo correspondiente.Cada funcion extra q tu desees darle va a requerir de un socket y de su hilo correspondiente, ya sea mandar texto, mandar fotos,etc.Lo unico que va a variar sera el modo en como lo presentes y la cantidad de usuarios involucrados.Espero haberte despejado tu duda.Salu2

1 12 2008
pool

hola, es un magnifico trabajo felicitaciones

6 12 2008
Daniela

Hola disculpen sera que alguno sabe donde puedo encontrar el algoritmo de peterson? es el se utiliza para la ejecucion de varios procesos….
Gracias…

14 01 2009
ale

hola, una pregunta como puedo enviar la respuesta del servidor al mismo cliente que envio la solicitud? gracias….

16 01 2009
Valsrock

Hola Ale gracias por visitar el blog.Con respecto a tu pregunta : De qué tipo de solicitud hablas??; porque puede ser una solicitud de conexion o simplemente una de envio de mensajes cunado el cliente esta ya conectado.

Para el primer caso puede usar el socket que une a ambos para inmediatamente darle una respeusta positiva o negativa. En el otro caso sería algo parecido pero sería mejor usar el vector de clientes conectados para encontrar el que deseas.Cualkier consulta nos comunicas y disculpa por la demora xD.Salu2

16 01 2009
ale

hola, tranquilo gracias, por contestar, mas bien lo que quiero es en viar un mensaje enviado desde un cliente al servidor, y que la respuesta del servidor, la vean todos los usuarios, osea que el servidor envie la misma respuesta para todos los usuarios al mismo tiempo…

17 01 2009
Valsrock

Hola nuevamente Ale, como te va,con respecto a tu duda lo que hace el programa es precisamente lo que tu deseas que haga ya que todo mensaje (si mal no recuerdo) de un cliente se envia al servidor y este redistribuye el mensaje a todos los clientes conectados,por eso q pueden hablar muchos clientes a la vez estilo chat; tambien tienes una conversacion privada(chat privado:boton “Privado”) en el que solo 2 clientes pueden habalr entre si sin que nadie mas lea los mensajes a la vez q éstos pueden comunicarse con los demas en la ventana del chat.

Nos mantenemos en contacto.Salu2

Pd: para mas dudas solo debes postear aqui y tambien leer las dudas y respuestas anteriores que te puedan servir.

17 01 2009
nathalia

hola como estas? queria aprovechar esta pregunta, para consultarte respecto a mi reproductor de musica, osea esto funcionaria igual? todos los usuarios escucharian la misma cancion al mismo tiempo, o tendrian que esperar mientras uno termina de escucharla para pasar al siguiente cliente? pues lo que pienso es que deberia hacer la llamada, al procedimiento que la reproduce, en la parte donde el servidor devuelve el mensaje, pero se presentaria el problema que te comente anteriormente, un usuario deberia esperar mientras se ejecuta el procedimiento para que el primero escuche la cancion y luego reproducir de nuevo la cancion… te agradezco en lo que me puedas ayudar, que estes bien…. ;o)

PD: para la reproduccion de la cancion estoy utilizando AudioPlayer

17 01 2009
Valsrock

Hola Nathalia, q bueno volver a saber de ti. Con respecto a tu duda te comento que reproducir audio es leer un fichero y ello implica que no puedes tener a dos aplicaciones leyendo el mismo afichero ,esto conlleva a pensar que solo podrías hacer q un usuario escuche la misma cancion a la vez.Sin embargo podrias hacer que el servidor lea la cancion(dado que es una aplicacion) y a la vez use los hilos para enviar la reproduccion a los clientes. Al final eso es lo que hacen todas las web de musica online con el famoso buffer.

Estimada Nathalia espero haberte ayudado. Cualkier duda nos la haces saber.Salu2

18 01 2009
nathalia

ummm disculpa pero no entendi muy bien lo del buffer =s… En realidad lo que estoy tratando de hacer es sacar un hilo para cada usuario desde el hilo del servidor, donde devuelvo el mensaje, que reproduzca la cancion mi problema es que el hilo nunca se detiene, para dar chance de crear otro para otro usuario… gracias por tu ayuda ;)

20 01 2009
Valsrock

Hola Nathalia,disculpa la demora los trabajos me tienen con el tiempo copado jeje.Con respecto a tu duda,creo q tu problema radica en como hacer que todos los usuarios puedan escuchar la cancion a la vez.Puedes tener varios hilos a la vez(la idea de hilos es ejecutar tareas de modo concurrente); por otro lado me refiero a buffer a lo mismo que hace una web q tiene musica online.El proceso a grandes razgos es el sgte: tu escojes tu cancion->el servidor abre el fichero que contiene la cancion->el servidor envia por bloques la cancion a la pc cliente-> el pc cliente recibe esos bloques y los almacena en memoria( o en un fiuchero temporal) y los empieza a reproducir.(Por eso que si te fijas bien en este tipo de webs primero se carga la cancion en tu ordenador y lñuego la reproduces;si la velocidad de tu internet es lenta vas a demorar mas en reproducir dicha cancion )

20 01 2009
Valsrock

Ahora si prefieres seguir con tu idea de que solo una cancion sea reproducida por un cliente a la vez pienso lo siguiente:

Debes crear un hilo solo para reproduccion de la cancion(a parte del que tiene el cliente con el servidor) reproduce la cancion y si hay otros clientes que desean escuchar la misma cancion mandalos a una cola de espera.Seguidamente al terminarse la cancion para un cliente cortar el hilo y asignar un hilo nuevo a la reproduccion de esa cancion con otro cliente.Si tienes dudas solo nos comentas ;) .Salu2

10 04 2009
NELSON

HOLA Q TAL ESTOY PROBANDO EL PROYECTO ME DA UNOS ERRORES
java.lang.UnsupportedClassVersionError: Cliente/VentCliente (Unsupported major.minor version 50.0)

at java.lang.ClassLoader.defineClass0(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:537)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)

at java.net.URLClassLoader.access$100(URLClassLoader.java:55)

at java.net.URLClassLoader$1.run(URLClassLoader.java:194)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:187)

at java.lang.ClassLoader.loadClass(ClassLoader.java:289)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)

at java.lang.ClassLoader.loadClass(ClassLoader.java:235)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)

Exception in thread “main”

Java Result: 1

debug:

BUILD SUCCESSFUL (total time: 2 seconds)

22 04 2009
Valsrock

Hola Nelson gracias por visitar el blog, los errores deben deberse a tu version de netbeans o en todo caso a la maquina de java, te indico que este proyecto fue hecho sobre netbeans 6.1 y sobre una maquna virtual jdk 6.u6 . Salu2

23 04 2009
Eduardo

hola ke tal, tu proyecto es muy bueno, pero tengo una duda, yo igual en mi universidad tengo que hacer un chat nadamas que el mio tienen que corer en linux y windows, es decir, que el servidor se ejecute en linux y el cliente en windows y viceversa? alguin me podria ayudar?

23 04 2009
Valsrock

Hola Eduardo,en la practica he corrido estas aplicaciones bajo windows incluso en computadoras diferentes bajo la misma red (wifi y ethernet) y ha funcionado bien. En teoria tambien deberia funcionar en Linux ya que Java es independiente de la plataforma, solo revisa que ambas pc tengan la misma version de jdk para que no haya problemas.Espero tus comentarios .Salu2

24 04 2009
Daniel

Hola!!!

Gracias por este proyecto, pero vea, a mí me corre perfecto en una máquina, pero lo que quiero es chatear de una máquina a otra. Cómo hago?

Agradecería enormemente su respuesta.

26 04 2009
Valsrock

Hola Daniel, gracias por visitar el blog.Lo unico que tienes que hacer para q te corra en maquinas diferentes es establecer la ip de la maquina en donde se arranca el servidor.Usualmente las ip dentro de la red son del rango 192.168.1.x .Repito, solo debes poner la ip de la maquina que tiene el servidor.Salu2

23 05 2009
William

Me gustaria contribuir a mejorar el programa, me lo podrias mandar a mi correo, me pareció muy interesante

23 05 2009
Elvira

Estoy realizando una aplicacion de cliente servidor, pero necesito saber el orden en el que entran los clientes, tienes alguna sugerencia de como podría hacerlo, me gustaria que me respondieras a mi correo. Gracias

23 05 2009
Valsrock

Para william: puedes descargarte la aplicacion desde la entrada del blog o haz click en esa direccion http://www.hotshare.net/file/46707-8172958461.html

Para Elvira: El servidor alamcena a los clientes en un vector de clientes y se van numerando conforme a su llegada. Puedes sacar de ahi la informacion que necesitas.

21 06 2009
Armin

Que gran ayuda para mi poryecto final muchas gracias lo probe y si funciona. De verdad muchas gracias

22 06 2009
Valsrock

De nada mi amigo, estamos para ayudar y compartir.

Por favor los comentarios deben ser escritos en el post correspondiente y no fuera de ellos.Salu2

10 07 2009
Ruben

Hola Valsrock, esoty embarcado en un proyecto que utiliza sockets para establecer la conexion asi que me descargue el programa para ver que tal iva todo. El programa me funciona muy bien cuando es por conecxion local pero cuando cambio localhost por la ip real de la maquina que corre el servidor simplemente me deja esperando y no hace nada mas.
No es problema del firewall por que uso linux y no tengo ningun cortafuego activado.

11 07 2009
Valsrock

Salu2 Ruben, este proyecto lo hice como hace 2 años, ya no recuerdo mucho jeje, pero si recuerdo que lo probe dentro de una misma red con una pc y una laptop , pero en windows xp, y corria muy bien. Por lo de linux en teoria no deberia haber problema por la maquina virtual de java pero te sugiero que revises la comunicacion. :)

11 07 2009
Valsrock

LEER ANTES DE POSTEAR!!!

15 07 2009
carlos

a les dejo mi correo es char_li13@hotmail.com

23 09 2009
JorgeDom

Hola Valsrock, ¿se podria pasar este proyecto a una aplicación web que utiliza un servidor de aplicaciones Glassfish?, es decir ejecutar el Servidor.java en el puerto por ejemplo: 9000, y “pasar” el codigo de “VentCliente.java” a unos Applets y de esta forma implementarlo en mi proyecto web (JSF). en realidad mi duda es que si ¿puedo ejecutar glassfish y al mismo tiempo el Servidor.java?, espero tu respuesta. Por lo demás es un excelente aporte y me ha ayudado a entender un poco mas esto de los sockets e hilos.

12 10 2009
Cristian

Buen dia!
He estado mirando el proyecto y los comentarios para ver en cuanto me facilitan el entendimiento de este, pero aun asi tube que recurrir a preguntar.
Para la U necesito un programa parecido a este, mejor dicho el mismo pero con mas cosas, por el momento quiero entender bien este. Estoy haciendo uno pero con las bases que me ha dado el profesor.
Mientras pasaba el programa me encuentro con que en la Clase threadServidor en los metodos enviaMsg(String mencli2), enviaMsg(String amigo, String mencli) y enviaUserActivos() se crea un objeto del mismo tipo de la clase( threadServidor user=null ) el mismo para los tres metodos, ¿Cual es el proposito de este objeto?.
En la parte donde le dice al vector —-clientesActivos.removeElement(this);—- al ponerle ese –this— que le esta proporcionando a la instruccion?.
Gracias de ante mano…

30 10 2009
PERRO CLLEJERO

GENIAL APORTE ACABAS DE HACER MI TAREA… GRACIAS.. SI PUDIESE TE PAGARIA POR TU APORTE….!!! SIGUE ASI.. ARRIBA PERU!!!

2 11 2009
kennynnek

Buenisimo!!!

16 11 2009
carl

Necesito algo un poco más sencillo, un par de ventanas en cliente y servidor, una ventana para escribir y otra para recibir (esto en ambos, tanto cliente como servidor), gracias por la ayuda.

17 11 2009
Valsrock

Sencillo mi amigo, modifica (por no decir solo quita) algunas partes a este codigo , si de algo te ayuda lo unico que debes hacer es redireccionar el jframe ,es decir que los mensajes de respuesta no vayan a la misma ventana sino a otra y listo. Pan comido .Salu2

Deja un comentario