node.js向客户端发送流数据的多种方法

发布时间:2019-10-30编辑:脚本学堂
有关node.js向客户端发送流数据的多种方式,如何实现流式的数据传输,包括持续写res方式、使用stream对象的pipe等方式。

实例:node.js向客户端发送流数据

说明:
在处理页面请求量较大的数据时,或需要一定时间来完成的数据流,可以考虑以流的方式把已完成的数据发送给客户端,节省资源,提高性能。
在express中,一般做法是等数据完成之后,统一发送,如使用exec执行系统命令时,之后在命令结束之后,才会调用回调函数处理命令输出。

例子:
 

复制代码 代码示例:
function cmd(command,req,callback) {
    var sys = require('sys')
    var exec = require('child_process').exec;
    console.log(new Date() + ' Run command from ' + req.ip);
    console.log(command);
    exec(command, {
        maxBuffer: 2000 * 1024
        }, function (error, stdout, stderr) {
            callback(stdout.trim());
        })
}

以下几种方式可以用来实现流式的数据传输。

1、持续写res方式
持续写入node的res对象,例如:
 

复制代码 代码示例:
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');

这种方法缺点:首先express框架中被包装的res对象不支持这种方式的使用,只有支持“XHR.readyState = 3 (partial response)”的浏览器才能这么用。
有人建议使用Sockets.io,可以试试。
 

复制代码 代码示例:
WebSocket
WebSocket over Flash (+ XML security policy support)
XHR Polling
XHR Multipart Streaming
Forever iframe
JSONP Polling (for cross domain)

2、使用stream对象的pipe

类似于 *nix 将几乎所有设备抽象为文件一样,Node 将几乎所有 IO 操作都抽象成了 Stream 的操作。Stream 是一个抽象的概念,总之就是会冒数据(以 Buffer 为单位),或者能够吸收数据的东西。

1)、文系统命令执行的例子,使用spawn的stdout流:
 

复制代码 代码示例:
function cmd_stream(command,req,res) {
    console.log(new Date() + ' Run command stream from ' + req.ip);
    console.log(command);
    var spawn = require('child_process').spawn;
    var params = command.split(/s+/);
    command = params.shift();
    var cmd_process = spawn(command,params);
    cmd_process.stderr.pipe(res);
}

2)、另一个文件流pipe的例子:
 

复制代码 代码示例:
function file_stream(file,req,res) {
    console.log(new Date() + ' Run readfile stream from ' + req.ip);
    var fs = require('fs');
    var rstream = fs.createReadStream('/tmp/myfile');
// var rstream = fs.createReadStream(file);
    rstream.pipe(res);
}