Frage

Ich möchte wissen, ob es möglich ist, Daten mit Node.js. an den Client vom Server zu streamen Ich möchte einen einzigen AJAX-Request an Node.js schreiben, dann lassen Sie die Verbindung offen und kontinuierlich Strom-Daten an den Client. Der Kunde wird diesen Strom erhalten und die Seite kontinuierlich aktualisieren.

Update:

Als Update auf href="https://stackoverflow.com/questions/2558606/stream-data-with-node-js/2563459#2563459"> - Das kann ich nicht bekommen arbeiten. Die response.write wird nicht gesendet, bevor Sie close nennen. Ich habe ein Beispielprogramm eingerichtet, dass ich diese verwenden zu erreichen:

Node.js:

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);

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>

Mit dieser Methode ich nichts zurück, bis ich Anruf close() bekommen. Ist das möglich oder sollte ich mit einem langen Umfrage Ansatz gehen, statt, wo ich die Ladefunktion wieder aufrufen als ein in kommt?

War es hilfreich?

Lösung

Es ist möglich. Verwenden Sie einfach response.write () mehrere Male.

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();

Sie können schließen müssen und wieder öffnen Verbindung alle 30 Sekunden oder so.

Bearbeiten : Dies ist der Code, den ich tatsächlich getestet:

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');

ich mit ihm verbunden ist durch Telnet und seine gibt in der Tat Chunked Antwort aus. Aber, um es in AJAX-Browser hat XHR.readyState = 3 (partielles Ansprechen) zu unterstützen. Nicht alle Browser unterstützen dies, soweit ich weiß. Also besser langen Polling (oder Websockets für Chrome / Firefox).

EDIT2 : Auch wenn Sie nginx als Reverse-Proxy auf Knoten verwenden, ist es manchmal will alle Stücke sammeln und es zu Benutzer auf einmal zu senden. Sie müssen es zwicken.

Andere Tipps

Schauen Sie sich Sockets.io. Es bietet HTTP / HTTPS-Streaming und verwendet verschiedene Transporte so zu tun:

  • WebSocket
  • WebSocket über Flash (+ XML-Sicherheitsrichtlinie Unterstützung)
  • XHR Polling
  • XHR Mehrteiliger Streaming
  • Forever Iframe
  • JSONP Polling (für Cross-Domain)

Und! Es arbeitet nahtlos mit Node.JS. Es ist auch ein NPM-Paket.

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

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

Sie können auch Abbruch der Endlosschleife:

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);
    }); 
}); 

Dies ist ein Beispiel für Express.js. Ich glaube, dass ohne Express.js so etwas wie sein wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top