Introducción
Hace tiempo creé una pequeña aplicación para chat, un cliente y un servidor.
Si bien ese chat funciona bien, no es escalable. Cada vez que se conecta un cliente, el servidor crea un hilo para gestionarlo. Si se conectan mil personas, se crean mil hilos. Como ya se darán cuenta, mediante esa forma de trabajar el consumo de CPU y memoria RAM se elevan mucho a medida que se conectan mas y mas personas.
Los hilos sirven, permiten hacer varias cosas a la vez sin que se bloquee al usuario, pero la verdad, para una aplicación chat no es recomendable.
Mirando la API de java NIO (New Input Output) mas algunos foros, blogs y tutoriales se puede ver que ésta permite hacer aplicaciones escalables con flujos de datos (Sockets, archivos, etc.). Esta API tiene una clase llamada Selector, la cual se encarga de manejar Sockets no bloqueantes que no son mas que canales para transmisión de flujos de datos.
NIO es una solución para aplicaciones escalables en java, no es necesario crear hilos para cada cliente y literalmente puede manejar miles de clientes con un bajo consumo de recursos.
El problema con NIO es que es de muy bajo nivel, lo único que puede viajar por la red son objetos de tipo ByteBuffer, pero que pasa cuando los datos que se quieren transmitir son de diferentes largos ? que pasa si me paso en el tamaño establecido por el buffer ? o si me sobra ? al ser de bajo nivel hay que gestionar demasiados casos, demasiados parámetros, como mencionaba es de bajo nivel. Y justamente este problema lo tuve al desarrollar un nuevo chat usando NIO. Cuando enviaba muchos emoticones el mensaje se perdía por el tema del buffer.
Los ejemplos en Internet abundan, pero los ejemplos decentes .... no encontré ni uno solo, solo se encuentran cosas como para enviar un par de palabras, nada que permita a un usuario hacer algo mas grande o mas normal como enviar texto mezclado con imágenes o url's.
Buscando algo que encapsulara y subiera de nivel a NIO llegué a un proyecto open source muy muy muy bueno, se llama XSocket. Esta es una API que encapsula a NIO encargándose de todo lo que es de bajo nivel permitiendo al desarrollador preocuparse por la implementación de lo que es importante (la lógica de la comunidad java) y no de los detalles (importantes) de bajo nivel.
Migré mi código inicial de NIO a XSocket y todo funcionó a la perfección.
Características
La aplicación que desarrollé soporta:
Hace tiempo creé una pequeña aplicación para chat, un cliente y un servidor.
Si bien ese chat funciona bien, no es escalable. Cada vez que se conecta un cliente, el servidor crea un hilo para gestionarlo. Si se conectan mil personas, se crean mil hilos. Como ya se darán cuenta, mediante esa forma de trabajar el consumo de CPU y memoria RAM se elevan mucho a medida que se conectan mas y mas personas.
Los hilos sirven, permiten hacer varias cosas a la vez sin que se bloquee al usuario, pero la verdad, para una aplicación chat no es recomendable.
Mirando la API de java NIO (New Input Output) mas algunos foros, blogs y tutoriales se puede ver que ésta permite hacer aplicaciones escalables con flujos de datos (Sockets, archivos, etc.). Esta API tiene una clase llamada Selector, la cual se encarga de manejar Sockets no bloqueantes que no son mas que canales para transmisión de flujos de datos.
NIO es una solución para aplicaciones escalables en java, no es necesario crear hilos para cada cliente y literalmente puede manejar miles de clientes con un bajo consumo de recursos.
El problema con NIO es que es de muy bajo nivel, lo único que puede viajar por la red son objetos de tipo ByteBuffer, pero que pasa cuando los datos que se quieren transmitir son de diferentes largos ? que pasa si me paso en el tamaño establecido por el buffer ? o si me sobra ? al ser de bajo nivel hay que gestionar demasiados casos, demasiados parámetros, como mencionaba es de bajo nivel. Y justamente este problema lo tuve al desarrollar un nuevo chat usando NIO. Cuando enviaba muchos emoticones el mensaje se perdía por el tema del buffer.
Los ejemplos en Internet abundan, pero los ejemplos decentes .... no encontré ni uno solo, solo se encuentran cosas como para enviar un par de palabras, nada que permita a un usuario hacer algo mas grande o mas normal como enviar texto mezclado con imágenes o url's.
Buscando algo que encapsulara y subiera de nivel a NIO llegué a un proyecto open source muy muy muy bueno, se llama XSocket. Esta es una API que encapsula a NIO encargándose de todo lo que es de bajo nivel permitiendo al desarrollador preocuparse por la implementación de lo que es importante (la lógica de la comunidad java) y no de los detalles (importantes) de bajo nivel.
Migré mi código inicial de NIO a XSocket y todo funcionó a la perfección.
Características
La aplicación que desarrollé soporta:
- Emoticones
- Color del texto cambiable
- Estados
- Mensaje personal
- Avatares
- URL's
- Chat global o general
- Chat privados
- Pestañas
- Multi usuario
Lo que no soporta este chat es envío de archivos, tal vez alguno de ustedes lo puede hacer y compartir con los demás, así hacemos un chat mas poderoso.
Mensajes
Los mensajes que se transmiten son texto con estructura XML, un mensaje podría tener la siguiente estructura:
Protocolo de mensajería
El protocolo de mensajería se basa en etiquetas o tags que definen ciertas características.
El tag tipo establece el tipo de mensaje que se transmite. Estos tipos tienen un valor entero y cada valor tiene su significado particular. A continuación se pueden ver los tipos y su significado:
El uso de una estructura XML permite crear un mensaje ordenado, donde cada parte esta bien definida y además se pueden agregar más sin cambiar o modificar lo ya hecho.
Mediante este esquema se pueden enviar mensajes con texto, emoticones y URL's, en cualquier orden y todo lo que se quiera. Se pueden enviar mensajes broadcast o unicast (multicast no está implementado pero el protocolo lo permite), se pueden usar nicknames, estados, mensajes personales, etc.
Funcionamiento interno
Formateando el mensaje
Para el funcionamiento interno se debe construir un mensaje con estructura XML a partir del texto que el usuario escriba en el chat. Para esto escribí una clase que se llama FiltroMensajeFormatoXML, el cual hace un parseo de la linea de texto y separa en texto, emoticones y URL's retornando un ArrayList con el contenido del mensaje pre-formateado. Los emoticones son imágenes, éstas imágenes son transformadas a texto codificándolas en Base64.
El texto a formatear puede ser el siguiente:
Una ves pre-formateado se crea un objeto de la clase MensajeFormatoXML, al cual se le pasa el contenido del mensaje, el tipo de mensaje y todos los datos que correspondan según el tipo de mensaje. Ésta clase tiene un método que crea un documento XML con toda la información ingresada al objeto y retorna un String con el mensaje construido y formateado.
El mensaje quedaria de ésta forma:
Una vez listo el mensaje está listo para ser enviado.
Conexión al servidor
Para conectarse al servidor del chat se crea una instancia de la clase NonBlockingConnection del API XSocket. Esta clase recibe el ip o hostname del servidor, el puerto y un manejador de la entrada de datos (una instancia de la clase IDataHandler).
Envío y recepción del mensaje
Para enviar un mensaje simplemente se utiliza la linea:
y el mensaje en formato de texto XML es enviado al servidor.
Cuando el servidor envía una respuesta, ésta es capturada en el objeto IDataHandler mediante el método onData, y se utiliza la siguiente línea para obtener el texto:
Luego se crea una instancia de la clase ParserMensajeXML que se encarga de crear un documento XML en memoria con el texto y luego se obtiene un objeto MensajeFormatoXML con el mensaje listo para ser leído utilizando los métodos GET definidos.
Utilización
Para utilizar el chat primero se debe ejecutar el servidor. Para esto simplemente se debe ejecutar en consola en cualquier Sistema Operativo que soporte Java:
o ejecutar en Linux
o en Windows (se debe renombrar el archivo run.bat.txt a run.bat)
Capturas de pantalla
Aquí dejo algunas capturas de pantalla mostrando la ejecución de la aplicación
Descarga !!!
Todo el código está muy bien comentado, así es que lo pueden leer, entender, aprender y modificar.
Esta aplicación, cliente y servidor, está bajo la licencia GPL V3.
Para ver el código y modificarlo deben usar NetBeans 6.5.
Aquí está el cliente y aquí está el servidor.
UPDATE 19-12-2008
He subido la versión 2.1 con los siguientes cambios:
Aquí está el cliente y aquí está el servidor.
Para descargar de los links anteriores se debe dar un click donde dice Request Download Ticket y luego Download (o Descargar).
UPDATE 26-04-2009
Hasta que consiga un repositorio que no me de problemas para compartir archivos, por favor dejarme sus correos en un comentario y les reboto el cliente y el servidor por esa vía. Blogger me avisa cuando me hacen comentarios y mi correo lo estoy viendo todo el día, por lo que no me demoraré mucho en responderles (probablemente dentro del mismo día les conteste).
UPDATE 18-08-2009
He creado un proyecto en Google Code así es que ahora pueden descargar el chat desde ahí sin tener que pedírmelo por correo o por el blog. Aún así agradeceré los comentarios que me puedan dejar en el blog.
El enlace es el siguiente: http://code.google.com/p/jtricahuenio/.
He realizado unos pequeños cambios desde la versión 2.1,la versión para descargar desde el enlace anterior es la 2.1.1:
Saludos !!!
Mensajes
Los mensajes que se transmiten son texto con estructura XML, un mensaje podría tener la siguiente estructura:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<raiz>
<tipo></tipo>
<remitente>metalklesk</remitente>
<avatar></avatar>
<color></color>
<mensaje>
<texto>Este es un ejemplo de texto junto a un emoticon</texto>
<emoticon></emoticon>
<texto>y al lado hay un link</texto>
<url>http://metalklesk.blogspot.com</url>
<texto>que se puede pinchar para abrirlo en un navegador web.</texto>
</mensaje>
<destinatario>
<usuario></usuario>
<usuario></usuario>
<usuario></usuario>
<usuario></usuario>
</destinatario>
</raiz>
Protocolo de mensajería
El protocolo de mensajería se basa en etiquetas o tags que definen ciertas características.
El tag tipo establece el tipo de mensaje que se transmite. Estos tipos tienen un valor entero y cada valor tiene su significado particular. A continuación se pueden ver los tipos y su significado:
-2: conexión aceptada desde el servidorMediante el establecimiento de tipos de mensajes, la gestión de los mismos se torna muy fácil, simplemente se lee el tipo de mensaje y se gestiona según corresponda.
-1: conexión rechazada desde el servidor, nickname ya está en uso
1 : aviso/petición de conexión
2 : mensaje broadcast (para todos)
3 : cliente ha cambiado de estado
4 : cliente ha cambiado de avatar
5 : cliente ha cambiado su mensaje personal
6 : mensaje unicast (solo para uno)
El uso de una estructura XML permite crear un mensaje ordenado, donde cada parte esta bien definida y además se pueden agregar más sin cambiar o modificar lo ya hecho.
Mediante este esquema se pueden enviar mensajes con texto, emoticones y URL's, en cualquier orden y todo lo que se quiera. Se pueden enviar mensajes broadcast o unicast (multicast no está implementado pero el protocolo lo permite), se pueden usar nicknames, estados, mensajes personales, etc.
Funcionamiento interno
Formateando el mensaje
Para el funcionamiento interno se debe construir un mensaje con estructura XML a partir del texto que el usuario escriba en el chat. Para esto escribí una clase que se llama FiltroMensajeFormatoXML, el cual hace un parseo de la linea de texto y separa en texto, emoticones y URL's retornando un ArrayList con el contenido del mensaje pre-formateado. Los emoticones son imágenes, éstas imágenes son transformadas a texto codificándolas en Base64.
El texto a formatear puede ser el siguiente:
Hola mundo! [emo]ohaha[/emo], visita mi blog [url]http://metalklesk.blogspot.com[/url]Y la salida pre formateada sería la siguiente
[texto]Hola mundo!
[emoticon](emoticon en texto)
[texto], visita mi blog
[url]http://metalklesk.blogspot.com
Una ves pre-formateado se crea un objeto de la clase MensajeFormatoXML, al cual se le pasa el contenido del mensaje, el tipo de mensaje y todos los datos que correspondan según el tipo de mensaje. Ésta clase tiene un método que crea un documento XML con toda la información ingresada al objeto y retorna un String con el mensaje construido y formateado.
El mensaje quedaria de ésta forma:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<raiz>
<tipo>2</tipo>
<remitente>metalklesk</remitente>
<avatar>imagen codificada en base 64</avatar>
<color>representacion del color como entero</color>
<mensaje>
<texto>Hola mundo! </texto>
<emoticon>imagen codificada en base 64</emoticon>
<texto>, visita mi blog</texto>
<url>http://metalklesk.blogspot.com</url>
</mensaje>
<destinatario>
</destinatario>
</raiz>
Una vez listo el mensaje está listo para ser enviado.
Conexión al servidor
Para conectarse al servidor del chat se crea una instancia de la clase NonBlockingConnection del API XSocket. Esta clase recibe el ip o hostname del servidor, el puerto y un manejador de la entrada de datos (una instancia de la clase IDataHandler).
Envío y recepción del mensaje
Para enviar un mensaje simplemente se utiliza la linea:
nbc.write(mensaje.getMensajeXML() + "\n", "UTF-8");
y el mensaje en formato de texto XML es enviado al servidor.
Cuando el servidor envía una respuesta, ésta es capturada en el objeto IDataHandler mediante el método onData, y se utiliza la siguiente línea para obtener el texto:
String res = nbc.readStringByDelimiter("\n", "UTF-8");
Luego se crea una instancia de la clase ParserMensajeXML que se encarga de crear un documento XML en memoria con el texto y luego se obtiene un objeto MensajeFormatoXML con el mensaje listo para ser leído utilizando los métodos GET definidos.
public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException,MaxReadSizeExceededException {
//aqui recibo el mensaje entrante
String res = nbc.readStringByDelimiter("\n", "UTF-8");
//aqui parseo el mensaje
ParserMensajeXML xml = new ParserMensajeXML(res);
//aqui obtengo el mensaje
MensajeFormatoXML mensaje = xml.getMensaje();
//aqui lo envio a todos los que están a la escucha del mensaje entrante.
RepetidorMensajeEntrante.getInstance().enviarMensaje(mensaje);
return true;
}
Lo demás del chat cliente es solo el manejo de la presentación del mensaje, eventos y algunas cosas entretenidas que no tienen nada que ver con la transmisión de datos por la red.Utilización
Para utilizar el chat primero se debe ejecutar el servidor. Para esto simplemente se debe ejecutar en consola en cualquier Sistema Operativo que soporte Java:
java -jar ServidorNIO.jar
o ejecutar en Linux
./run.sh
o en Windows (se debe renombrar el archivo run.bat.txt a run.bat)
./run.batNo olvidar que se debe tener instalada la máquina virtual de java, recomiendo la última versión a la fecha.
Capturas de pantalla
Aquí dejo algunas capturas de pantalla mostrando la ejecución de la aplicación
Descarga !!!
Todo el código está muy bien comentado, así es que lo pueden leer, entender, aprender y modificar.
Esta aplicación, cliente y servidor, está bajo la licencia GPL V3.
Para ver el código y modificarlo deben usar NetBeans 6.5.
Aquí está el cliente y aquí está el servidor.
UPDATE 19-12-2008
He subido la versión 2.1 con los siguientes cambios:
- Se corrige un error que unos amigos lectores avisaron mediante sus comentarios. El error se refiere a la creación (escritura) y lectura del archivo de configuración config.xml en la clase Configuracion.java. El error ocurre porque cuando se crea el archivo XML, la máquina virtual de java lo crea utilizando la codificación de caracteres por default del sistema operativo en el cual se ejecuta y al leer el archivo XML le especifiqué que el archivo estaba en UTF-8, lo cual no es cierto en el caso de Windows (en Linux ningún problema). La solución fue simplemente forzar la escritura del archivo en UTF-8.
- También agregué soporte para los temas (UI, User Interface) del proyecto substance.
- Actualicé XSocket a la versión 2.3.
- Agregué el soporte para enviar zumbidos en los mensajes privados (la ventana tiembla !!!).
- Eliminé código innecesario en el servidor y en el cliente (ahora son menos lineas de código).
Aquí está el cliente y aquí está el servidor.
Para descargar de los links anteriores se debe dar un click donde dice Request Download Ticket y luego Download (o Descargar).
UPDATE 26-04-2009
Hasta que consiga un repositorio que no me de problemas para compartir archivos, por favor dejarme sus correos en un comentario y les reboto el cliente y el servidor por esa vía. Blogger me avisa cuando me hacen comentarios y mi correo lo estoy viendo todo el día, por lo que no me demoraré mucho en responderles (probablemente dentro del mismo día les conteste).
UPDATE 18-08-2009
He creado un proyecto en Google Code así es que ahora pueden descargar el chat desde ahí sin tener que pedírmelo por correo o por el blog. Aún así agradeceré los comentarios que me puedan dejar en el blog.
El enlace es el siguiente: http://code.google.com/p/jtricahuenio/.
He realizado unos pequeños cambios desde la versión 2.1,la versión para descargar desde el enlace anterior es la 2.1.1:
- Actualicé xSocket a la versión 2.5.4.
- Agregué el proyecto Base64 para reemplazar la implementación de Sun para la codificación y decodificación de las imágenes (avatares y emoticones) en el chat, ahora funciona impecable con OpenJDK.
- Actualicé substance a la versión 5.2 agregando 3 nuevos themes (Dust, Dust Coffe y Twilight).
- El código fuente viene en un proyecto para NetBeans 6.7.1.
Saludos !!!
97 comentarios:
Te felicito , esta muy bueno el chat, gracias por liberar el codigo.
Ejecute el Servidor y luego, cuando trate de ejecutar el cliente me salio un " null exception", es posible que esto sea por que estoy usando la libreria xSocket2.3.jar ,ya que la 2.2 no la encontre para bajar y no estaba incorporada en el proyecto.
Muchas gracias por el aporte brindado.Saludos. El error que me sale es el siguiente: 14-dic-2008 16:43:51 org.modelo.logica.Configuracion
GRAVE: null
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8
xsocket2.2 está dentro de la carpeta lib que está dentro del proyecto netbeans, en el cliente y en el servidor.
El error puede deberse a que justamente usas versiones distintas de la bilbioteca xsocket.
saludos !!
Gracias . Agregue la libreria xsocket2.2 pero no soluciono el error. Luego de depurar la aplicacion veo que el error se crea cuando trata de parsear el archivo xml de configuracion .
Al xml lo crea correctamente en la direccion "C:\Documents and Settings\Administrador\.clienteChatNIO\config\config.xml " , pero cuando trata de parsear el xml se encuentra el error.Te muestro la parte donde sale el error en el constructor de la clase Configuracion.
Graciass !!!
... } catch (IOException ex) {
try {
//El archivo de configuracion no existe, se creará uno nuevo
crearDirectorioConfiguracion();
crearConfigXML();
// Aca sale el error
documento = (Document) factory.newDocumentBuilder().parse(new File(configDir + File.separator + configXML));
} catch (SAXException ex1) { ......
Este es el archivo xml.
{?xml version="1.0" encoding="UTF-8" standalone="no"?}
{raiz}
{avatar}avatares/otros/metalklesk.png{/avatar}
{nombre}{/nombre}
{theme-emoticones}emoticones/onion75/{/theme-emoticones}
{color-texto}-12566464{/color-texto}
{color-nombre-cliente}-16776961{/color-nombre-cliente}
{tema}javax.swing.plaf.metal.MetalLookAndFeel{/tema}
{estados}
{estado}En línea{/estado}
{estado}No disponible{/estado}
{estado}Vuelvo enseguida{/estado}
{estado}Salí a comer{/estado}
{estado}Ausente{/estado}
{estado}Al teléfono{/estado}
{/estados}
{mensaje-personal/}
{servidor}
{ip-hostname}localhost{/ip-hostname}
{puerto}9000{/puerto}
{/servidor}
{/raiz}
los simbolos de comienzo y cierre de los tag del xml los sustitui por { y } para poder ingresar el comentario en esta cartelera.
Hola
Lo estás corriendo en windows o en Linux ???
Es raro el problema que tienes, acá me funciona bien, tal vez sea algo con los permisos, no se, tengo q buscar la causa del error.
En todo caso, la primera vez que se corre el chat cliente, el archivo config.xml no existe y el programa lo crea (la configuracion inicial). Eso no es error, es lo correcto.
Incluso anoche estuve programando un poco y migré de xsocket 2.2 a 2.3, agregué el proyecto substance para tener mas temas para escoger y agregué soporte para zumbido (la ventana se mueve jejejeje).
Voy a instalar windows en una maquina virtual y lo probaré.
saludos !!!
Estoy corriendo en windows el programa.
Por ahora estoy modificando el chat que utiliza hilos , luego cuando lo pueda hacer funcionar , migrare las modificaciones a este.
Pienso utilizar el chat para que desde el que dos usuarios puedan acceder a un juego multiusuario que en un inicio lo habia comensado a hacer con php, ajax , pero devido a que trabajar en java me resulta mas facil y sencillo y gracias a tu contribucion pude entender el manejo de sockets.
Nuevamente muchas gracias.
Probablemente no liberare el codigo del juego ,debido a que pienso darle un uso comercial, pero si aquellas modificaciones que tengan que ver con el chat.
En el juego aclarare que el chat fue constribuido por vos y bueno , luego de un tiempo si veo que por ese medio genero dinero te recompensare de alguna manera.
Pero es algo temprano para eso , por el momento voy a ver si logro que la aplicacion cliente pueda ser ejecutada por medio de Java Web Start, y si no logro hacerlo usare aplets en el cliente.
Hola.
Todos los programas que yo subo a este blog tienen licencia GPL v3. La licencia GPL no impide ganar dinero, todo lo contrario, para ganar dinero el software no tiene por qué ser propietario (la excusa de hacer un software propietario para ganar dinero no es válida en lo absoluto, no desde 1985). Para entender bien que significa lo que digo no hay mejor referencia que la fuente original:
http://www.fsf.org/licensing/licenses/gpl-faq.html
ahi hay varias aclaraciones, entre las que te pueden interesar mas son las siguientes:
http://www.fsf.org/licensing/licenses/gpl-faq.html#DoesTheGPLAllowMoney
http://www.fsf.org/licensing/licenses/gpl-faq.html#DoesTheGPLAllowDownloadFee
http://www.fsf.org/licensing/licenses/gpl-faq.html#DoesTheGPLRequireAvailabilityToPublic
Ahora, debo decir y trataré de ser claro, la mayor parte de lo que yo se respecto al software, programación, diseño de software, etc. se lo debo a la comunidad alrededor del opensource y el software libre. Y siendo consecuente con lo que este movimiento social (y en ningún caso político) significa y representa es que he liberado mis códigos bajo la licencia GPL v3.
Tu quieres hacer un software propietario utilizando código abierto, eso infringe la ley. Si quieres usar mi código en tu aplicación puedes hacerlo de tres maneras.
1- Una es que la licencia de tu código sea compatible con la GPL v3.
2- Otra es que mi código lo modularices y sea una aplicación aparte que se comunique con tu aplicación, en tanto cada aplicación (que son dos, la tuya y la mia modificada) pueden tener sus propieas licencias.
3- Y por último no menos importante es que lleguemos a un acuerdo monetario y yo te doy permiso legal para usar mi código en tu aplicación manteniendo el código en tu licencia (es una excepción, no significa que mi código tenga que cambiar de licencia, solo en tu caso, un licenciamiento doble).
Te invito a leer y entender los términos de la GPL, son bastante mas beneficiosos para tí y para tus futuros clientes que las licencias propietarias.
Te invito a ser parte de esta comunidad de bloqueros que queremos aportar con un grano de arena a la comunidad, que es el fin y objetivo de mi blog, sin dejar a nadie fuera de los beneficios del aprendizaje y del compartir conocimiento (que es lo que nos hace crecer).
Saludos !!!
Ejemplos claros de licenciamiento doble lo encuentras en mysql y netbeans.
Ok , no estava muy al tanto sobre el tema de las licencias.
Mi idea de "comercializar" el software consiste en subir la aplicacion a un servidor de internet y que los usuarios puedan jugar gratis, el dinero llegaria por medio de avisos de adsense o otros. Bueno ,pensare cual de las tres opciones elijo, tambien cabe la posibilidad de que realice una aplicacion desde cero, sin copiar codigo ,pero si aplicando los conocimientos adquiridos al estudiar tu aplicacion y otros ejemplos de sockets y aplicaciones similares vistas en la web.
A mi tambien me surgieron errores al correrlo en windows , joder.
Cual sera el problema webon !.
Hola
Ya encontré el error. El problema es que la aplicación usa la codificación UTF-8 para alamcenar los datos de configuración. Cuando el cliente se ejecuta por primera vez, se crea una configuración inicial. Al crear esta configuración se crean un par de carpetas y un archivo config.xml. Este archivo se está escribiendo con la codificación por default del sistema operativo en el cual se ejecuta el cliente, entonces al tratar de leer el archivo se pide en UTF-8 pero está en otra codificación (la de windows).
Para solucionar este problema hay que obligar a escribir el archivo config.xml en UTF-8 sin importar la codificación de caracteres del sistema operativo (solo windows da el problema ... para variar).
En la clase Configuracion, método crearConfigXML, comentar la siguiente línea:
PrintWriter pw = new PrintWriter(new FileWriter(configDir + File.separator + configXML));
y agregar la siguiente linea en reemplazo de la anterior:
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(configDir + File.separator + configXML), "UTF8")));
guardan y recompilan, con eso ya está solucionado el problema.
Voy a subir pronto una nueva versión que soporta zumbidos (la ventana se mueve), soporta los themes de substance entre otras cosas.
saludos !!!
Gracias , sos un gran maestro !!!! , lo sabias no ?
Que lindo seria el mundo si hubiera mas gente como vos !
Hola trato de descargar los archivos y puedo, obtengo esto mensaje:
file removed, terms of service violation
hola muchachos.
he estado buscando como hacer mi aplicacion de chat aunque me gustaria entender bien como hacerlo por que no conozco nada del tema.
(una de las cosas que no entiendo es lo de cliente y servidor no tengo ni la mas remota idea de como aplicarlo)
gracias.
Estimados, el servidor en el cual subí los archivos me los borró, ya que al parecer no les gustó el tráfico que significó la descarga de mi programa (eso que no es pirateo). Hasta nuevo aviso, dejenme sus direcciones de correo aquí mismo en un comentario y les reboto el programa.
Saludos!!
hola, estoy interesado en tu programa chat por que a mi me llama mucho la atencion este tipo de aplicaciones. quiero aprender como funciona,parece muy bueno tu programa, espero puedas enviarlo a mi correo Gutanclan@hotmail.com de antemano muchas gracias
estimado,
me parece excelente tu proyecto de chat y me gustaria estudiarlo y analizarlo para ayudarte a mejorlarlo cada día más.
Si me lo puedes enviar mi mail te lo agradecedía:
manuelaraneda@gmail.com
Saludos
Gracias lo estamos usando
felicitaciones por el proyecto, quisiera aprender mas sobre el tema ya que soy nuevo en esto, pero estoy muy interesado.
mi correo es: ralb254@hotmail.com
te agradesco de antemano, y en lo que pueda ayudar estoy dispuesto.
Hola .. m parece muy interesante tu proyecto, quisiera poder analizarlo .. aqui te dejo mi correo :
HRosmery@gmail.com
gracias....
Hola buenas buscando informanción sobre AS3 y sockets llegue hasta xsocket y me resultaría interesante estudiar tu código.
Gracias
Hola!
Me gustaria que me dieran el codigo por favor ya que no puedo descargarlo....
Me pueden ayudar?
Gracias de antemano...
Mi correo es roelen005@hotmail.com
Muy bueno este chat, pero el enlace esta roto amigo , si eres tan amable jival77@hotmail.com para que lo envies si te es posible, muchas gracias, bendiciones.
Se ve muy bueno el chat amigo; pero no puedo descargarlo aver si puedes enviarmelo a lualbal@hotmail.com. Gracias man
Un muy buen trabajo, muchas felicidades.
Quisiera me me enviaras el codigo, mi correo es rgm65_5@hotmail.com, estoy muy interesado en estudiarlo,
Gracias nuevamente y que buen aporte...
atte. Ricardo Gallardo
Saludos Daniel
Me llamo mucho la atencion tu proyecto, yo estoy en uno muy similar, me gustaria revisar y estudiar tu codigo.
Mi correo es eder000000@gmail.com me encantaria que me pudieras enviar tu codigo.
Muchas felicidades y muchas gracias
Que tal daniel saludos.
Primero muchas gracias por este excelente aporte
Quisiera ne envies el codigo a ingedi78@gmail.com
La version anterios me marca error en la clase ClienteChatView al importar SystemTry y TryIcon utilizas estas clases en esta version ?
Es factible implementar el cliente en un applet y el servidor como un webservice se este ultimo la verdad no se mucho, en verdad que me ineresa hacer esta conversion alguna sugerencia ?
Atte. Eduardo A.
este chat funciona bajo windows??? o solo para linux
si funciona para windows me lo envias jeje
mi correo: omar_digital@yahoo.com.mx
saludos!!!
me sirvio de mucho la primera version de tu chat para mi proyecto y justo ahora estaba buscando para mi proyecto que no use hilos, jejeje y me va venir bien tu nueva version, mi correo xangelcruelx@hotmail.com.
pero sabes como puedo hacer mi propio xsocket?
Hola que tal, no conocía tu blog, me quería descargar el código de este chat y me encuentro con que el servidor ya borró los archivos, te agradecería si me los pudieras envíar al mail (luisdavidgd@gmail.com) o en todo caso subirlo a un servidor pùblico como 4shared.com que es similar a un disco virtual.
Saludos y por favor borra este comentario, pues no quiero que mi mail sea público, gracias.
Muy interesante tu chat, lástima que ese servidor eliminara el código fuente, ojala encuentres algun servidor que deje compartir archivos sin problemas.
Saludos!
¡Hola! me parece interezante tu perspectiva del chat. Soy novato usando java y estoy desarrollando un proyecto con caracteristicas similares al tuyo asi que si por favor me mandas el codigo del cliente y el servidor al correo (fullmoon_inthesky@hotmail.com) para orientarme; muchas gracias de antemano.
Amigo me intereso mucho tu implementacion de chat..pero no puedo descargar los archivos...ya no estan disponibles, te queria preguntar si tu cliente chat se puede conectar a un servidor IRC?..te dejo mi correo por si me puedes mandar los archivos..
muchas gracias
jano
sr_lancelott23@yahoo.com
Hola que tal!
Oye, se mira muy Picudo este Chat, pero he tratado de Descargarlo y YA NO ESTA DISNONIBLE.
Podrias ayudarme??
javert@walla.com
hola man buen post pero el sitio de descarga no esta habilitado me podrias enviar el codigo a edujesus1@hotmail.com
q alguien me envie los codigos a syaoran_oshare@hot.....
Hola pana sabes estube queriendo descargar el codigo pero nada que ver dice que el archivo esta removido please enviame el cliente y servidor al email gustavochiri.ca@gmail.com o gutavochiri.ca@hotmail.com
pila pana no es que te joda demasiado pero necesito ver ese codigo para ayudarne a realizar un programita similar como deber de la universidad pila espero tu respuesta
gustavochiri.ca@gmail.com
o
gutavochiri.ca@hotmail.com
Pila pana cometi un pequeño error mi correo de hotmail es :
gustavochiri.ca@hot...
Hola , puedes enviarme los codigos a tinchopmartin@hotmail.com , gracias
Hola, he tratado de descargarme tanto el cliente como el servidor pero no he tenido exito, alguien me puede decir como bajarlos, por cierto intente copiando el link de enlace directo y me sale un mensaje que dice "archivo removido, violacion de terminos del servicio"
Hola,
Como hago para descargar las aplicaciones, tengo el mismo error que dice que el archivo a sido removido; cualquier informacion a geovas_p@hotmail.com
De antemano gracias,
Saludos,
geovas
dejame tu correo y te lo reboto.
Saludos!
Hola me parece interesantisimo!!!!!!!!
mi correo es:
blackStar87@live.com
Recibe un saludo desde Guatemala.
Desde hace algun tiempo sigo tu blog y gracias a ello me he interesado mas por el desarrollo java.
Si esta en tus posibilidades enviarme las aplicaciones del chat y de lo de webservices.
Mi correo es checho25gt@yahoo.com
Hola, podrias compartirme tu codigo? me sale un error que no se puede bajar porque ha sido removido
Mi correo es johnf.martinez@gmail.com
Hola podrias rebotarme el codigo porque me aparece el mismo error
wilmerbg@gmail.com
Hola! me gustaria me enviaras en codigo del chat, por que no lo puedo bajar mi correo es ariancue@gmail.com
que chat tan bueno por fa mandamelo al correo para poder ver el codigo y estudiarlo
epadil07@gmail.com
Está en google code, ya no lo enviaré mas por correo
http://google.code.com/p/jtricahuenio/
Saludos!
hola, buenos dias, esta bueno el codigo pero me encantaria poder descargar el codigo de este programa me lo podria pasa a mi correo pero es de urgencia por favor .....
masencio88@hotmail.com
amik una pregunta en q direccion puedo descagr el codigo del progranma qhas hecho q aun no lo encuantro diculpa pero es q soy nuevo en esto d eprogramacion en java me haria el favor de enviarme el codigo a mi correo.
Darck_tlv_27@hotmail.com
hola que magnifico diseño es en verdad genial
me encantaria tener el codigo, si es posible por favor enviamelo a mi correo
ekpd07@hotmail.com
y felicitaciones es un chat en verdad muy bueno
Hola por favor sera que me puedes enviar el archivo el codigo si gracias no lo puedo bajar....
mi correo es diablita_taz@hotmail.com
xfa q en verdad esta muy interesante lo del chat
hola daniel primero quiero felicitarte por tan magifico trabajo
me encantaria tener el codigo para estudiarlo que se comentaste que estas en google.code pero no sale nada si me podrias haer el favor de enviarmelo al correo
ekpd07@hotmail.com o epadil07@gmail.com
te lo agradeciria mucho
gracias
Ya lo borré de mi correo y me da lata subirlo de nuevo. De google code se puede bajar sin problemas -> http://code.google.com/p/jtricahuenio/downloads/list
A la fecha hay 46 descargas del código del chat lo que demuestra que si se puede descargar.
Saludos!!!
hola soy nueva en esto jeje pero me intereso mucho tu chat
y me gustaria verlo ejecutado pero me aparecen pequeños errores en estas lineas en la clase logica.
me pide que cree clases de estas y como te digo soy nueva en esto jeje. te lo agradeceria muchisimo si me explicas que debo hacer
private INonBlockingConnection nbc;
private IDataHandler clientHandler = new IDataHandler() {
public boolean onData(INonBlockingConnection nbc) throws IOException,
BufferUnderflowException, MaxReadSizeExceededException {
//aqui recibo el mensaje entrante
y en elproyecto servidor ay erro en estos:
import org.xsocket.MaxReadSizeExceededException;
import org.xsocket.connection.IConnectHandler;
import org.xsocket.connection.IDataHandler;
import org.xsocket.connection.IDisconnectHandler;
import org.xsocket.connection.INonBlockingConnection;
import org.xsocket.connection.IServer;
import org.xsocket.connection.Server;
y me pide que haga otra clase en IServer en la clase servidor.
TE AGRADESCO DE ANTEMANO TU TIEMPO PARA ESTAS COSAS
TE CUIDAS
Y ESPERO TU AYUDA
:):)
El problema es que no estas agregando xsocket al classpath del cliente y del servidor, lo agregas y listo. En Netbeans puedes resolver la dependencia con click derecho sobre el proyecto -> resolve problems y le pasas el archivo xsocket.jar que está en la carpeta lib dentro del proyecto.
Saludos!!!
ola soy la de ayer jaja muchas gracias por prestarme un poco de tu tiempo. ya hice como me dijiste y mi duda es: al ejecutar el servidor esta bien q no aparesca una pantalla.porq al ejecutar cliente aparece la del chat pero en servidor no me arroja nada. esta bien, perdon la ignorancia jeje pero como te digo nose nada.
mil gracias otraves y esta con ganas tu proyecto. eres genial. :)
OLA soy la misma fastidiosa de arriba jaja
ya ejecute con otra amiga pero no entendemos porq no aparecen los q estan conectados en este caso ella y yo. ella ejecuto como cliente y servidor y yo solo como cliente me podrias resolver esta duda junto con la anterior
gracias otra ves te cuidas :)
Hola, en preguntar no hay engaño así es que no te preocupes.
El servidor corre en consola, es decir, está bien que no veas un entorno gráfico como en el cliente porque efectivamente .. no tiene entorno gráfico !!! jejeje.
Cuando tu amiga ejecuta el servidor, se puede ver que corre por un puerto (creo que el 9000 por default), eso lo ves en la consola despues de ejecutarlo.
Cuando un cliente se conecta debes darle el IP y el puerto, en este caso del computador de tu amiga. Si están en redes distintas, por ejemplo cada una en su propia casa, tu amiga debe darte el IP de ella (si pones en google "cual es mi ip" la podrás saber). Además ella debe abrir el puerto en su firewall y en su modem o router de manera que te puedas conectar a su computador por ese puerto.
Ya con eso no debes tener problemas para conectarte.
Ojo que haciendo lo que te dije DEBE funcionar, yo lo probé asi mismo con mis amigos y funciona sin problemas.
Saludos !!!
ok gracias pero si estamos en la misma red tambien se tiene q dar el puerto o le dejamos con 9000?
segun lo q entendi todos debemos poner la ip donde se ejecuta el servidor o no?
te cuidas gracias
Si ejecutan el servidor sin pasarle el puerto como parámetro, se utilizará el puerto 9000.
Los clientes necesitan para conectarse el puerto y la ip del servidor, independientemente de si están en la misma red o no. En el caso de que no lo estén, deben configurar el router para direccionar al servidor y los clientes deben usar la ip pública. La configuración del router es para pasar de la ip pública (la del router) a la ip privada (del servidor) direccionando al puerto correspondiente (9000).
Si están todos en la misma red entonces es mas fácil ya que solo deben asegurarse que el servidor tenga el puerto 9000 abierto en el firewall propio y olvidarse de lo demás. A los clientes les pasan el ip del servidor y el puerto 9000 y listo.
Saludos !!!
hola
sabes lo necesito para mañana si lees este mensaje enviamelo a crand_one@hotmail.com yo solo quiero que se comuniquen entre dos maquinas tengo que presentar en la noche
saludos
saludos
Sabes estoy haciendo algo similar pero aun no me sale, te agradeceria mucho si por fa me envias el codigo a mi correo
geovannceci@gmail.com
Fecilitaciones y gracias
hola me puedes ayudar con el codigo del programa y enviarlo a leidyei26@hotmail.com
esta para la descarga en google code, al final de esta entrada esta el enlace para ir a la descarga.
saludos !
por fa me podrian decir donde agrego el xsocket ... gracias de antemano
me sale este error
Servidor iniciado en el puerto 9090
Para detener el servidor ingrese DETENER en la linea de comandos.
22-abr-2010 18:54:09 org.xsocket.connection.Server$LifeCycleHandler onConnected
INFO: server listening on 0.0.0.0:9090 (xSocket 2.5.4)
donde está el error ?
ese mensaje es el que DEBES ver.
Saludos !
Hola Daniel,
Enhorabuena por la aplicación y el tutorial.
Estoy haciendo un chat similar al tuyo, y ahora le estoy dando vueltas al hecho de escuchar un puerto de manera continua. Si, por ejemplo, pones el servidor en una IP pública, sabiendo que escucha el puerto 9000, nada me impide lanzar un bucle infinito desde un cliente:
new Socket("IP",9000);
El servidor aceptaría cada INonBlockingConnection, y podría caer.
¿Sabes si hay algún mecanismo para evitar esto?
Hola, me podrías enviar el código, mi email es noeliasfranco@yahoo.com.ar
http://code.google.com/p/jtricahuenio/downloads/list
Daniel, al descargarlo del link que me diste se me presenta un error de CRC cuando intento descomprimir el zip
Perdón no te aclaré cuál zip, es el JTricahue2.1.1-client-src.tar.bz
Noelia, acabo de descargar el cliente y el servidor y ambos los pude descomprimir sin problemas, probablemente se te descargaron mal, se corrompieron en el camino o en tu disco duro. Los archivos están buenos en el server de google.
Saludos !!!
Hola Daniel, realmente descargue los archivos del servidor de google, pero a la hora de descomprimirlos me arojan los siguientes errores:
bzip2: (stdin) is not a bzip2 file.
/bin/gtar: Child returned status 2
/bin/gtar: Error exit delayed from previous errors
Me interesa bastante este chat.
hola me podrias ayudar con tu chat, agregandole coneccion a base de datos para registrar los mensajes que se envian y tenerlos almacenados, porfa men ayudame con eso mi correo es:
kleverjimenez@gmail.com
es de urgencia lo necesito para maximo 1 semana y media ayudame con esto men.
holas los link estan rotos quisiera saber como implementastes el zumbido, para q la ventana tiemble
Amigo tu chat es muy interesante y me gustaría ver tu código para aprender pero no he podido descargar tu código por que está bloqueado, amigo súbelo de nuevo el chat. Gracias
Atte Frank
Me gustaría chequear tu código, me seria de mucha ayuda aprender y saber cómo creaste un chat. Los enlaces del Cliente y servidor están caído ayúdame con tu código.
Mi mail es hellsign007@hotmail.com
Gracias por su ayuda
Atte. Frank Espinoza
Hola
Favor mirar la ultima actualización de esta entrada, ahi está el link a google code para bajar los fuentes.
Saludos!
Me arroja esto en la terminal:
joshny@jonyDebian:~/Descargas$ bzip2 -d JTricahue2.1.1-server-src.tar.bz
bzip2: JTricahue2.1.1-server-src.tar.bz is not a bzip2 file.
joshny@jonyDebian:~/Descargas$ tar xjfv JTricahue2.1.1-server-src.tar.bz
bzip2: (stdin) is not a bzip2 file.
tar: Child returned status 2
tar: Error is not recoverable: exiting now
joshny@jonyDebian:~/Descargas$
Como puedo extraer el contenido?
amigo está muy bueno... pura vida.
hola! mmmm muy bueno lo que propones no se si me podrias ayudar para que pueda hacer uno propio...
hello
is possible send me the project?
thanks
claudiowar@gmail.com
Disculpa es que quise ejecutar el cliente y me aparecio estoy en consola:
init:
Deleting: I:\Franthanni\Descargas\Chatt\Chatt\JTricahue2.1.1-client-src\build\built-jar.properties
deps-jar:
Updating property file: I:\Franthanni\Descargas\Chatt\Chatt\JTricahue2.1.1-client-src\build\built-jar.properties
Compiling 1 source file to I:\Franthanni\Descargas\Chatt\Chatt\JTricahue2.1.1-client-src\build\classes
compile-single:
run-single:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.ImageIcon.(ImageIcon.java:181)
at org.vista.ventanas.Ventana.initComponents(Ventana.java:302)
at org.vista.ventanas.Ventana.(Ventana.java:83)
at clientenio.Main$1.run(Main.java:41)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
GENERACIÓN CORRECTA (total time: 4 seconds)
Y d ahí ya no pasa nada... Que deveria de hacer? me exclicaria por favor
Muchas gracias.
!!Quisiera conocer el metodo para poder acceder a la descarga del programa...me sale una pagina donde me pide el celular y una suscripción...que debe hacer!!
no me sale para descargarlo!!!!!!!!!! ayuda!!!!!!!!!!!!
muy bueno.. porfa me lo enviarias a datocovenant@gmail.com porfa
ejecuto el cliente y me dice quwe se ha ejecutado correctamente pero no me aparece nada, podrias ayudarme porfavor
Hola me puedes hacer el favor de enviarme el codigo es que no puedo descargarlo... marcelys_samaria@hotmail.com
Publicar un comentario