Ver Mensaje Individual
  #27 (permalink)  
Antiguo 20/08/2012, 11:27
Avatar de Hugo_Euan
Hugo_Euan
 
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 13 años, 10 meses
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