Pousser les données du serveur vers le client sans demande du client?

11

J'ai remarqué en parcourant Stack Exchange qu'il y avait des notifications dynamiques comme "3 nouveaux messages, cliquez pour afficher". Je veux avoir ce genre de mise à jour dynamique pour ce que je vais expliquer.

Disons que je veux créer un carrousel / diaporama de 10 articles d'actualité récents. Je veux que ce carrousel soit mis à jour toutes les heures, dans une file d'attente. Les articles plus récents pousseront les articles plus anciens hors de la file d'attente. La solution du haut de ma tête serait.

  1. L'utilisateur se connecte au client.
  2. Le client calcule le nombre de minutes jusqu'à la prochaine heure et définit une minuterie à exécuter à l'heure.
  3. À l'heure, envoyez une demande au serveur pour tout nouvel article d'actualité qui n'a pas déjà été dans le carrousel.
  4. Gérer la réponse.
  5. Réinitialiser la minuterie.

Est-ce une stratégie acceptable? Puis-je y parvenir sans me fier aux demandes des clients? En d'autres termes, comment Stack Exchange réalise-t-il sa mise à jour dynamique?

Eric Guan
la source
4
Jetez un œil à SignalR.
Robert Harvey
Je vous recommande de lire sur RSS et AJAX pour des idées. RSS est un exemple de protocole standard pour les flux d'abonnement, et AJAX est un concept de haut niveau pour savoir comment mettre à jour un client (navigateur) sans recharger la page. Je parierais que c'est ainsi que fonctionne Stack Exchange.
1
@Snowman Stack Exchange utilise WebSocket. Voir meta.stackexchange.com/questions/10369/…
Robert Harvey
Le client est-il un navigateur, un client personnalisé ou autre chose?
2015
C'est quelque peu hostile aux utilisateurs, mais vous pouvez faire en sorte que la page HTML se rafraîchisse toutes les 15 minutes environ. La plupart des pages Web d'actualités le font.
Gilbert Le Blanc

Réponses:

7

Afin de pousser les données, vous devez identifier un client, et cela se fera en abonnant le client au serveur. Une fois cela fait, vous auriez une liste de clients abonnés avec une connexion persistante.

Selon ce que vous voulez réaliser, je dirais qu'il est préférable que le client demande au serveur, afin que vous n'ayez pas à maintenir une connexion persistante et à utiliser des protocoles de communication de demande / réponse en HTTP.

Un exemple qui vient à l'esprit pour maintenir une connexion persistante serait un système de messagerie instantanée / messagerie instantanée, car la communication devrait avoir lieu en temps réel.

Gardez à l'esprit que les connexions persistantes sont généralement mises en œuvre via l'utilisation de sockets, ce qui ajoute une superposition dans la mise en œuvre de votre propre protocole de communication, chiffrement, etc.

Christopher Francisco
la source
2

Fondamentalement, vous devez envoyer des données au client, et comme une communication bidirectionnelle ne fait pas partie du protocole http, il n'est pas facile de l'implémenter vous-même.

La solution à votre problème est socket.io

Comme l'indique son site Web,

"Socket.IO permet une communication événementielle bidirectionnelle en temps réel. Il fonctionne sur toutes les plates-formes, navigateurs ou appareils, en se concentrant également sur la fiabilité et la vitesse."

J'espère que cela résoudra votre problème.

Alok Saini
la source
7
Il serait utile, si vous indiquez si et comment vous êtes affilié à socket.io et comment cela aidera à résoudre le problème des questionneurs en fonction de vos connaissances / expérience avec le framework (contrairement à un simple "énoncé de mission" du site)
Benni
Les WebSockets sont strictement préférables à Socket.IO maintenant que tous les principaux navigateurs implémentent la norme. La plupart des langages principaux ont des implémentations websocket, mais pas celles socket.io. Socket.io ajoute une structure supplémentaire aux messages, il n'est donc pas facilement compatible non plus.
Alex Reinking
1

Je ne peux pas parler de la façon dont SE le fait, bien qu'il s'agisse d'un site Web, il existe plusieurs façons de le faire, qui pourraient inclure un ensemble de tâches cron pour exécuter un script php / asp / what-have-you à l'heure pour envoyer des données. Mais ce serait le cas si vous recherchiez une solution Web uniquement.

Mais puisque vous mentionnez un client, vous pouvez peut-être créer un fichier avec la date / heure de la dernière mise à jour de nouvelles pour ce client et demander au client de vérifier la valeur stockée dans ledit fichier et de la comparer à l'heure système de l'utilisateur pour voir si une heure s'est écoulé depuis la dernière mise à jour. Si cela fait au moins une heure, le client demande le dernier flux de nouvelles à votre serveur qui renvoie ensuite le dernier flux de nouvelles au client.

J'éviterais d'utiliser une minuterie ou du moins d'utiliser une minuterie uniquement car cette méthode ne fonctionnerait que si l'utilisateur gardait le client ouvert pour que la minuterie continue de fonctionner. Mais si vous avez (également) le fichier comme je l'ai suggéré, vous pouvez créer un sous-programme pour ouvrir le fichier, stocker l'heure dans une variable et la comparer à l'heure du système et faire la demande si cela fait au moins une heure. Ensuite, vous appelez simplement le sous-marin en relation avec certains événements. Je l'appellerais certainement lors du chargement du formulaire, car si l'utilisateur redémarre simplement son client, vous voudrez les dernières nouvelles. Si cela avait été quelques jours depuis qu'ils étaient sur le client, cela montrerait des nouvelles aussi anciennes. Attachez le moins possible ce sous à la charge du client et lancez la minuterie comme vous l'avez suggéré.

Je m'excuse si j'ai mal compris ce que vous vouliez car je ne suis pas totalement certain de ce que vous cherchez. Mais j'espère que dans tous les cas, il y a quelque chose de valeur ici pour vous!

WeekendRockstar
la source