Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Comet

Estas en el tema de Comet en el foro de Frameworks JS en Foros del Web. Hola, creo que este es el sistema que usa el chat de facebook: COMET Me pregunto como se hace, porque este sistema mantiene la conexion ...
  #1 (permalink)  
Antiguo 27/07/2009, 22:28
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 17 años, 2 meses
Puntos: 101
Hola, creo que este es el sistema que usa el chat de facebook: COMET
Me pregunto como se hace, porque este sistema mantiene la conexion con el servidor hasta que el servidor detecte un cambio y le debuelve la informacion.
Gracias
Salu2

Creo que ya se como:
Es como un ajax normal, pero envio el ultimo dato que tengo y si el dato no es igual al del servidro imprimo lo nuevo y vuelvo a mandar la peticion.

Algo como:
Código php:
Ver original
  1. set_time_limit(0); // Para que no alla limite
  2. while(true){ // para que repita simpre
  3. if(dato_bd()!=$dato_enviado_del_cliente){
  4. echo dato_nuevo();
  5. }
  6. sleep(1); // Dormimos 1 segundo, para hacer tiempo
  7. }
Masomenos deve ser haci, ya voy a hacer un ejemplo.
__________________
Half Music - www.halfmusic.com

Última edición por GatorV; 28/07/2009 a las 13:39
  #2 (permalink)  
Antiguo 28/07/2009, 13:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Comet

Facebook usa el protocolo BOSH para la transferencia del chat, junto con un Webserver que no cierra las conexiones como Jetty.

Esto es porque Apache por defecto usa un thread por conexión, si tienes 20 usuarios estas llegando a 20 threads de PHP que es el limite por defecto.

Saludos.
  #3 (permalink)  
Antiguo 28/07/2009, 18:08
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 17 años, 2 meses
Puntos: 101
Respuesta: Comet

Ahh, gracias!

Bueno estaba haciendo un chat con "comet", pero no me anda esta parte, solo me actualiza la primera ves vien y despues ya no, pero si hay nuevos datos.
Parte php:
Código php:
Ver original
  1. if(isset($_POST['indice'])){
  2.     $indice=$_POST['indice']; // El ultimo id que tiene el cliente
  3.     $ultimo=$HalfChat->ultimoComenario($_SESSION['sala']); // Sacamos el ultimo id de la sala
  4.     while($ultimo==$indice){ // SI es el mismo
  5.         $ultimo=$HalfChat->ultimoComenario($_SESSION['sala']); // Sacamos otra vees
  6.         sleep(3); // Esperamos 3 segundos
  7.     }
  8.     $comentarios=$HalfChat->verComentarios($_SESSION['sala']); // Si paso el while, es decir que ubo un cambio y sacamos los nuevo comentarios
  9.     $conexion=$HalfChat->isConection()?'true':'false'; // Vemos si no fue expulsado, para desirle al cliente que lo expulse
  10.     echo '{mensajes:"'.$comentarios.'",ultimaId:"'.$ultimo.'",conexion:'.$conexion.'}'; // Imprimimos los datos en  JSON
  11.     exit(); // Terminamos
  12. }
y el js:
Código javascript:
Ver original
  1. this.request=function(url,callback,parms){
  2.         var vars_temp='';
  3.         for(var par in parms)
  4.             vars_temp=vars_temp+'&'+par+'='+parms[par];
  5.         vars=vars_temp;
  6. //      alert("URL: "+url+" | Callback: "+callback+" | Parms: "+vars);
  7.         var Comet=this.xmlhttp();
  8.             Comet.open('post',url+'?'+Math.random(),true);
  9.             Comet.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  10.             Comet.onreadystatechange=function(){
  11.                 if(Comet.readyState==4){
  12. //                  alert("Comet.responseText: "+Comet.responseText);
  13.                     (callback||function(){})(Comet.responseText);
  14.                     Comet.abort();
  15.                     Comet=null;
  16.                 }
  17.             };
  18.             Comet.send(vars);
  19.     };
  20.     this.actualizarMensajes=function(){
  21.         var elwin=this;
  22.         this.request(this.configuracion.interfax,function(contenido){
  23.             var dom=elwin.dom(elwin.configuracion.divContenedor);
  24.             var data=(eval('('+contenido+')'));
  25.                 dom.innerHTML=data.mensajes;
  26.                 dom.scrollTop=dom.scrollHeight;
  27. //              alert("End! | "+elwin.ultimateId+" "+data.ultimaId);
  28.             elwin.ultimateId=data.ultimaId;
  29.             if(!data.conexion)
  30.                 document.location='index.php';
  31.             setTimeout(function(){
  32.                 elwin.actualizarMensajes();
  33.             },1000);
  34.         },{'indice':elwin.ultimateId});
  35.     };

Gracias
Salu2
__________________
Half Music - www.halfmusic.com
  #4 (permalink)  
Antiguo 29/07/2009, 22:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Comet

Comet no puede usarse con el protocolo XMLHttp normal, necesitas emular con un iframe, o si tienes Firefox 3.5 o Safari 4 o Chrome 2 puedes usar las nuevas opciones para el XMLHttp, ya que por defecto el objeto XMLHttp normal cierra la conexión al finalizar el request.

La idea de Comet es que la conexión sea permanente, y solo se haga push de los datos del server al cliente (por eso el usar un webserver como Jetty). Una muy buena implementación la encuentras en la librería de Dojo.

Saludos.
  #5 (permalink)  
Antiguo 29/07/2009, 23:28
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 17 años, 2 meses
Puntos: 101
Respuesta: Comet

Muchas gracias, ya me anda muy buen. Pense que era ajax normal xD
__________________
Half Music - www.halfmusic.com
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 20:07.