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).
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).
Saludos !!!

41 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...
Publicar un comentario en la entrada