Existe-t-il un moyen de PUSH des données du serveur Web au navigateur?


134

Bien sûr, je connais Ajax, mais le problème avec Ajax est que le navigateur doit fréquemment interroger le serveur pour savoir s'il existe de nouvelles données. Cela augmente la charge du serveur.

Existe-t-il une meilleure méthode (même en utilisant Ajax) autre que d'interroger fréquemment le serveur?


1
Je n'en suis pas sûr. Pour simplifier conceptuellement l'application, je suppose que vous pouvez implémenter une couche de transport en plus des demandes d'interrogation, et ainsi supprimer la responsabilité d'interrogation de la logique de votre application. Peut-être que quelqu'un a même déjà mis en œuvre cela? <strong> Edit: </strong> Apparemment, cela s'appelle <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> reverse Ajax </a> et <a href = " en.wikipedia.org/wiki/Comet_ ( programmation) "> Comet </ a >, mais jusqu'à présent, il semble que vous deviez l'implémenter vous-même. Une bibliothèque JavaScript pour ça, n'importe qui?
Anders Sandvig

1
@Rachel - Mises à jour en direct pour que vous puissiez voir ce que font les autres. Idéal pour les sites comme StackOverflow et pour les applications Web de collaboration comme Google Docs.
Itai Bar-Haim

1
Quiconque ferait ce genre de chose en 2016 trouverait probablement que les websockets sont un meilleur choix pour ce type de communication.
Shadow

Réponses:



37

Oui, ça s'appelle Reverse Ajax ou Comet . Comet est essentiellement un terme générique désignant différentes façons d'ouvrir des requêtes HTTP de longue durée afin de transmettre des données en temps réel à un navigateur Web. Je recommanderais StreamHub Push Server , ils ont des démos intéressantes et il est beaucoup plus facile de démarrer que n'importe quel autre serveur. Consultez le tutoriel Getting Started with Comet et StreamHub de pour une introduction rapide. Vous pouvez utiliser l'édition communautaire qui est disponible en téléchargement gratuitement mais est limitée à 20 utilisateurs simultanés. La version commerciale en vaut la peine pour le support seul et vous obtenez des adaptateurs client SSL et Desktop .NET & Java. L'aide est disponible via le groupe Google, il y a un bon tas de tutoriels sur le net et il y a aussi un adaptateur GWT Comet .


1
Certainement la voie à suivre, une fois que vous avez commencé à l'implémenter vous-même, vous réalisez tout ce qu'il y a à faire - reconnexion, interrogation longue, iframes en continu, prise en charge de plusieurs navigateurs, HTTPS ...
Corehpf

2
Une explication de ce qu'est Comet aiderait cette réponse
Kevin Monk

1
@Satir: a ajouté une explication rapide. D'autres réponses ont des liens vers l'article de Wikipédia.
Nosrama

32

De nos jours, vous devez utiliser WebSockets. Il s'agit de la norme 2011 qui permet d'initier des connexions avec HTTP, puis de les mettre à niveau vers une communication bidirectionnelle basée sur les messages client-serveur.

Vous pouvez facilement lancer la connexion à partir de 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
};

La gestion du côté serveur dépend de votre pile de tenchnologie.



8
Je suis tout à fait d'accord ... Utiliser HTTP pour la communication bidirectionnelle, c'est comme penser dans les appels REST pour faire sauter Mario sur des carapaces de tortues ... c'est de la folie. Vous n'avez pas BESOIN de faire des demandes et d'attendre des réponses pour que de simples boutons poussent les gens ... Vous n'avez tout simplement pas. HTTP est un protocole de document. Protocole de transfert hypertexte. Ajax Push est un moyen incroyablement complexe de contourner HTTP pour faire ce que WebSocket fait par conception. Arrêtez d'être maladroit et utilisez le bon outil pour le travail.
Nick Steele

vous aimez vraiment les ellipses, et parfois une nouvelle forme de quatre points que j'appellerai "ellipsos"!
imbatman

10

Regardez dans Comet (une parodie sur le fait qu'Ajax est un agent de nettoyage et est donc Comet) qui est fondamentalement «Ajax inversé». Sachez que cela nécessite une connexion au serveur de longue durée pour que chaque utilisateur reçoive des notifications, alors soyez conscient des implications sur les performances lors de l'écriture de votre application.

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



5

Je suggérerais fortement d'investir du temps sur Comet, mais je ne connais pas d'implémentation ou de bibliothèque réelle que vous pourriez utiliser.

Pour une sorte de "panneau de contrôle du centre d'appels" d'une application Web qui impliquait la mise à jour de l'état de l'agent et de la file d'attente pour un centre d'appels en direct, nous avons développé une solution interne qui fonctionne, mais qui est loin d'une bibliothèque que vous pourriez utiliser.

Ce que nous avons fait, c'est de mettre en place un petit service sur le serveur qui communique avec le système téléphonique, attend de nouveaux événements et conserve une photo de la situation. Ce service fournit un petit serveur Web.

Nos clients Web se connectent via HTTP à ce serveur Web et demandent la dernière photo (codée en XML), l'affiche et recommence, demandant la nouvelle photo. À ce stade, le serveur Web peut:

  • Renvoyez la nouvelle photo, s'il y en a une
  • Bloquez le client pendant quelques secondes (30 dans notre configuration) en attendant qu'un événement se produise et changez la photo. Si aucun événement n'a été généré à ce stade, il renvoie la même photo, uniquement pour permettre à la connexion de rester active et de ne pas expirer le client.

De cette façon, lorsque les clients interrogent, ils obtiennent une réponse en 0 à 30 secondes maximum. Si un nouvel événement a déjà été généré, il l'obtient immédiatement), sinon il se bloque jusqu'à ce qu'un nouvel événement soit généré.

C'est essentiellement un sondage, mais c'est un sondage assez intelligent pour ne pas surchauffer le serveur Web. Si Comet n'est pas votre réponse, je suis sûr que cela pourrait être implémenté en utilisant la même idée mais en utilisant plus largement AJAX ou le codage en JSON pour de meilleurs résultats. Cela a été conçu à l'époque pré-AJAX, il y a donc beaucoup de place à l'amélioration.

Si quelqu'un peut fournir une implémentation légère et réelle, c'est parfait!


5

Une alternative intéressante à Comet est d'utiliser des sockets dans Flash.




2

Il existe d'autres méthodes. Je ne sais pas s'ils sont «meilleurs» dans votre situation. Vous pouvez avoir une applet Java qui se connecte au serveur lors du chargement de la page et attend que des éléments soient envoyés par le serveur. Ce serait un peu plus lent au démarrage, mais permettrait au navigateur de recevoir des données du serveur de manière peu fréquente, sans interrogation.


2

Vous pouvez utiliser une application Flash / Flex sur le client avec BlazeDS ou LiveCycle côté serveur. Les données peuvent être transmises au client à l'aide d'une connexion RTMP. Sachez que RTMP utilise un port non standard. Mais vous pouvez facilement revenir à l'interrogation si le port est bloqué.


2

Il est possible d'atteindre ce que vous visez grâce à l'utilisation de connexions http persistantes.

Consultez l' article de Comet sur wikipedia, c'est un bon point de départ.

Vous ne fournissez pas beaucoup d'informations, mais si vous cherchez à créer une sorte de site événementiel (a'la digg spy) ou quelque chose du genre, vous envisagerez probablement d'implémenter un IFRAME caché qui se connecte à une url où la connexion ne se ferme jamais et vous allez ensuite pousser les balises de script du serveur vers le client afin d'effectuer les mises à jour.



1

Une fois qu'une connexion est ouverte au serveur, elle peut rester ouverte et le serveur peut pousser le contenu il y a longtemps que je l'ai fait avec l'utilisation, multipart/x-mixed-replacemais cela n'a pas fonctionné dans IE.

Je pense que vous pouvez faire des choses intelligentes avec le sondage qui le fait fonctionner plus comme push en n'envoyant pas les en-têtes de contenu inchangés mais en laissant la connexion ouverte, mais je n'ai jamais fait cela.





En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.