jquery - Transmisión de datos con Node.js
html ajax (3)
Deseo saber si es posible transmitir datos desde el servidor al cliente con Node.js. Deseo publicar una única solicitud de AJAX en Node.js, luego dejar la conexión abierta y transmitir continuamente los datos al cliente. El cliente recibirá esta secuencia y actualizará la página continuamente.
Actualizar:
Como una actualización de esta respuesta , no puedo hacer que esto funcione. La response.write
no se envía antes de llamar close
. He configurado 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"> </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>
Usando este método no recibo nada hasta que llamo a close()
. ¿Es esto posible o debería ir con un enfoque de encuesta larga en lugar de llamar a la función de carga nuevamente cuando entra uno?
Es posible. Simplemente use 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 que 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'');
Me conecté a él por Telnet y de hecho da una respuesta fragmentada. Pero para usarlo en el navegador AJAX tiene que ser compatible con XHR.readyState = 3 (respuesta parcial). No todos los navegadores admiten esto, hasta donde yo sé. Por lo tanto, es mejor utilizar encuestas largas (o Websockets para Chrome / Firefox).
EDIT2 : Además, si usa nginx como proxy inverso para Node, a veces quiere reunir todos los fragmentos y enviarlos al usuario de una vez. Tienes que modificarlo.
Mira a Sockets.io. Proporciona transmisión HTTP / HTTPS y utiliza varios transportes para hacerlo:
- WebSocket
- WebSocket over Flash (+ soporte de políticas de seguridad XML)
- XHR Sondeo
- XHR Multipart Streaming
- Forever Iframe
- JSONP Polling (para dominio cruzado)
¡Y! Funciona a la perfección con Node.JS. También es un paquete de NPM.
También puedes abortar el ciclo 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á algo así como.