2010-12-05 33 views
2

J'essaie de créer une solution côté serveur qui pousse périodiquement les données vers le client (pas d'interrogation côté client) via node.js. La connexion doit être ouverte de façon permanente et chaque fois que le serveur a de nouvelles données, il les transmet au client.node.js - envoie les données au client - un seul client peut être connecté?

Voici mon script simple exemple:

var sys = require('sys'), 
http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    sys.puts('Start sending...'); 

    setInterval(function(){ 
     res.write("<script type='text/javascript'>document.write('test<br>')</script>"); 
    }, 10000); 
}).listen(8010); 

Cela fonctionne essentiellement, mais il semble que seul client à la fois peut être connecté.

Si j'ouvre http://127.0.0.1:8010/ avec mon navigateur, je vois toutes les 10 secondes la nouvelle sortie écrite. Mais quand j'ouvre un autre onglet avec la même URL, il ne fait que charger pour toujours. Seulement si je ferme le premier onglet, je reçois un conent du serveur.

Que dois-je faire pour server plusieurs clients?

+0

C'est bizarre. Selon cette page, cela devrait fonctionner: http://blog.nemikor.com/2010/05/21/long-polling-in-nodejs/ – thejh

+0

@thejh Hm, même si j'essaie de retourner une réponse simple avec res. end() (pas de comète, simple requête-réponse) il me semble que les clients doivent attendre le précédent pour récupérer le contenu du serveur. Peut-être que c'est un problème de système d'exploitation? Je cours node.js 0.3.2 sur un ubuntu vm-ware. – Max

+0

@Max: Etes-vous sûr de la version? Même github dit que 0.3.1 est le plus récent ... https://github.com/ry/node – thejh

Répondre

3

Ceci est certainement un bug, ce qui se passe est que le navigateur utilise la même connexion en raison de keep-alive et HTTP/1.1 et les vis de noeud vers le haut.

Vous pouvez voir cela au travail dans Opera11, ouvrir la page deux fois, c'est exactement la même page, en utilisant exactement la même connexion.

Curl et tout ce qui ne définit pas Connection: keep-alive fonctionne très bien, mais les navigateurs ne parviennent pas à ouvrir deux fois la même page. Bien que vous pouvez ouvrir 'localhost: 8010' et 'localhost: 8010/foo' et cela fonctionnera sur les deux pages.

Note: Cela ne concerne que GET demandes, demandes POST fonctionnent très bien car il n'y a pas de réutilisation de la connexion. J'ai déposé un issue à ce sujet.

+0

Hm, existe-t-il une solution de contournement pour cela? Merci d'avoir déposé le rapport de bogue à ce sujet! :-) – Max

+0

Il y a, vous avez besoin de faire une demande 'POST' au lieu d'une requête' GET' (les navigateurs ne réutiliseront pas cette connexion alors) Donc, iirc, vous devrez faire un 'XMLHttpRequest' ici donc vous peut définir le type de requête, mais avec HTTP simple est juste échoue atm. –

3

Vous devez utiliser socket.io. Il gère tous les travaux de levage pour vous et est une bibliothèque vraiment cool.

1

Faites attention avec ça!

node.jsest non bloquant mais ne gère en même temps qu'une seule connexion à la fois. Ce que vous avez fait est de mettre le noeud dans un état mort, c'est pourquoi vous voyez des données sur le second client lorsque vous fermez le premier.