¿Hay alguna forma de EMPUJAR datos del servidor web al navegador?

134

Por supuesto, conozco a Ajax, pero el problema con Ajax es que el navegador debe sondear el servidor con frecuencia para encontrar si hay nuevos datos. Esto aumenta la carga del servidor.

¿Existe algún método mejor (incluso usando Ajax) que no sea sondear el servidor con frecuencia?

Niyaz
fuente
1
No estoy seguro de que exista. Para simplificarlo conceptualmente para la aplicación, supongo que podría implementar una capa de transporte además de las solicitudes de sondeo, y así eliminar la responsabilidad de sondeo de la lógica de su aplicación. ¿Quizás alguien ya haya implementado esto? <strong> Editar: </strong> Aparentemente se llama <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> Ajax inverso </a> y <a href = " en.wikipedia.org/wiki/Comet_ ( programación) "> Cometa </ ​​a >, pero hasta ahora parece que tiene que implementarlo usted mismo. ¿Una biblioteca de JavaScript para esto, alguien?
Anders Sandvig
1
@Rachel: actualizaciones en vivo para que pueda ver lo que otros están haciendo. Bueno para sitios como StackOverflow y para aplicaciones web para colaboración como Google docs.
Itai Bar-Haim
1
Cualquiera que haga este tipo de cosas en 2016 probablemente encontrará que los websockets son una mejor opción para este tipo de comunicación.
Sombra

Respuestas:

37

Sí, se llama Reverse Ajax o Comet . Comet es básicamente un término general para diferentes formas de abrir solicitudes HTTP de larga duración para enviar datos en tiempo real a un navegador web. Recomiendo StreamHub Push Server , tienen algunas demostraciones geniales y es mucho más fácil comenzar que cualquiera de los otros servidores. Consulte el Tutorial de introducción a Comet y StreamHub para obtener una introducción rápida. Puede usar Community Edition, que está disponible para descargar de forma gratuita pero está limitado a 20 usuarios simultáneos. La versión comercial bien vale la pena solo por el soporte además de obtener adaptadores de cliente SSL y Desktop .NET y Java. La ayuda está disponible a través del Grupo de Google, hay un buen montón de tutoriales en la red y también hay un adaptador GWT Comet .

Nosrama
fuente
1
Definitivamente el camino a seguir, una vez llegue a la implementación de uno mismo se da cuenta de lo mucho que hay que hacer - reconexión, a largo votación, iframes streaming, soporte multi-navegador, HTTPS y ...
Corehpf
2
Una explicación de lo que es Comet ayudaría a esta respuesta
Kevin Monk,
1
@Satir: agregó una explicación rápida. Otras respuestas tienen enlaces al artículo de Wikipedia.
Nosrama
32

Hoy en día deberías usar WebSockets. Este es el estándar de 2011 que permite iniciar conexiones con HTTP y luego actualizarlas a una comunicación bidireccional cliente-servidor basada en mensajes.

Puede iniciar fácilmente la conexión desde javascript:

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

El manejo del lado del servidor depende de su pila de tecnología.

pafinde
fuente
2
Vs eventos enviados por el servidor: stackoverflow.com/questions/5195452/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8
Estoy totalmente de acuerdo ... Usar HTTP para la comunicación bidireccional es como pensar en llamadas REST para hacer que Mario salte sobre los caparazones de las tortugas ... es una locura. No NECESITA hacer solicitudes y esperar respuestas para que un simple botón empuje a la gente ... Simplemente no lo hace. HTTP es un protocolo de documento. Protocolo de Transferencia de Hipertexto. Ajax Push es una forma increíblemente compleja de eludir HTTP para hacer lo que hace WebSocket por diseño. Deja de ser tonto y usa la herramienta adecuada para el trabajo.
Nick Steele
¡realmente te gustan las elipses y, a veces, una nueva forma de cuatro puntos que llamaré "puntos suspensivos"!
imbatman
10

Investigue Comet (una parodia del hecho de que Ajax es un agente de limpieza y también lo es Comet) que básicamente es "Ajax inverso". Tenga en cuenta que esto requiere una conexión de servidor de larga duración para que cada usuario reciba notificaciones, así que tenga en cuenta las implicaciones de rendimiento al escribir su aplicación.

http://en.wikipedia.org/wiki/Comet_(programming)

Dan Herbert
fuente
5

Sugeriría encarecidamente invertir algo de tiempo en Comet, pero no conozco una implementación o biblioteca real que pueda usar.

Para una especie de "panel de control del centro de llamadas" de una aplicación web que implicaba actualizar el estado del agente y la cola de llamadas para un Callcenter en vivo, desarrollamos una solución interna que funciona, pero que está muy lejos de una biblioteca que pueda usar.

Lo que hicimos fue implementar un pequeño servicio en el servidor que habla con el sistema telefónico, espera nuevos eventos y mantiene una fotografía de la situación. Este servicio proporciona un pequeño servidor web.

Nuestros clientes web se conectan a través de HTTP a este servidor web y solicitan la última foto (codificada en XML), la muestran y luego vuelven a pedir la nueva foto. El servidor web en este punto puede:

  • Devuelve la nueva foto, si hay una
  • Bloquee al cliente durante unos segundos (30 en nuestra configuración) esperando que ocurra algún evento y cambie la fotografía. Si no se generó ningún evento en ese punto, devuelve la misma foto, solo para permitir que la conexión permanezca viva y no agote el tiempo de espera del cliente.

De esta manera, cuando los clientes sondean, obtiene una respuesta en un máximo de 0 a 30 segundos. Si ya se generó un nuevo evento, lo obtiene de inmediato), de lo contrario, se bloquea hasta que se genere un nuevo evento.

Es básicamente un sondeo, pero es un sondeo algo inteligente para no sobrecalentar el servidor web. Si Comet no es su respuesta, estoy seguro de que esto podría implementarse utilizando la misma idea pero utilizando más extensamente AJAX o codificación en JSON para obtener mejores resultados. Esto fue diseñado antes de la era AJAX, por lo que hay mucho margen de mejora.

Si alguien puede proporcionar una implementación ligera real de esto, ¡genial!

Pablo Alsina
fuente
5

Una alternativa interesante a Comet es usar sockets en Flash.

Gilles
fuente
2

Hay otros métodos No estoy seguro si son "mejores" en su situación. Podría tener un applet de Java que se conecta al servidor al cargar la página y espera a que el servidor envíe cosas. Sería un poco más lento en el inicio, pero permitiría que el navegador reciba datos del servidor de forma poco frecuente, sin sondeo.

Kibbee
fuente
2

Puede usar una aplicación Flash / Flex en el cliente con BlazeDS o LiveCycle en el lado del servidor. Los datos se pueden enviar al cliente mediante una conexión RTMP. Tenga en cuenta que RTMP utiliza un puerto no estándar. Pero puede recurrir fácilmente al sondeo si el puerto está bloqueado.

Zumbido
fuente
2

Es posible lograr lo que apunta a través del uso de conexiones http persistentes.

Mira el artículo de Comet en wikipedia, es un buen lugar para comenzar.

No está proporcionando mucha información, pero si está buscando construir algún tipo de sitio impulsado por eventos (a'la digg spy) o algo por el estilo, probablemente esté buscando implementar un IFRAME oculto que se conecte a una url donde la conexión nunca se cierra y luego empujará etiquetas de script del servidor al cliente para realizar las actualizaciones.

Markus Olsson
fuente
1

Una vez que se abre una conexión con el servidor, se puede mantener abierta y el servidor puede enviar contenido hace mucho tiempo, multipart/x-mixed-replacepero no funcionó en IE.

Creo que puede hacer cosas inteligentes con el sondeo que hace que funcione más como empujar, no enviando encabezados sin cambios del contenido, pero dejando la conexión abierta, pero nunca he hecho esto.

chispas
fuente