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.
- El usuario inicia sesión en el cliente.
- 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.
- A la hora marcada, envíe una solicitud al servidor sobre cualquier artículo nuevo que no haya estado en el carrusel.
- Manejar la respuesta.
- 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?
Respuestas:
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.fuente
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.
fuente
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!
fuente