11548 sujets

JavaScript, DOM et API Web HTML5

Bonsoir tous,

J'ai pas mal lu sur la création et l'utilisation de sockets en php, mais un point me dépasse pour la mise en place de ce genre de système dans une page HTML/PHP/JS simple, comment garder la communication "ouverte" en continu avec un socket sur ce genre de page ?

Refaire une XmlHttpRequest toutes les x secondes n'est quand même pas LA solution ? Le chat sur GMail/Facebook, sont quand même aussi dans des simples pages statiques ? Et pourtant la communication semble tout le temps ouvert, sans pour autant voir une tonne de requêtes se faire régulièrement... Je suis assez perdu !

J'éspère trouver réponse, merci d'avance à vous !
J'avais voulu faire un truc dans ce genre, mais le gros problème se situe surtout en php.

En php, il n'y a pas moyen de conserver un socket ouvert dépendant de la session. La fonction qui est censé ouvrir un socket permanent, pfsockopen, ouvre en fait un socket qui reste permanent selon le processus apache. Ce qui ne garantit d'ailleurs pas non plus une connexion unique pour l'ensemble du serveur, car généralement plusieurs processus apache tournent en parralèle (entre 2 et 5). Chaque requête HTTP étant attribuée à un processus apache au hasard, impossible de faire un lien tangible entre le n° du processus apache utilisé et un utilisateur, que ce soit par sa session et même par son IP. Pas non plus de moyen fiable de savoir si une nouvelle connexion a été ouverte ou si une ancienne a été reprise en appelant cette fonction.

Pfsockopen étant donc passablement scabreuse et mal fichue, il est presque impossible de l'utiliser concrètement.
Pas le choix donc, on est contraint d'utiliser des protocoles qui fonctionnent sur le principe requête-réponse, comme HTTP. Impossible de stocker les messages reçus entre deux pages.


Côté client, de toute façon, tu n'as pas trop le choix, tu es obligé d'envoyer une requête AJAX à intervalles réguliers. Le serveur ne peut pas envoyer de notifications au client, donc c'est le client qui doit obligatoirement se manifester d'une façon ou d'une autre.

Quand je disais que les technos web sont lourdes pour ce genre de truc...
Modifié par QuentinC (17 Jun 2009 - 06:06)
Les chats sur GMail ou Facebook n'utilisent évidemment pas de simple polling ajax (sauf en fallback), mais une technique de streaming http de communication frontend/backend nommée Comet, en HTML5 tu as même mieux : les WebSockets.
Avec ces deux termes tu devrais pouvoir t'en sortir avec Google Smiley langue
Tu as diverses solutions dispo, certaines sont un peu plus "bricolées" que d'autres.

Tu as les websockets html5 (je ne pense pas qu'il y ait encore de support), les connexions HTTP sans fin, ect.

En solution entièrement js tu as une librairie js.io qui te fournit une API socket unifiée et cross-browser.
Tu as même pas mal de protocoles déjà implémentés sur cet API (irc, xmpp, telnet, smtp, etc.).

Une autre solution serait de passer par un plugin, flash et la jvm peuvent ouvrir des sockets binaires et communiquer avec le javascript.
Selon ton environnement tu peux décider de les utiliser comme passerelle.

http://cometdaily.com/ << site entièrement dédié au sujet
http://js.io/ << la fameuse librairie
Le sujet m'intéresse aussi, et c'est bien beau mais ça marche pas leur truc.
J'ai téléchargé la démo de js.io et ça marche ni avec firefox 2, ni avec IE7. Je me prends des kilos d'erreurs js.
Y'a quelque chose de plus à télécharger/installer que leurs deux archives ?

a écrit :
Une autre solution serait de passer par un plugin, flash et la jvm peuvent ouvrir des sockets binaires et communiquer avec le javascript.
Selon ton environnement tu peux décider de les utiliser comme passerelle.

Oui, c'est encore le plus sûr. Au pire, faire un applet de 1px sur 1px et communiquer avec lui en utilisant js. Au moins ça marche, ça. Java powa.
QuentinC a écrit :
Le sujet m'intéresse aussi, et c'est bien beau mais ça marche pas leur truc.
J'ai téléchargé la démo de js.io et ça marche ni avec firefox 2, ni avec IE7. Je me prends des kilos d'erreurs js.
Y'a quelque chose de plus à télécharger/installer que leurs deux archives ?


Tu as sûrement du manquer un truc, car les démos marchent bien.
Merci les gars pour les différents nouveaux termes, toujours un plaisir de découvrir des choses dont on a jamais rien entendu ! J'ai pas mal cherché Comet et les WebSockets HTML5, pour le moment j'ai rien pu réaliser moi même de concluant, mais je persévère.

En revanche j'ai téléchargé js.io, mais j'ai trouvé aucune doc, aucun guide, ce n'est que peu pratique pour commencer... J'ai tout le dossier hosté en localhost sur ma machine, demos inclus, mais chez moi aucune démo ne fonctionne, mais j'ai l'impression que c'est toujours lié à d'autres services, enfin bref j'ai pas compris grand chose !

Enfin dans tout ça ce qui me semble le plus intéressant c'est les WebSockets HTML5, mais pourquoi est-ce si peu documenté en détail? Alors que l'élément Canvas est une grosse star sur la toile ?
Oui leur site js.io est mal foutu : il y a des 404 partout... notamment la prétendue doc mène à un 404.

J'ai peut-être trouvé pourquoi ça marche pas. En fait, il semblerait que les démo font appel à des scripts qui ne sont pas inclus dans les archives zip. Par exemple : orbited.js. Ca peut pas aller si il manque des trucs, ou alors il faut indiquer où les télécharger, ce qu'ils n'ont visiblement pas fait.

Bref, effectivement il est très très mal foutu ce site.
Gabor a écrit :

En revanche j'ai téléchargé js.io, mais j'ai trouvé aucune doc, aucun guide, ce n'est que peu pratique pour commencer... J'ai tout le dossier hosté en localhost sur ma machine, demos inclus, mais chez moi aucune démo ne fonctionne, mais j'ai l'impression que c'est toujours lié à d'autres services, enfin bref j'ai pas compris grand chose !

Pour tout ce qui est Comet, tu devrais regarder du côté de Dojo (son créateur, Alex Russell est à l'origine du terme "Comet").

Gabor a écrit :

Enfin dans tout ça ce qui me semble le plus intéressant c'est les WebSockets HTML5, mais pourquoi est-ce si peu documenté en détail? Alors que l'élément Canvas est une grosse star sur la toile ?

Les WebSockets ne sont encore qu'à l'état de Draft (brouillon), et par ailleurs relativement récente, on a le temps avant que tous les browsers ne l'implémentent (et plusieurs années pour IE). L'élément canvas est bien plus populaire car son utilité est très visuelle (et plus tout récent), et derrière t'as Apple pour le promouvoir Smiley langue
J'ai créé quelque chose de fonctionnel pour les socket, mais dur à établir, j'ai vraiment galéré et même essayé des trucks un peu au hasard mais voici quelques pistes :

Faire un serveur PHP, exemple serveur.php, à executer 24h/24 7j/7 avec php et non avec le serveur web

dans la console tu peux le lancer en faisant tapant : php serveur.php

ensuite j'ai inséré sur mon site un applet flash invisible qui gère la communication entre mon serveur php et javascript. J'ai fais une fonction javascript pour éxecuter des fonctions suivant ce que flash lui transmet.

Je ferais peut-être un jour un tuto avec les scripts complets et fonctionnels..

En tappant flash jssocket sur google et php serveur multiutilisateur, tu devrais t'en sortir.
C'est un flash invisible ?
Parce que j'ai souvent aussi pensé à cette solution.... sauf en applet.