Pregunta

Me gustaría saber si es posible transmitir datos desde el servidor al cliente con Node.js. Quiero publicar una sola petición AJAX para Node.js, a continuación, dejar la conexión de datos abiertos y de forma continua la corriente al cliente. El cliente recibirá esta corriente y actualizar la página de forma continua.

Actualización:

Como una actualización de esta respuesta - No puedo conseguir este trabajar. El response.write no se envía antes de llamar close. He creado un programa de ejemplo que utilizo para lograr esto:

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>

El uso de este método que no regreso nada hasta que close() llamada. ¿Es esto posible o debería ir con un enfoque de sondeo largo lugar en el que llama a la función de carga de nuevo como uno entra?

¿Fue útil?

Solución

Es posible. Sólo tiene que usar response.write () varias veces.

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

Es posible que tenga que cerrar y volver a abrir la conexión cada 30 segundos más o menos.

editar : este es el código realmente Probé:

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

I conectado a él por Telnet y su efecto, da hacia fuera respuesta fragmentada. Pero para usarlo en el navegador AJAX tiene que apoyar XHR.readyState = 3 (respuesta parcial). No todos los navegadores son compatibles con esta, por lo que yo sé. Así que es mejor utilizar el sondeo largo (o WebSockets para Chrome / Firefox).

Edit2 : También, si usa Nginx como proxy inverso al nodo, a veces se quiere reunir todos los trozos y enviarla al usuario a la vez. Es necesario que ajustar.

Otros consejos

Mira Sockets.io. Proporciona HTTP / HTTPS streaming y utiliza diversos medios de transporte para hacerlo:

  • WebSocket
  • WebSocket sobre flash (+ XML apoyo a la política de seguridad)
  • XHR sondeo
  • XHR multiparte Transmisión
  • Para siempre iframe
  • JSONP Polling (por dominios)

Y! Funciona a la perfección con Node.js. Es también un paquete de NGP.

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

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

También se puede anular el bucle infinito:

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

Este es un ejemplo de expressjs. Creo que sin expressjs serán algo así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top