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.
(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:
La implementación del programa servidor sigue las siguientes ideas:
- Se inicia el servidor
- El servidor se mantiene escuchando cualquier petición de un cliente para conectarse.
- El servidor acepta al cliente.
- El servidor lanza un hilo de comunicación con el cliente.
- Por el hilo se envían y reciben mensajes a través del servidor entre todos los clientes.
- 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:
- Se inicia el cliente
- El cliente lanza una petición al servidor para conectarse
- El servidor asigna un hilo al cliente al ser aceptado.
- 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:
- Inicie el IDE Netbeans
- Abra el proyecto
- Ejecute la el archivo servidor.java
- Ejecute cuantas veces desee el archivo VentCliente.java
- Ingrese “localhost” si los clientes se ejecutan sobre una misma PC.
- Ingrese un nick, con el que sera identificado.
- En la ventana que le aparece Ud. podrá conversar con todos a la vez.
- Para conversar en privado con un solo contacto, elija en la lista de contactos a un usuario y luego pulse el botón privado.
- A continuación le aparecerá una ventana mas pequeña en la que podrá comunicarse solo con su contacto.
- Para salir simplemente cierre la ventana y el cliente se desconectará automáticamente.
Aqui dejo los link para que prueben este proyecto:









Hola:
Felicitaciones! – Es un excelente aporte para las personas que se inician en comunicaciones y manejo de hilos.
Carlos
me hiciste el proyecto final muchisisssimas gracias
gracias por el codigo
no me servio de nada
buenisimo loco
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
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
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
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)
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
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
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
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
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
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
. mi correo le recuerdo es jhony8306@hotmail.com.
PD: EL TRABAJO ES PARA ESTE SABADO. :d
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
Hola!!!
Gracias por tu pronta respuesta, ahora tengo poco mas claro como implementarlo a mi proyecto, gracias…. ;o)
hola, entendi bien el codigo pero quisiera saber como puedo implementar este chat para conectarse con una camara web, espero tu respuesta, saludos
.
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
hola, es un magnifico trabajo felicitaciones
Hola disculpen sera que alguno sabe donde puedo encontrar el algoritmo de peterson? es el se utiliza para la ejecucion de varios procesos….
Gracias…
hola, una pregunta como puedo enviar la respuesta del servidor al mismo cliente que envio la solicitud? gracias….
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
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…
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.
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
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
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
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 )
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
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)
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
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?
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
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.
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
Me gustaria contribuir a mejorar el programa, me lo podrias mandar a mi correo, me pareció muy interesante
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
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.
Que gran ayuda para mi poryecto final muchas gracias lo probe y si funciona. De verdad muchas gracias
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
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.
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.
LEER ANTES DE POSTEAR!!!