Foros del Web » Programando para Internet » Javascript »

[APORTE]:Chat básico con ajax(long polling)

Estas en el tema de [APORTE]:Chat básico con ajax(long polling) en el foro de Javascript en Foros del Web. Para los que no sepan que es long polling: Long polling: http://es.wikipedia.org/wiki/Tecnolo...h#Long_polling Polling: http://es.wikipedia.org/wiki/Polling El chat constará de 4 archivos: index.html Código HTML: <html> <head> ...
  #1 (permalink)  
Antiguo 17/11/2011, 13:52
Avatar de patkoala  
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 19
De acuerdo [APORTE]:Chat básico con ajax(long polling)

Para los que no sepan que es long polling:
Long polling:http://es.wikipedia.org/wiki/Tecnolo...h#Long_polling
Polling:http://es.wikipedia.org/wiki/Polling
El chat constará de 4 archivos:
index.html
Código HTML:
<html><head><script type="text/javascript">
nombre = prompt("Introduce tu nombre");
function xhr(){
if(window.XMLHttpRequest){
return new XMLHttpRequest();
} else if(window.ActiveXObject){
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
function mostrar(){
var peticion = xhr();
peticion.onreadystatechange = function () {
if(peticion.readyState == 4){
document.getElementById('cont').innerHTML += "<br/>" + peticion.responseText;
setTimeout("mostrar()",1);
}
}
peticion.open("POST","index.php",true);
peticion.send(null);
}
function crearquery(){
var texto = document.getElementsByTagName('textarea')[0].value;
var salida = "value=" + encodeURIComponent(texto) + "&nom=" + encodeURIComponent(nombre);
return salida;
}
function cambia(){
var peticion = xhr();
peticion.open("POST","introducir.php",true);
peticion.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
var query = crearquery();
peticion.send(query);
}
window.onload = mostrar;
</script>
</head><body><textarea></textarea><button onclick="cambia();">Enviar</button><div id="cont"></div></body></html> 
index.php
Código PHP:
<?php
set_time_limit
(0);
$fpa fopen("content.txt","r");
$fpa fgets($fpa);
while(
1){
$fp fopen("content.txt","r");
$fp fgets($fp);
if(
$fp != $fpa){
echo 
$fp;
break;
}
sleep(1);
}
?>
introducir.php
Código PHP:
<?php
$fp 
fopen("content.txt","w");
$valor $_POST['value'];
$nombre $_POST['nom'];
$valor "<b>".$nombre."</b> : ".$valor;
fwrite($fp,$valor);
?>
Y por último, un archivo llamado content.txt que estará vacio.


Próximamente intentaré explicar su funcionamiento, tengo un poco de prisas
  #2 (permalink)  
Antiguo 18/11/2011, 08:42
Avatar de patkoala  
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 19
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Explico el funcionamiento.
El archivo index.html envia una petición al archivo index.php.
El archivo index.php no termina de cargar ya que tiene un bucle infinito(además, nunca da error de tiempo de ejecucion gracias a set_time_limit), y en cada ciclo del bucle comprueba si el archivo context.txt ha cambiado su contenido(comparandolo con como estaba al principio).
Cita:
<?php
set_time_limit(0);
$fpa = fopen("content.txt","r");
$fpa = fgets($fpa);
while(1){
$fp = fopen("content.txt","r");
$fp = fgets($fp);
if($fp != $fpa){
echo $fp;
break;
}
sleep(1);
}
?>
Si el contenido cambia, muestra el contenido y termina el bucle.
En ese momento la peticion cambia su readyState a 4, y se ejecuta lo siguiente:
Cita:
document.getElementById('cont').innerHTML += "<br/>" + peticion.responseText;
setTimeout("mostrar()",1);
Que incluye en el div la respuesta del servidor, y acto seguido, envia otra petición igual a la primera.
Por otra parte la funcion cambia() sólo llama a un script que actualiza el contenido de context.txt con los parametros enviados(nombre y texto).
Cita:
function cambia(){
var peticion = xhr();
peticion.open("POST","introducir.php",true);
peticion.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
var query = crearquery();
peticion.send(query);
}
Y, eso es básicamente long-polling.
También podeis probar a editar externamente el archivo content.txt y comprobareis que lo introducido se añade a index.html
Buff, es más fácil aprender que enseñar
  #3 (permalink)  
Antiguo 03/03/2012, 10:11
 
Fecha de Ingreso: abril-2002
Mensajes: 186
Antigüedad: 22 años, 7 meses
Puntos: 2
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Lo estoy viendo y me gusta muchismo más que otros que he visto por la red.
Seguramente para mi uso concreto tendré que sustituir el fopen por consultas a mysql pero como base este código me parece super sencillo y eficiente.
Un saludo.
  #4 (permalink)  
Antiguo 03/03/2012, 10:59
 
Fecha de Ingreso: enero-2012
Ubicación: en buenos aires
Mensajes: 41
Antigüedad: 12 años, 10 meses
Puntos: 1
Respuesta: [APORTE]:Chat básico con ajax(long polling)

me encanta esto, muy bueno

tendrías un ejemplo con consultas a la base de datos
  #5 (permalink)  
Antiguo 04/03/2012, 09:30
 
Fecha de Ingreso: abril-2002
Mensajes: 186
Antigüedad: 22 años, 7 meses
Puntos: 2
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Hola en mi servidor local bajo Windows me funciona súper OK pero en el hosting lnux funciona bien hasta que lleva unos 20 min el chat abierto, me da este error.
El hosting es de pago y bueno.
¿Alguna sugerencia?
Un saludo.


<<
ERROR
The requested URL could not be retrieved

While trying to retrieve the URL: http://midominio.tk/pruebas/chat1/chat1.php

The following error was encountered:

Zero Sized Reply

Squid did not receive any data for this request.

Your cache administrator is webmaster.
>>
  #6 (permalink)  
Antiguo 04/03/2012, 09:33
 
Fecha de Ingreso: abril-2002
Mensajes: 186
Antigüedad: 22 años, 7 meses
Puntos: 2
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Cita:
Iniciado por victorfz Ver Mensaje
Hola en mi servidor local bajo Windows me funciona súper OK pero en el hosting lnux funciona bien hasta que lleva unos 20 min el chat abierto, me da este error.
El hosting es de pago y bueno.
¿Alguna sugerencia?
Un saludo.


<<
ERROR
The requested URL could not be retrieved

While trying to retrieve the URL: http://midominio.tk/pruebas/chat1/chat1.php

The following error was encountered:

Zero Sized Reply

Squid did not receive any data for this request.

Your cache administrator is webmaster.
>>
Solo decir que ya he probado el aumentar el tiempo sleep(1); hasta 20 segudos pero el fallo me lo sigue dando.
Un saludo.
  #7 (permalink)  
Antiguo 04/03/2012, 10:21
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, 6 meses
Puntos: 834
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Mi sugerencia es que tomes ese tipo de scripts (y otros semejantes: http://www.disegnocentell.com.ar/notas2.php?id=240) como experimentos interesantes, pero no para usar en casos reales sobre todo en Apache, si es que esperás muchos usuarios. Lo más probable es que estés sufriendo un mecanismo de seguridad colocado por tu administrador de hosting para evitar fugas de recursos.
Para ese tipo de cosas lo que debés usar es servidores de sockets o alguna alternativa moderna como Node.js
  #8 (permalink)  
Antiguo 06/03/2012, 10:15
Avatar de patkoala  
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 19
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Cita:
Iniciado por Panino5001 Ver Mensaje
Mi sugerencia es que tomes ese tipo de scripts (y otros semejantes: http://www.disegnocentell.com.ar/notas2.php?id=240) como experimentos interesantes, pero no para usar en casos reales sobre todo en Apache, si es que esperás muchos usuarios. Lo más probable es que estés sufriendo un mecanismo de seguridad colocado por tu administrador de hosting para evitar fugas de recursos.
Para ese tipo de cosas lo que debés usar es servidores de sockets o alguna alternativa moderna como Node.js
Exacto, debe ser sólo un experimento.
Sobretodo, porque tiene evidentes fallos de seguridad.
Muchas gracias a todos :)
  #9 (permalink)  
Antiguo 06/03/2012, 11:16
 
Fecha de Ingreso: abril-2002
Mensajes: 186
Antigüedad: 22 años, 7 meses
Puntos: 2
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Alguien conoce algún ejemplo muy básico que pueda usar para explotación en Intranet para un máximo de 20 usuarios de forma simultanea??
El tema de seguridad para mi no es primorcial ya que es para un entorno ya seguro.
De todas formas sustituyendo el bucle infinito que muestro abajo que es lo que me da problemas con el servidor por un setInterval() de javascript como lo veís???

Código PHP:
<?php
set_time_limit
(0);
$fpa fopen("content.txt","r");
$fpa fgets($fpa);
while(
1){
$fp fopen("content.txt","r");
$fp fgets($fp);
if(
$fp != $fpa){
echo 
$fp;
break;
}
sleep(1);
}
?>
  #10 (permalink)  
Antiguo 07/03/2012, 09:54
Avatar de patkoala  
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 19
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Cita:
Iniciado por victorfz Ver Mensaje
De todas formas sustituyendo el bucle infinito que muestro abajo que es lo que me da problemas con el servidor por un setInterval() de javascript como lo veís???
Funcionar funcionaría, pero eso ya es polling
  #11 (permalink)  
Antiguo 27/06/2012, 10:52
 
Fecha de Ingreso: junio-2012
Mensajes: 2
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Hola buen día, he estado probando este chat, lo implemente con JSP y java, ya lo tengo terminado y funciona correctamente en chrome y mozilla, pero en explorer (probe en las versiones 9.0.8112.16421 y el 8.0.7600 ) observo el siguiente comportamiento:

el bucle infinito del archivo INDEX, es invocado paulatinamente por: if(peticion.readyState == 4), como si el archivo de texto content.txt, cambiara, sin embargo el archivo content.txt, no ha cambiado, pareciera que : readyState == 4 , no estaria funcionando correctamente.

Por favor, si alguien puede ayudarme, gracias
  #12 (permalink)  
Antiguo 28/06/2012, 11:33
Avatar de patkoala  
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 19
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Creo que no he entendido del todo la duda.
Entendí que dices que readyState no funciono.
Probé de nuevo el script y en Internet Explorer funciona.
Puedes probar a ejecutar directamente el script index.php para comprobar si hay algún error, ya que puede ser que si no es un servidor local no te permita un bucle "semi-infinito"
  #13 (permalink)  
Antiguo 28/06/2012, 18:52
 
Fecha de Ingreso: junio-2012
Mensajes: 2
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: [APORTE]:Chat básico con ajax(long polling)

Bueno en primer lugar gracias por responder, efectivamente es un poco complicado explicar el problema que tengo, pero voy a tratar de explicarlo mejor. Por otro lado este chat lo he implementado con: RESIN, JSP y java, por lo que he renombrado el index.php como index.jps y el introducir.php como introducir.jsp

El error como tal no es de sintaxis, y tienes razón si funciona el index.php, como dije anteriormente en mozilla y en chrome me funciona correctamente, en explorer también funciona, con la excepcion de que algunas veces los mensajes enviados no se visualizan en el area de mensajes, por esta razón, estube buscando cual puede ser la razon, y creo que es esta que detallo a continuación:

1.- Cuando inicio el chat, se activa el while infinito del index.jsp, la salida la muestro en la consola del RESIN:




2.- Luego de transcurrido unos 10 segundos, sin que se haya mandado ningun mensaje, tampoco se cambio el archivo de texto content.txt, sucede lo siguiente, como dije no he mandado ningun mensaje tampoco he cambiado content.txt, el codigo if(peticion.readyState == 4) detecta como si hubiera un cambio en content.txt, es decir se pone a valor 4 y se invoca nuevamente al index.jsp, y se generan 2 instancias del while infinito, como se muestra en la imagen:



Despues de cierto tiempo, codigo if(peticion.readyState == 4), detecta como si hubiera un cambio en content.txt, y nuevamente invoca otro while y asi susecivamente.

Patkoala, de antemano agradezco tu ayuda, y solo comentarte, este chat con las bases que tu publicaste lo tengo terminado y ya lo estaba utilizando en mi sitio web gastodiario.com, para brindar soporte técnico en linea, pero como en IE todavia no funciona del todo bien lo he suspendido y bueno algun rato cuando tengas tiempo, podemos coordinar para que te muestre el chat terminado.

Última edición por eloyquispe; 28/06/2012 a las 19:04
  #14 (permalink)  
Antiguo 29/03/2013, 19:44
Avatar de eagle_knight  
Fecha de Ingreso: marzo-2013
Mensajes: 14
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: [APORTE]:Chat básico con ajax(long polling)

POR FAVOR!!!, alguien podria traducir de php a jsp?....

Etiquetas: ajax, chat, long, php, polling
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.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:34.