Existe-t-il un moyen de pousser les données du serveur web vers le navigateur?
Bien sûr, je suis au courant D'Ajax, mais le problème avec Ajax est que le navigateur doit interroger le serveur fréquemment pour trouver s'il y a de nouvelles données. Cela augmente la charge du serveur.
Existe-t-il une meilleure méthode (même en utilisant Ajax) autre que l'interrogation fréquente du serveur?
18 réponses
Oui, ce que vous cherchez est COMET http://en.wikipedia.org/wiki/Comet_ (programmation). D'autres bons termes Google à rechercher sont AJAX-push et reverse-ajax.
Oui, il est appelé Reverse Ajax ou Comète. Comet est essentiellement un terme générique pour différentes façons d'ouvrir des requêtes HTTP de longue durée afin de pousser des données en temps réel vers un navigateur web. Je recommande Streamhub Push Server , ils ont des démos cool et il est beaucoup plus facile de commencer avec que l'un des autres serveurs. Consultez le tutoriel Mise en route avec Comet et StreamHub pour une introduction rapide. Vous pouvez utiliser L'édition communautaire qui est disponible en téléchargement gratuit, mais est limité à 20 utilisateurs simultanés. La version commerciale en vaut la peine pour le support seul, plus vous obtenez SSL et Desktop. net & Java adaptateurs clients. L'aide est disponible via le Google Group , Il y a un bon tas de tutoriels sur le net et il y a aussi un adaptateur GWT Comet.
De nos jours, vous devriez 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é sever dépend de votre pile tenchnology.
Regardez dans Comet (une parodie sur le fait que Ajax est un agent de nettoyage et est donc Comet) qui est fondamentalement " reverse Ajax."Sachez que cela nécessite une connexion serveur de longue durée pour que chaque utilisateur reçoive des notifications, alors soyez conscient des implications en termes de performances lors de l'écriture de votre application.
Comète est certainement ce que vous voulez. En fonction de vos exigences linguistiques/framework, différentes bibliothèques de serveurs sont disponibles. Par exemple, WebSync est un serveur Comet intégré à IIS pour ASP.NET/C#/IIS développeurs , et il y a aussi un tas d'autres serveurs autonomes si vous avez besoin d'une intégration plus étroite avec d'autres langues.
Je suggère fortement d'investir du temps sur Comet, mais je ne connais pas une implémentation ou une bibliothèque réelle que vous pourriez utiliser.
Pour une sorte de" panneau de configuration callcenter " d'une application web qui impliquait la mise à jour de l'état de l'agent et de la file d'appels pour un Callcenter 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 était de mettre en œuvre un petit service sur le serveur qui parle au système téléphonique, attend de nouveaux événements et maintient un photographie 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 puis recommence, demandant la nouvelle photo. Le serveur web à ce stade peut:
- renvoie 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 change la photo. Si aucun événement n'a été généré à ce stade, il retourne la même photo, seulement pour permettre à la connexion de rester en vie et non le délai d'attente du client.
De cette façon, lorsque les clients interrogent, ils obtiennent une réponse en 0 à 30 secondes max. Si un nouvel événement a déjà été généré, il l'obtient immédiatement), sinon il bloque jusqu'à ce qu'un nouvel événement soit généré.
C'est essentiellement un sondage, mais c'est un sondage un peu 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 codage en JSON pour de meilleurs résultats. Cela a été conçu avant L'ère AJAX, donc il y a beaucoup de place pour l'amélioration.
Si quelqu'un peut fournir une implémentation légère réelle de ceci, génial!
Une alternative intéressante à Comet est d'utiliser des sockets dans Flash.
Un autre moyen standard est SSE (événements envoyés par le serveur, également appelés EventSource , après L'objet JavaScript).
Comet a été inventé par Alex Russell de Dojo Toolkit ( http://www.dojotoolkit.org ). Voici un lien pour plus d'informations http://cometdproject.dojotoolkit.org/
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 les choses soient envoyées 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.
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é.
Il est possible de réaliser ce que vous visez grâce à l'utilisation de connexions http persistantes.
Consultez l'article Comet sur wikipedia, c'est un bon point de départ.
Vous ne fournissez pas beaucoup d'informations, mais si vous cherchez à construire une sorte de site axé sur les événements (a'la digg spy) ou quelque chose dans le sens de cela, vous chercherez probablement à implémenter un iframe caché qui se connecte à une url où la connexion ne se ferme jamais et vous pousserez script-tags du serveur au client afin d'effectuer les mises à jour.
Pourrait être utile de vérifier Meteor Server qui est un serveur web conçu pour COMET. Nice démo et il est aussi utilisé par twitterfall.
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 j'ai fait avec multipart/x-mixed-replace
mais cela n'a pas fonctionné dans IE.
Je pense que vous pouvez faire des choses intelligentes avec l'interrogation qui le fait fonctionner plus comme push en n'envoyant pas d'en-têtes inchangés mais en laissant la connexion ouverte mais je n'ai jamais fait cela.
Vous pouvez essayer notre composant comète - bien que ce soitextrêmement expérimental...!
Veuillez vérifier cette bibliothèque https://github.com/SignalR/SignalR pour savoir comment envoyer des données aux clients de manière dynamique au fur et à mesure de leur disponibilité
Vous pouvez également regarder dans Java Pushlets Si vous utilisez des pages jsp.