我想知道是否可以使用Node.js将数据从服务器流式传输到客户端。我想将单个AJAX请求发布到Node.js,然后将连接保持打开状态并将数据连续流式传输到客户端。客户端将收到此流并不断更新页面。
更新-我无法使其正常工作。在response.write你打电话之前不发送close。我建立了一个示例程序来实现此目的:
response.write
close
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>
使用这种方法,我打电话之前什么都没拿回来close()。这是否可能,或者我应该使用长轮询方法,而不是在进来时再次调用load函数?
close()
有可能的。只需多次使用response.write()。
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();
您可能必须每隔30秒左右关闭并重新打开一次连接。
编辑 :这是我实际测试的代码:
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');
我通过Telnet连接到它,它确实发出了分块的响应。但是要在AJAX浏览器中使用它,必须支持XHR.readyState =3(部分响应)。据我所知,并非所有浏览器都支持此功能。因此,最好使用长时间轮询(或针对Chrome / Firefox的Websockets)。
EDIT2 :另外,如果您使用nginx作为Node的反向代理,它有时会希望收集所有块并将其立即发送给用户。您需要对其进行调整。