¿Transmitir datos del servidor al cliente sin una solicitud del cliente?


11

Durante la exploración de Stack Exchange, noté que hay notificaciones dinámicas como "3 mensajes nuevos, haga clic para mostrar". Quiero tener este tipo de actualización dinámica para lo que estoy a punto de explicar.

Digamos que quiero crear un carrusel / presentación de diapositivas de 10 artículos de noticias recientes. Quiero que este carrusel se actualice cada hora, en una cola. Los artículos más nuevos sacarán de la cola los artículos más antiguos. La solución fuera de mi cabeza sería.

  1. El usuario inicia sesión en el cliente.
  2. El cliente calcula el número de minutos hasta la marca de la próxima hora y establece un temporizador para ejecutar a la hora.
  3. A la hora marcada, envíe una solicitud al servidor sobre cualquier artículo nuevo que no haya estado en el carrusel.
  4. Manejar la respuesta.
  5. Restablecer temporizador.

¿Es esta una estrategia aceptable? ¿Puedo lograr esto sin depender de las solicitudes de los clientes? En otras palabras, ¿cómo logra Stack Exchange su actualización dinámica?


44
Echa un vistazo a SignalR.
Robert Harvey

Le recomiendo que lea en RSS y AJAX para obtener ideas. RSS es un ejemplo de un protocolo estándar para feeds de suscripción, y AJAX es un concepto de alto nivel sobre cómo actualizar un cliente (navegador) sin volver a cargar la página. Apuesto a que así es como funciona Stack Exchange.


¿Es el cliente un navegador, un cliente personalizado u otra cosa?
outis

Es algo hostil para el usuario, pero puede hacer que la página HTML se actualice cada 15 minutos más o menos. La mayoría de las páginas web de noticias hacen esto.
Gilbert Le Blanc

Respuestas:


7

Para enviar datos, tendría que identificar un Cliente, y eso se haría suscribiendo el cliente al servidor. Una vez hecho esto, tendría una lista de clientes suscritos con una conexión persistente.

Dependiendo de lo que quiera lograr, diría que es mejor que el cliente solicite al servidor, para que no tenga que mantener una conexión persistente y utilizar los protocolos de comunicación de solicitud / respuesta como HTTP.

Un ejemplo que viene a la mente para mantener una conexión persistente sería un sistema de chat en vivo / mensajería instantánea, ya que la comunicación debería ocurrir en tiempo real.

Tenga en cuenta que las conexiones persistentes generalmente se implementan mediante el uso de sockets, que agrega una superposición en la implementación de su propio protocolo de comunicación, cifrado, etc.


2

Básicamente, necesita enviar datos al cliente, y como una comunicación bidireccional no está dentro del alcance del protocolo http, no es fácil implementarlo usted mismo.

La solución de su problema es socket.io

Como dice su sitio web,

"Socket.IO permite la comunicación bidireccional basada en eventos en tiempo real. Funciona en todas las plataformas, navegadores o dispositivos, enfocándose igualmente en la confiabilidad y la velocidad".

Espero que esto resuelva su problema.


77
Sería útil si declara si y cómo está afiliado a socket.io y cómo ayudará a resolver el problema de los interrogadores en función de su conocimiento / experiencia con el marco (en contraste con una simple "declaración de misión" del sitio web)
Benni

Los WebSockets son estrictamente preferibles a Socket.IO ahora que todos los principales navegadores implementan el estándar. La mayoría de los idiomas principales tienen implementaciones de websocket, pero no las de socket.io. Socket.io agrega estructura adicional a los mensajes, por lo que tampoco es fácilmente compatible.
Alex Reinking

1

No puedo hablar sobre cómo lo hace SE, aunque dado que es un sitio web, hay varias formas en que podrían incluir un trabajo cron configurado para ejecutar un script php / asp / what-have-you cada hora para enviar datos. Pero esto sería si estuviera buscando una solución web únicamente.

Pero dado que está mencionando un cliente, quizás podría crear un archivo con la fecha / hora de la última actualización de noticias para ese cliente y hacer que el cliente verifique el valor almacenado en dicho archivo y lo compare con la hora del sistema del usuario para ver si es una hora ha pasado desde la última actualización. Si ha pasado al menos una hora, el cliente solicita la última transmisión de noticias de su servidor, que luego devuelve la última transmisión de noticias al cliente.

Evitaría usar un temporizador o al menos usar un temporizador únicamente porque ese método funcionaría solo si el usuario mantiene el cliente abierto para mantener el temporizador en funcionamiento. Pero si (también) tiene el archivo como sugerí, puede crear una subrutina para abrir el archivo, almacenar la hora en una variable y compararla con la hora del sistema y hacer la solicitud si ha pasado al menos una hora. Luego, simplemente realiza llamadas al sub en relación con ciertos eventos. Definitivamente lo llamaría en carga de formulario porque si el usuario solo está reiniciando su cliente, entonces querría las últimas noticias. Si hubieran pasado unos días desde que estuvieron en el cliente, entonces se mostrarían noticias tan antiguas. En lo más mínimo, ate ese sub a la carga del cliente e inicie el temporizador como sugirió.

Me disculpo si entendí mal lo que estaba buscando, ya que no estoy totalmente seguro de lo que está buscando. ¡Pero espero que de cualquier manera haya algo de valor aquí para ti!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.