URL: https://linuxfr.org/users/the_glu/journaux/javascript-push Title: Javascript 'push' Authors: the_glu Date: 2009年11月12日T09:59:46+01:00 Tags: Score: 8 Bonjour les gens, Juste un petit journal pour présenter une truc qui pourrait intéresser des gens : J'ai voulu regarder comment faire du push javascript pour jouer un peu (on est d'accord, c'est pas vraiment du push mais on va faire semblant). Je sais peut être pas faire une recherche sur google, mais je suis tombé que sur des trucs qui ont l'air super compliqués à mettre en place, allant jusqu'à la mise en place d'un nom de domaine pour le système. En plus, à ce que j'ai vu, ce sont les clients eux même qui envoient les choses à envoyer aux autres clients et le serveur peut rien faire. Ça pue. J'ai donc fait mon propre système de push en javascript avec un nombre minimal de fonctionnalités, mais qui au moins marche (comme je veux) et qui est simple. Vu qu'apache adore gérer une tétrapétée de connexions ouvertes qui servent à rien, j'ai codé un serveur en python qui tourne sous un autre port et une petite librairie php qui va envoyer les données à envoyer au serveur python qui va les redistribuer aux clients. Y'a une notion de channel: Un client écoute que sur certains channels et donc reçoit les message que de ceux ci. Le channel 'debug' est réservé. En pratique : - Le serveur python attend les clients qui font une requête GET spécialement formatée. La connexion reste ouverte jusqu'à ce que des données pour le client arrivent ou que 25 secondes se sont écoulés. - Le client fait une requête au serveur python et attend des données. Si tout c'est bien passé (code http 200), il traite les données et recommence. - Le script qui veut envoyer des données aux clients les envoie dans un paquet udp au serveur python. Donc j'ai fait un truc en php, mais en brainfuck c'est possible aussi. J'ai la femme de faire un beau schéma mais vous voyez lisez l'idée. Avantage : - Apache meurt pas sous une tonne de connexions - Ça prend 30s à mettre en place - C'est pas compliqué et légé - C'est zoli Problèmes : - Je sais absolument pas si ça tiens la charge, si quelqu'un a 500 postes pour essayer.. - Ça marche pas avec opera et surement pleins d'autre navigateurs. Fx 3.5 et chrome ça marche donc bon :] Aussi fou que ça puisse paraitre, ça à marché du premier coup avec mon IE winé. J'ai pas trop compris pourquoi mais bon hein. J'espère que ça marche dans tous les cas (vu que j'étais en local), au pire y'a le [plugin google](http://code.google.com/intl/fr/chrome/chromeframe/) ;) Petite FAQ: - Depuis quand c'est possible de faire des requêtes ajax sur un autre port|domaine ? -- Depuis la création de l'header (entre autres) Access-Control-Allow-Origin. - Mais c'est pas sécurisé, tout le monde qui envoie un paquet UDP au serveur peut causer aux clients -- Non. Parce que d'abord iptables, ensuite il y a possibilité de définir un secret partagé entre le script php et le serveur python et enfin on peut changer le port. - Il se passe quoi si des données arrivent sur un channel alors que le client est entrain de se reconnecter ? -- Un id du dernier message envoyé est maintenu entre le client et le serveur, si quand le client se reconnecte des messages ont été envoyés pour lui, ils sont automatiquement réenvoyé au client. - Cool, mais si je veux envoyer des données en push à un seul client sans que les autres puissent écouter ? -- Le channel 'idclient-unsupersecreptdelamortquitue' devrais faire l'affaire ;) Tout ça en licence BSD parque pourquoi pas. Une petite capture [par ici](http://theglu.org/zuperpush.png), toutes les sources [par là](http://theglu.org/zuperpush.tar.gz). Jetez quand même un oeil (mais pas trop loin parque faudra aller le rechercher) dans la source du serveur, y'a 2-3 options. Si y'a un gros bug que j'ai pas vu y'a mon mail en gros dans les fichiers. Ha et ça s'appelle ZuperPush. Je vous laisse raler [comme](http://linuxfr.org/~the_glu/28769.html) [d'habitude](http://linuxfr.org/~Ummon/28878.html) sur le nom des projets auxquels je participe :]

AltStyle によって変換されたページ (->オリジナル) /