Foros del Web » Programando para Internet » Javascript »

es normal hacer asi un chat?

Estas en el tema de es normal hacer asi un chat? en el foro de Javascript en Foros del Web. Buenas, tengo esta duda porque aunque me funciona bien, me consume muchos recursos, lo que hago es recargar un div descargando el contenido desde una ...
  #1 (permalink)  
Antiguo 16/08/2012, 22:17
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Pregunta es normal hacer asi un chat?

Buenas, tengo esta duda porque aunque me funciona bien, me consume muchos recursos, lo que hago es recargar un div descargando el contenido desde una base de datos con la conversacion entre dos usuarios cada un segundo, hay alguna forma de hacer que solo se actualize en los ordenadores al mismo tiempo, solo cuando uno de los dos escribio algo? gracias, espero que puedan ayudarme seria buenisimo, gracias...
  #2 (permalink)  
Antiguo 17/08/2012, 02:13
Avatar de Hugo_Euan  
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 13 años
Puntos: 71
Respuesta: es normal hacer asi un chat?

^^ interesante... pues... tal vez.. así como lo estas pensando... no... es decir.. si piensas que cuando el usuario escriba.. y de entera automaticamente se observe en el otro usuario sin que haya un evento que permita saber la accion.. eso no se puede ^^ es de ley que tiene que haber un listener...

no sé si me explique.. pero bien... trataré de dejarlo mas claro...

debe existir un evento.. que "escuche" las peteciones y envios aunque no siempre reciba y envie datos... algo así por el estilo

debe haber una función que cache el evento de la tecla enter y del boton para enviar el mensaje... por ejemplo usando un poco de jQuery

Código Javascript:
Ver original
  1. var MyDocument=$(document); //global vars
  2. var keyCode; // global vars
  3.  
  4. MyDocument.ready(INITIALIZED);
  5.  
  6. function INITIALIZED(){
  7.     MyFunction=$("#BtnEnter"); // añadimos el elemento (el boton enviar)
  8.     MyFunction.click(SUBMIT); // al hacer click llamamos a la funcion submit
  9.     $(document).keypress(function(e) {
  10.         if(e.keyCode == 13){ // al presionar la tecla enter
  11.             SUBMIT(); // llamamos a la funcion submit
  12.         }
  13.     });
  14. }
  15.  
  16. function SUBMIT(){
  17.     // obtenemos el valor y enviamos.... (tus parametros)
  18. }

con lo anterior.. ya tenemos listo el boton y la tecla enter para enviar ^^ ahora solo falta un listener que se encargará de consultar si existen nuevos valores para despues mostrarlos... para ello puedes hacer uso de los Iframes... lo cual no te recomiendo ^^ pero tambien lo puedes hacer mediante AJAX... te conviene investigar un poquito.. si no sabes queda de tarea... aqui lo puedes consultar Jquery AJAX
bien.. sabiendo un poquito de ajax.. ahora solo te queda hacer una función que se ejecute cada 1 segundo.. si asi prefieres.. la diferencia entre este metodo y el que usas.. pudiera parecer nada.. pero es grande.. en primera por que no se refresca la pagina completa.. al no hacer eso el rendimiento es mayor.. ya que no todos los datos son actualizados....

Código Javascript:
Ver original
  1. var time_elapsed; //global vars
  2. var time_refresh = 1000; //global vars - 1000 milliseconds = 1 second
  3.  
  4. time_elapsed = setInterval('LISTEN();', time_refresh ); // va dentro de INITIALIZED despues del cierre de corchete de $(document).keypress
  5.  
  6. function LISTEN (){
  7.     //se efectua si hay datos nuevos en la BD con AJAX, si existe nuevos elementos se imprimen, si no.. sigue en espera....
  8. }

básicamente esas son las pautas para lo que quieres lograr.. como vez.. todo se centra en AJAX....

Espero te sea de utilidad.. Saludos y Éxito....
__________________
Se acepta Karma (:

Si Dios con nosotros, quien contra nosotros !!
  #3 (permalink)  
Antiguo 17/08/2012, 06:34
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: es normal hacer asi un chat?

Hugo_Euan, lo que mencionás es básicamente (a menos que haya entendido muy mal) lo que waldragon dice estar haciendo.
waldragon, te sugiero que investigues acerca de node.js
  #4 (permalink)  
Antiguo 17/08/2012, 11:56
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: es normal hacer asi un chat?

También es posible optimizar el chat basado en ajax si refrescas un poco más pausado, digamos cada 8 segundos, finalmente mientras el usuario escribe o lee, deben pasar al menos 5 segundos.

También, (aunque aquí no aclaras cómo lo haces) que la función que trae contenido de la bd sólo muestre lo no leído, para minimizar la cantidad de datos a transportar.
  #5 (permalink)  
Antiguo 17/08/2012, 12:03
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por Hugo_Euan Ver Mensaje

con lo anterior.. ya tenemos listo el boton y la tecla enter para enviar ^^ ahora solo falta un listener que se encargará de consultar si existen nuevos valores para despues mostrarlos... para ello puedes hacer uso de los Iframes... lo cual no te recomiendo ^^ pero tambien lo puedes hacer mediante AJAX... te conviene investigar un poquito.. si no sabes queda de tarea... aqui lo puedes consultar Jquery AJAX
bien.. sabiendo un poquito de ajax.. ahora solo te queda hacer una función que se ejecute cada 1 segundo.. si asi prefieres.. la diferencia entre este metodo y el que usas.. pudiera parecer nada.. pero es grande.. en primera por que no se refresca la pagina completa.. al no hacer eso el rendimiento es mayor.. ya que no todos los datos son actualizados....

Código Javascript:
Ver original
  1. var time_elapsed; //global vars
  2. var time_refresh = 1000; //global vars - 1000 milliseconds = 1 second
  3.  
  4. time_elapsed = setInterval('LISTEN();', time_refresh ); // va dentro de INITIALIZED despues del cierre de corchete de $(document).keypress
  5.  
  6. function LISTEN (){
  7.     //se efectua si hay datos nuevos en la BD con AJAX, si existe nuevos elementos se imprimen, si no.. sigue en espera....
  8. }

básicamente esas son las pautas para lo que quieres lograr.. como vez.. todo se centra en AJAX....

Espero te sea de utilidad.. Saludos y Éxito....
lo primero ya lo tengo funcionando perfectamente, pero esto del listener creo que es lo que estoy buscando, para que solo se actualize al haber registros nuevos, podrias darme alguna pista mas? no sabria por donde empezar, gracias hugo
  #6 (permalink)  
Antiguo 17/08/2012, 12:04
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por Panino5001 Ver Mensaje
Hugo_Euan, lo que mencionás es básicamente (a menos que haya entendido muy mal) lo que waldragon dice estar haciendo.
waldragon, te sugiero que investigues acerca de node.js
si, es casi lo que yo hago, solo refresco un div con el contenido de la base de datos correspondiente a esa conversacion, pero quisiera que solo se refrescara cuando haya algo nuevo que mostrar?

Última edición por waldragon; 17/08/2012 a las 13:13
  #7 (permalink)  
Antiguo 17/08/2012, 13:26
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por ocp001a Ver Mensaje

Cita:
También es posible optimizar el chat basado en ajax si refrescas un poco más pausado, digamos cada 8 segundos, finalmente mientras el usuario escribe o lee, deben pasar al menos 5 segundos.
Si, eso puede servir al menos
provisoriamente hasta que logre entender como hacerlo bien, lo pondre en 5 segundos, y tratare de hacer que tambien se actualice al enviar el mensaje, para que cada usuario no se quede esperando a ver lo que escribio y piense que no fue enviado, es que en general el que chatea es muy impaciente


Cita:
También, (aunque aquí no aclaras cómo lo haces) que la función que trae contenido de la bd sólo muestre lo no leído, para minimizar la cantidad de datos a transportar.
Si, estoy viendo la posibilidad de ir guardando lo descargado en una session y modificando un campo en el registro para que no se vuelva a mostrar, el problema es que si "anulo" un registro al verlo el user "A" tampoco lo podra verel user "B", por eso pondre dos campos para anular registros, uno para cada user, ya vere como los relaciono...
  #8 (permalink)  
Antiguo 17/08/2012, 16:44
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 11 años, 8 meses
Puntos: 17
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por waldragon Ver Mensaje
si, es casi lo que yo hago, solo refresco un div con el contenido de la base de datos correspondiente a esa conversacion, pero quisiera que solo se refrescara cuando haya algo nuevo que mostrar?
De lo que hablas y necesita se le llama Push tecnology, reverse ajax, Comet...
Este funciona por eventos...

Y solo se manda cuando hay algo nuevo o lo pusha a los otros en chat or lugar...

Como dijeron anteriormente node.js es uno y tambien conosco the Ape project el cual e usado en un chat que cree...

Y el performance es exelente y bien estable... investiga...
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com
  #9 (permalink)  
Antiguo 17/08/2012, 16:54
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: es normal hacer asi un chat?

Dadas las limitantes que tengo para instalar otras cosas en el servidor, me he tenido que conformar con usar apache y php simple, y no me he metido a investigar mucho sobre las tecnologías tipo ape, comet y derivados, pero te comento a grandes rasgos lo que hace el chat que he desarrollado:

El usuario A escribe, su texto se agrega a su ventana de conversación por js de forma inmediata, y se envía al servidor para almacenarse en una tabla con la estructura:

fecha, usuario_origen, usuario_destino, mensaje, status

Cuando el chat del usuario B pide nuevos datos, se leen de la tabla los que tengan status no leído (0) se marcan como leídos (1) y se regresan los datos sólo del mensaje y el usuario origen (A)

El javascript del usuario B toma los datos devueltos y según sea el usuario origen los asigna y les da formato para agregarlos a la conversación del usuario B.
  #10 (permalink)  
Antiguo 17/08/2012, 17:56
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 11 años, 8 meses
Puntos: 17
Respuesta: es normal hacer asi un chat?

Entiendo,

Pero es el viejo metodo Ajax, tener un chat usando httrequest no lo indicado es una carga a el servidor apache, mysql..

Pero si no hay manera de instalar un Comet server entonces es la unica manera de hacerlo que no sea necesario instalar nada, ni por parte del servidor ni de el ususario..

en el futuro quizas i manejes tu propio VPS..
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com
  #11 (permalink)  
Antiguo 17/08/2012, 22:33
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por ocp001a Ver Mensaje
Dadas las limitantes que tengo para instalar otras cosas en el servidor, me he tenido que conformar con usar apache y php simple, y no me he metido a investigar mucho sobre las tecnologías tipo ape, comet y derivados, pero te comento a grandes rasgos lo que hace el chat que he desarrollado:

El usuario A escribe, su texto se agrega a su ventana de conversación por js de forma inmediata, y se envía al servidor para almacenarse en una tabla con la estructura:

fecha, usuario_origen, usuario_destino, mensaje, status

Cuando el chat del usuario B pide nuevos datos, se leen de la tabla los que tengan status no leído (0) se marcan como leídos (1) y se regresan los datos sólo del mensaje y el usuario origen (A)

El javascript del usuario B toma los datos devueltos y según sea el usuario origen los asigna y les da formato para agregarlos a la conversación del usuario B.
por lo que entiendo de tu explicacion, lo que haces es que lo que escribe cada usuario no se le muestra descargandolo de la bd, solo se le descarga lo que escribio el otro, y lo propio se va mostrando con js, es muy ingenioso, no se me habia ocurrido, eso sin dudas rebajaria mucho el consumo de mis recursos, podrias mostrarme algo de ese codigo? me seria de mucha ayuda...
  #12 (permalink)  
Antiguo 18/08/2012, 01:39
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: es normal hacer asi un chat?

Mirá esto a ver si te sirve
http://emprear.com/polling/index_polling.php

Está hecho para otra cosa, y es una demo muy sencilla. Muchas de las tecnologías que se mencionan no es posible instalarla en la mayoria de los hostings compatidos.
Pero quizás te pueda servir, usa solo php y ajax.
Te aclaro que no está pensada para un chat, así que para probarla abri varios navegadores e insertá registros desde uno y desde otro.
El tiempo de refresco de 5 segundos se puede bajar a 2 o 3, pero ya es cosa de analizar como responde el server.
Si crees que te puede ser funcional dejo el código para bajar y alguna explicación extra.

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #13 (permalink)  
Antiguo 18/08/2012, 16:30
 
Fecha de Ingreso: agosto-2012
Ubicación: M.
Mensajes: 2.031
Antigüedad: 11 años, 8 meses
Puntos: 52
Respuesta: es normal hacer asi un chat?

de hecho eso hago yo XD pero tengo un problema mas grande
  #14 (permalink)  
Antiguo 18/08/2012, 16:37
 
Fecha de Ingreso: agosto-2012
Ubicación: M.
Mensajes: 2.031
Antigüedad: 11 años, 8 meses
Puntos: 52
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por waldragon Ver Mensaje
por lo que entiendo de tu explicacion, lo que haces es que lo que escribe cada usuario no se le muestra descargandolo de la bd, solo se le descarga lo que escribio el otro, y lo propio se va mostrando con js, es muy ingenioso, no se me habia ocurrido, eso sin dudas rebajaria mucho el consumo de mis recursos, podrias mostrarme algo de ese codigo? me seria de mucha ayuda...
yo hago hago exactamente eso, pero tengo un problema en la forma que consult la base de datos hago esto

es mas pondre lo que explique en el tema que acabo de abrir:

"Hola a todos colegas.
soy nuevo en lo de la web.
tengo un problemita
tengo un div principal en el cual agrego divs hijos o divs coments segun los comentarios que se envien, o reciban

osea.
envio un comentario, entonces se agrega el div del coment al div principal
si tengo 5 comentarios entnces hay 5 comentarios en el div principal, bueno asi se entiende eso.

todo funciona bien, envio coments y recibo y todo bie, solo recibo los nuevos y los agrego en tiempo real. con esta consulta select* from tablausuario,tablacoments order by tablacoments.id desc limit ".$limite;

el problema radica en que yo agregue una funcion extra en la cual cuando yo envió un coment entonces se agregue mi coment a mi panel automáticamente
(de esta forma $(cm).insertAfter('#coment'))
sin necesidad de ir cargar el coment que acabo de enviar a la base de datos
entonces yo para no cargar el coment mio de la base de datos hice esto


select* from tablausuario,tablacoments where tablausuarios.id<>".$_SESSION['idusuario']." order by tablacoments.id desc limit ".$limite;

$limite es la diferencia del total de filas de la tablacoments menos el valor anterior de filas total del coment.
eso me hace que solo cargue lo nuevo, y si esta bien, el problema radica en que yo no quiero que cargue mi comentario, por que yo ya lo agregue previamente con esto $(cm).insertAfter('#coment').
y eso hace que la variable $limite cuente los valores que mostrara tomando en cuenta que no mostrara el mio. es por eso que la cambie asi select* from tablausuario,tablacoments where tablausuarios.id<>".$_SESSION['idusuario']." order by tablacoments.id desc limit ".$limite;
para ser mas claros
la base de datos muestra los comentarios nuevos, basado en la variable limite, si hay 3 comentarios nuevos, limite vale 3. entonces selecciona los 3 y los muestra
pero como yo pongo el filtro de que no quiero que muestre los de mi sesion, entonces toma en cuenta eso y cuenta 3 sin contar el mio, osea selecciona un cuarto comentario, no se si me explique.

talvez me digan para que quiero agregar el comentario de la siguiente forma
$(cm).insertAfter('#coment')
si es mejor seleccionarlo de la base de datos.
pues por estetica, ya que el archivo ajax hace peticion cada segundo, entonces si envio un dato durara un segundo en regresar-. es por eso que yo creo que se ve mejor agregarlo imediatamente en cuanto lo envio, y luego mostrar los coments nuevo a excepcion del mio para que no haya duplicados.

no se si me explique bien.

todo esto es para que funcione en tiempo real.
saludos...! de antemano gracias"
  #15 (permalink)  
Antiguo 19/08/2012, 00:29
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por emprear Ver Mensaje
Mirá esto a ver si te sirve
http://emprear.com/polling/index_polling.php

Está hecho para otra cosa, y es una demo muy sencilla. Muchas de las tecnologías que se mencionan no es posible instalarla en la mayoria de los hostings compatidos.
Pero quizás te pueda servir, usa solo php y ajax.
Te aclaro que no está pensada para un chat, así que para probarla abri varios navegadores e insertá registros desde uno y desde otro.
El tiempo de refresco de 5 segundos se puede bajar a 2 o 3, pero ya es cosa de analizar como responde el server.
Si crees que te puede ser funcional dejo el código para bajar y alguna explicación extra.

Saludos
por lo que vi, creo que me podria servir, es casi lo que estoy buscando, como puedo hacer para descargar el codigo y la explicacion?
  #16 (permalink)  
Antiguo 19/08/2012, 03:38
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por waldragon Ver Mensaje
por lo que vi, creo que me podria servir, es casi lo que estoy buscando, como puedo hacer para descargar el codigo y la explicacion?
Aca dejo un zip con el código e info
http://emprear.com/polling/fake_ajaxPolling.zip

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #17 (permalink)  
Antiguo 19/08/2012, 11:16
Avatar de Hugo_Euan  
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 13 años
Puntos: 71
Respuesta: es normal hacer asi un chat?

Mi estimado Panino5001
No entendiste mal... pero si iterpretas mal.. lo que hay que resaltar son los eventos "LISTEN" los cuales son prioritarios en la compostura de chats basados en AJAX... un sistema de chat casi siempre tiene la misma compostura, pero lo que hay que resaltar en el básico ejemplo que puse son los eventos "LISTEN" y "AJAX" o es que me equivoco ?

__________________________________________________ ____________________

Mi estimado waldragon los métodos que te describen son buenos... y si algunos disminuyen el uso de recursos en parte... mayormente "la consulta de BD" pero, no sé a que conclusión llegaste al leer esos métodos.. sin embargo te diré que es de LEY que el cliente tiene que enviar una petición al server para comprobar nuevas "Adquisiciones" de manera que solo te evitarias la consulta a la BD... ahora bien.. yo no sé hasta que grado requieres de performance para tu sistema, pero pongamos un ejemplo.. en el caso del Facebook, si te das cuenta tus conversaciones se mantienen archivadas hasta que decidas eliminarlas, eso es por que son almacenadas en una BD... he ahí donde debes decidir tu.. como deseas implementar tu sistema y con que factibilidad para el usuario...

bien.. los eventos listeners... son básicamente métodos de consulta para saber si existe "nuevo contenido"

con el ejemplo anterior que te puse.. supongamos que en tu div ya imprimiste:

yo: hola que tal
tu: hey que onda

el listener se encargará de consultar nuevos mensajes cada 1 segundo... para algunos pareciera ser el consumo de recursos innecesarios o exesivo.. sin envargo.. ten en cuenta que un listener... es procesado casi a la velocidad aproximada de 1 ms algo sumamente rápido... y si existe nuevo contenido.. la respuesta es rápida al usar ajax.. ya que solo obtendras dicho contenido nuevo.. es decir...
si yo te contesto...

yo: pues aqui nomas.. jodiendo gente xD

el listener.. verifica la tabla de la BD que tenga nuevo contenido y obtiene ese resultado y lo devuelve... e imprime solo ese valor.. quedando el chat

yo: hola que tal
tu: hey que onda
yo: pues aqui nomas.. jodiendo gente xD

me imagino que con tu método lo que haces es reimprimir completamente toda la conversación... e ahi donde el uso de recursos es exesivo..
bien.. espero haberme explicado...

Saludos y Éxito...
__________________
Se acepta Karma (:

Si Dios con nosotros, quien contra nosotros !!
  #18 (permalink)  
Antiguo 19/08/2012, 11:35
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: es normal hacer asi un chat?

Hugo_Euan imagino que no has testeado eso que mencionás con muchos usuarios. El problema con ese tipo de soluciones no es que consuman recursos sólo por la cantidad de datos intercambiados sino por la cantidad de requests al servidor. Con no demasiados usuarios te estarías haciendo a vos mismo un ataque DDoS.
  #19 (permalink)  
Antiguo 19/08/2012, 15:51
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por Panino5001 Ver Mensaje
Hugo_Euan imagino que no has testeado eso que mencionás con muchos usuarios. El problema con ese tipo de soluciones no es que consuman recursos sólo por la cantidad de datos intercambiados sino por la cantidad de requests al servidor. Con no demasiados usuarios te estarías haciendo a vos mismo un ataque DDoS.
pero es necesario hacer consultas seguidas a la base de datos, segun entiendo, es la unica forma de hacer funcionar un chat, por eso estamos buscando la forma de disminuir las consultas al minimo posible, con lo que me paso EMPREAR podre ahorrarme bastante, lo estoy probando.
  #20 (permalink)  
Antiguo 19/08/2012, 15:57
Avatar de Hugo_Euan  
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 13 años
Puntos: 71
Respuesta: es normal hacer asi un chat?

Panino5001 compruebalo por tu propia cuenta ^^
__________________________________________________ ______________________

waldragon pues depende de ti... por que tambien se pueden almacenar en archivos temporales.. pero eso supondria al fina.. mucha basuar de datos para el server... hasta donde yo sé.. no puedes enviar directamente el paquete datos de un usuario a otro como sucede con los sockets de conexion winsock... a menos claro está que haya una aplicación intermediaria.. que claro esta.. resolveria tu problema por completo de uso de recursos...
__________________
Se acepta Karma (:

Si Dios con nosotros, quien contra nosotros !!
  #21 (permalink)  
Antiguo 19/08/2012, 16:00
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por Hugo_Euan Ver Mensaje
Mi estimado waldragon los métodos que te describen son buenos... y si algunos disminuyen el uso de recursos en parte... mayormente "la consulta de BD" pero, no sé a que conclusión llegaste al leer esos métodos.. sin embargo te diré que es de LEY que el cliente tiene que enviar una petición al server para comprobar nuevas "Adquisiciones" de manera que solo te evitarias la consulta a la BD... ahora bien.. yo no sé hasta que grado requieres de performance para tu sistema, pero pongamos un ejemplo.. en el caso del Facebook, si te das cuenta tus conversaciones se mantienen archivadas hasta que decidas eliminarlas, eso es por que son almacenadas en una BD... he ahí donde debes decidir tu.. como deseas implementar tu sistema y con que factibilidad para el usuario...

bien.. los eventos listeners... son básicamente métodos de consulta para saber si existe "nuevo contenido"

con el ejemplo anterior que te puse.. supongamos que en tu div ya imprimiste:

yo: hola que tal
tu: hey que onda

el listener se encargará de consultar nuevos mensajes cada 1 segundo... para algunos pareciera ser el consumo de recursos innecesarios o exesivo.. sin envargo.. ten en cuenta que un listener... es procesado casi a la velocidad aproximada de 1 ms algo sumamente rápido... y si existe nuevo contenido.. la respuesta es rápida al usar ajax.. ya que solo obtendras dicho contenido nuevo.. es decir...
si yo te contesto...

yo: pues aqui nomas.. jodiendo gente xD

el listener.. verifica la tabla de la BD que tenga nuevo contenido y obtiene ese resultado y lo devuelve... e imprime solo ese valor.. quedando el chat

yo: hola que tal
tu: hey que onda
yo: pues aqui nomas.. jodiendo gente xD

me imagino que con tu método lo que haces es reimprimir completamente toda la conversación... e ahi donde el uso de recursos es exesivo..
bien.. espero haberme explicado...

Saludos y Éxito...
exacto, lo estoy haciendo de la peor manera, estoy convencido de que tengo que rediseñar mi script para hacerlo funcionar de la mejor manera y para eso tengo que incorporar estoas dos explicaciones tuyas:

listener:
eso me parece indispensable para rebajar los recursos, creo que investigando el script que me paso emprear podre solucionar ese problema

solo descargar lo que escribe el otro:
Esto tambien lo quiero hacer, no se me habia ocurrido de no ser por tus mensajes anteriores, veo el gran potencial que tiene y por eso quiero incorporarlo al script de mi chat, tendrias un ejemplo creado por ti para investigarlo?

pd: tambien seria bueno poner la opcion de borrar la conversacion por parte de los usuarios, se como hacerlo y lo implementare para reducir algo mas el consumo

es un gran tema el que estamos armando, muchisimas gracias por su ayuda
  #22 (permalink)  
Antiguo 19/08/2012, 19:53
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: es normal hacer asi un chat?

Si no van a tener muchos usuarios es una solución aceptable. Pero lo que les comento lo experimenté, y en más de una oportunidad, con chats y con juegos multiusuario basados en polling y long polling; hace algunos años incluso tuvo bastante difusión este script que creé http://www.disegnocentell.com.ar/notas2.php?id=240, pero que siempre recomiendo no usar. Tristemente, con muchos usuarios el servidor se cae. Y si es un servidor compartido hasta es probable que el proveedor de hosting los penalice. No son una buena solución ni el polling ni el longpolling en servidores Apache. Si necesitan hacer esto de manera robusta deberían usar node.js o un servidor de sockets (pueden hacer uno en php, pero sería mejor en java) y (eso si esperan ya demasiados usuarios) manejar salas con límite de usuarios concurrentes.
Igual repito: Si no van a tener muchos usuarios es una solución aceptable.
  #23 (permalink)  
Antiguo 19/08/2012, 20:51
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: es normal hacer asi un chat?

creo que lo comenté, pero quiero dejar en claro que mi aplicación de manera alguna está pensada para trabajar como chat, supongo que reduciendo los tiempos en las llamadas podria trabajar como tal, pero no es el objetivo

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #24 (permalink)  
Antiguo 19/08/2012, 22:54
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por Panino5001 Ver Mensaje
Si no van a tener muchos usuarios es una solución aceptable. Pero lo que les comento lo experimenté, y en más de una oportunidad, con chats y con juegos multiusuario basados en polling y long polling; hace algunos años incluso tuvo bastante difusión este script que creé http://www.disegnocentell.com.ar/notas2.php?id=240, pero que siempre recomiendo no usar. Tristemente, con muchos usuarios el servidor se cae. Y si es un servidor compartido hasta es probable que el proveedor de hosting los penalice. No son una buena solución ni el polling ni el longpolling en servidores Apache. Si necesitan hacer esto de manera robusta deberían usar node.js o un servidor de sockets (pueden hacer uno en php, pero sería mejor en java) y (eso si esperan ya demasiados usuarios) manejar salas con límite de usuarios concurrentes.
Igual repito: Si no van a tener muchos usuarios es una solución aceptable.
mi idea es empezar con algo de esto y seguir mejorando el script a medida que aumentan los usuarios.

Muy bueno tu script de chatino, pero no se pueden crear conversaciones privadas y eso es muy importante para lo que estoy buscando, de todas formas me lo guardo para seguir aprendiendo sobre el tema, muchas gracias panino
  #25 (permalink)  
Antiguo 19/08/2012, 23:05
Avatar de waldragon  
Fecha de Ingreso: mayo-2010
Mensajes: 735
Antigüedad: 14 años
Puntos: 55
Respuesta: es normal hacer asi un chat?

Cita:
Iniciado por emprear Ver Mensaje
creo que lo comenté, pero quiero dejar en claro que mi aplicación de manera alguna está pensada para trabajar como chat, supongo que reduciendo los tiempos en las llamadas podria trabajar como tal, pero no es el objetivo

Saludos
aunque no haya sido pensada para trabajar como chat, creo que es lo que estoy buscando para mejorar mi script, en estos momentos me encuentro investigandola para adaptarla.

pd:yo tambien estaba usando la impresion de unix time stamp para notar la actualizacion de mi chat
  #26 (permalink)  
Antiguo 20/08/2012, 03:39
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: es normal hacer asi un chat?

Aquí han posteado un ejemplo de lo que digo: http://www.forosdelweb.com/f127/prob...astas-1008743/
(y es mi último intento por sacarte del mal camino )
  #27 (permalink)  
Antiguo 20/08/2012, 11:27
Avatar de Hugo_Euan  
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 13 años
Puntos: 71
Respuesta: es normal hacer asi un chat?

Interesante sin duda alguna como dice el compañero waldragon

eh probado lo que he expuesto anteriormente tal vez no con millones de usuarios como lo haria FB u otras RS... pero si con miles... lo que no estoy seguro es si eran servidores compartidos o dedicados... e igual estaba basado Apache...

Como he expuesto anteriormente y hasta donde sé es imposible que los datos lleguen directamente al otro usuario como pasaria con los sockets...
recalco.. a no ser.. que exista una aplicacion intermediaria... pues vamos.. si no puedes.. no quieres.. no necesitas.. una aplicacion intermediaria.. estoy seguro que esta solución te vendria bien...
bueno.. antes que nada waldragon debeis entender las pautas que conforman la estructura de este tipo de sistemas..

- He comentado la importancia de los listeners un punto clave sin duda... se encarga de verificar si hay nuevo contenido para enviar o recibir.. la peticion de este proceso es de 1 bit... como veras... es lo minimo que puedes usar en recurso.. 1 bit es donde parte todo dato...

- Tambien necesitas la presencia de AJAX... metodo principal que se encargará de refresacar en tu página ÚNICAMENTE lo necesario...

te recomiendo aprender un poquito de jQuery para facilitarte la vida en la programación...
pues bién...

Código Javascript:
Ver original
  1. var MyDocument=$('document');
  2. var keyCode;
  3. var Attr={};
  4.  
  5. MyDocument.ready(function(){
  6.     var MyFunction=$('#BtnEnter');//inicializamos para usar el evento enter en el botón
  7.     MyFunction.click(SUBMIT);
  8.     $(ducument).keypress(function(e)){
  9.         if(e.keyCode == 13){
  10.             SUBMIT();
  11.         }
  12.     }
  13.     Attr.txt = '';
  14.     Attr.Counter = 0;
  15.     Attr.listen = setInterval('LISTEN();', 1000);
  16. });
  17.  
  18. function SUBMIT(){
  19.     Attr.txt = $('TxtBoxSendText');//Obtenemos el valor de la caja de texto
  20.     _$().Ajax({
  21.         Method:'POST',//metodo request
  22.         AtttachFile:'StrQuery.php',//archivo a explorar
  23.         Args:'SetNewContent = 1',//variable que se envia, para declarar accion en el server
  24.         callback:function(){//funcion de retorno
  25.             if(this.responseText){
  26.                 if(Attr.Counter == 0){// validamos, si es 0 significa que es el primer msj que se muestra
  27.                     $('#BoxChat').html('<div id="thisText0">'+Attr.txt+'</div>');//imprimimos el primer msj dentro del div BoxChat
  28.                     Attr.Counter++; //aumentamos el contador para saber despues de que div imprimimos
  29.                 }else{//si no es 0 el counter imprimimos abajo del ultimo msj que se mostró
  30.                     $('#thisText'+(Attr.Counter - 1)).append('<div id="thisText'+Attr.Counter+'">'+Attr.txt+'</div>');
  31.                     Attr.Counter++; //aumentamos el contador para saber despues de que div imprimimos
  32.                 }
  33.                 alert('enviado')
  34.             }
  35.         }        
  36.     })
  37. }
  38.  
  39. function LISTEN(){
  40.     _$().Ajax({
  41.         Method:'POST',//metodo request
  42.         ContainerAXS:'#thisText'+(Attr.Counter - 1) +'.append', // establece el elemento y/o ubicacion donde se imprimira el nuevo contenido.. en este caso abajo del último div thisText + Attr.Counter... solo en caso de que haya contenido para imprimir...
  43.         AttachFile:'StrQuery.php', //Archivo a explorar
  44.         Args:'GetNewContent = 1', //variable que se envia, para declarar accion en el server
  45.         Loader:true, //muestra un msj preestablecido o personalizado donde se cargará el nuevo contenido (opcional)
  46.         callback:function(){
  47.             if(this.responseText != 0){ //si es distinto de 0 hubo respuesta del server en nuevo contenido
  48.                 Attr.Counter++; //aumentamos el contador.. para luego saber despues de cual div imprimir...
  49.                 alert('recibido');
  50.             }
  51.         }
  52. })
  53. }

ok.. como veras mi amigo.. es un ejemplo pues bástante sencillo en cuanto a visibilidad.. ya que todo los parametros los tiene el método _$().Ajax internamente...
indudablemente.. si lo copias así tal cual no te funcionará eso es debido a que necesitas mi libreria donde tengo ese método.. pero descuida.. igual lo puedes hacer con Ajax de jQuery.. el punto que te quiero resaltar.. es el hecho del listener.. que como vez.. en este caso.. enbia 1 paramentro en bits... es obvio que si recibe respuesta pues la data aumenta.. depende del contenido que tenga que mostrar...

resalto.. que como los datos se van imprimiendo en "escalera" tiene que haber un contenedor.. en este caso "ChatBox" y dentro de el se va imprimiendo
<div id="thisText1">, <div id="thisText2">, <div id="thisText3"> <div id="thisText4">, <div id="thisText5"> etc.. etc.. ese es el trabajo del Attr.Counter, razón por lo cual ya no necesitas reimprimir todo el contenido como lo hacias...

de esta manera.. seguro estoy.. que lograrás tu objetivo, espero que no me haya faltado alguna coma o algo.. pues lo escribi en el bloc de notas.. creo que no...
cabe destacar.. que no descarto.. que debido al listener del setinterval... aúnque el recurso esta en lo mínimo.. aún así.. es un recurso.. que se está gastando... las soluciones mas optimas y de grados avanzados.. se entrelazan hacia las apps intermediarias.. o hacer del servidor un "socket" con conexiones abiertas.. permantentes.. esto quiere decir.. que el cliente no envia datos.. hasta no haber una accion... pero si recibe cuando el srvr tiene un cambio en los datos... por lo demas... está solución es factible... para lo que requieres.. una de tantas.. tal vez.. no la mejor...
bueno.. espero que te ayude en algo..

Saludos y Éxito

edito: si me falto cerrar una cadena y tambien una coma :P
__________________
Se acepta Karma (:

Si Dios con nosotros, quien contra nosotros !!

Última edición por Hugo_Euan; 20/08/2012 a las 16:55

Etiquetas: funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:39.