44 votes

Flux de données avec Node.js

Je veux savoir si il est possible de transférer des données à partir du serveur vers le client avec Node.js. De ce que je peux comprendre tout sur l'internet est que cela doit être possible, mais je n'arrive pas à trouver un exemple correct ou de la solution.

Ce que je veux, c'est un seul http post node.js avec l'AJAX. Que de laisser la connexion ouverte et continu de flux de données pour le client.

Le client recevra de ce flux et de mise à jour de la page en permanence.

Mise à jour 1

Une mise à jour de cette réponse: http://stackoverflow.com/questions/2558606/stream-data-with-node-js/2563459#2563459

J'ai essayé déjà et je l'ai essayé à nouveau après votre anser. Je ne peux pas obtenir que cela fonctionne. La réponse.écrire n'est pas l'envoyer avant d'appeler à proximité. J'ai mis en place un exemple de programme que j'utilise pour y parvenir.

Node.js code:

var sys = require('sys'), 
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var currentTime = new Date();
    setInterval(function(){
        res.write(
            currentTime.getHours()
            + ':' + 
            currentTime.getMinutes()
            + ':' +
            currentTime.getSeconds()
        );
    },1000);
}).listen(8000);

Voici le code html:

<html>
<head>
<title>Testnode</title>
</head>
<body>

<!-- This fields needs to be updated -->
Server time: <span id="time">&nbsp;</span>

<!-- import jQuery from google -->
<script 
  type="text/javascript"  
  src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">
</script>

<!-- import jQuery -->
<script type="text/javascript">
$(document).ready(function(){
    // I call here node.localhost nginx ports this to port 8000
    $('#time').load('http://node.localhost');
});
</script>
</body>
</html>

En utilisant cette méthode, je n'obtenez pas quelque chose de nouveau, jusqu'à ce que j'appelle close(). est-ce possible ou dois-je plutôt aller avec un long sondage approche où j'appelle la fonction de charge de nouveau comme l'un vient en.

j'ai vraiment plutôt souhaitez diffuser cette. J'espère que quelqu'un peut vous aider.

28voto

Kuroki Kaze Points 2263

Il est possible. Utilisez simplement la réponse.write() à plusieurs reprises.

var body = ["hello world", "early morning", "richard stallman", "chunky bacon"];
// send headers
response.writeHead(200, {
  "Content-Type": "text/plain"
});

// send data in chunks
for (piece in body) {
    response.write(body[piece], "ascii");
}

// close connection
response.end();

Vous pourriez avoir à fermer et rouvrir la connexion toutes les 30 secondes.

EDIT: c'est le code que j'ai testés:

var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var currentTime = new Date();
    sys.puts('Starting sending time');
    setInterval(function(){
        res.write(
            currentTime.getHours()
            + ':' +
            currentTime.getMinutes()
            + ':' +
            currentTime.getSeconds() + "\n"
        );

        setTimeout(function() {
            res.end();
        }, 10000);

    },1000);
}).listen(8090, '192.168.175.128');

Je suis connecté en Telnet et son effet donne des fragments de réponse. Mais pour l'utiliser en AJAX navigateur doit prendre en charge XHR.readyState = 3 (réponse partielle). Pas tous les navigateurs prennent en charge ce, pour autant que je sais. Afin de mieux utiliser le temps d'interrogation (ou les Websockets pour Chrome/Firefox).

EDIT2: en outre, si vous utilisez nginx comme serveur proxy inverse pour le Nœud, il veut parfois de rassembler tous les morceaux et de les envoyer à l'utilisateur à la fois. Vous avez besoin de ruser.

20voto

BMiner Points 4471

Regardez les Sockets.io. Il fournit HTTP/HTTPS en streaming et utilise différents transports pour le faire:

  • WebSocket
  • WebSocket sur Flash (+ XML de sécurité la politique de soutien)
  • XHR d'Interrogation
  • XHR Multipart en Streaming
  • Jamais Iframe
  • JSONP d'Interrogation (pour la croix de domaine)

Et! Il fonctionne de manière transparente avec Node.JS. C'est aussi un mécanisme national de prévention de package.

https://github.com/LearnBoost/Socket.IO

https://github.com/LearnBoost/Socket.IO-node

6voto

Andrey Antukh Points 116

Vous pouvez également abandonner la boucle infinie:

 app.get('/sse/events', function(req, res) {
    res.header('Content-Type', 'text/event-stream');

    var interval_id = setInterval(function() {
        res.write("some data");
    }, 50);

    req.socket.on('close', function() {
        clearInterval(interval_id);
    }); 
}); 
 

Ceci est un exemple de expressjs. Je crois que sans expressjs sera quelque chose comme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X