一尘不染

使用Node.js传输数据

node.js

我想知道是否可以使用Node.js将数据从服务器流式传输到客户端。我想将单个AJAX请求发布到Node.js,然后将连接保持打开状态并将数据连续流式传输到客户端。客户端将收到此流并不断更新页面。

更新:

更新-我无法使其正常工作。在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">&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>

使用这种方法,我打电话之前什么都没拿回来close()。这是否可能,或者我应该使用长轮询方法,而不是在进来时再次调用load函数?


阅读 284

收藏
2020-07-07

共1个答案

一尘不染

有可能的。只需多次使用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的反向代理,它有时会希望收集所有块并将其立即发送给用户。您需要对其进行调整。

2020-07-07