Node.js 向客户端发送流数据

如果某个被请求的页面数据比较大,或者是一个需要一定时间来完成的数据流,那么以流的方式把已经完成的数据发送给客户端是一个比较好的做法。在express中,一般的做法是等数据完成之后,统一发送,如使用exec执行系统命令时,之后在命令结束之后,才会调用回调函数处理命令输出。

  1. function cmd(command,req,callback) {
  2. var sys = require(‘sys‘)
  3. var exec = require(‘child_process‘).exec;
  4. console.log(new Date() + ‘ Run command from ‘ + req.ip);
  5. console.log(command);
  6. exec(command, {
  7. maxBuffer: 2000 * 1024
  8. }, function (error, stdout, stderr) {
  9. callback(stdout.trim());
  10. })
  11. }

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

持续写res方式

最直白的方式就是持续写入node的res对象,例如:

  1. var sys = require(‘sys‘),
  2. http = require(‘http‘);
  3. http.createServer(function (req, res) {
  4. res.writeHead(200, {‘Content-Type‘: ‘text/html‘});
  5. var currentTime = new Date();
  6. sys.puts(‘Starting sending time‘);
  7. setInterval(function(){
  8. res.write(
  9. currentTime.getHours()
  10. + ‘:‘ +
  11. currentTime.getMinutes()
  12. + ‘:‘ +
  13. currentTime.getSeconds() + "\n"
  14. );
  15. setTimeout(function() {
  16. res.end();
  17. }, 10000);
  18. },1000);
  19. }).listen(8090, ‘192.168.175.128‘);

但是这种方法的缺点很多,首先express框架中被包装的res对象不支持这种方式的使用,更严重的是只有支持“XHR.readyState = 3 (partial response)”的浏览器才能这么用。另外有人建议使用Sockets.io,有兴趣的朋友可以试试。

  1. WebSocket
  2. WebSocket over Flash (+ XML security policy support)
  3. XHR Polling
  4. XHR Multipart Streaming
  5. Forever Iframe
  6. JSONP Polling (for cross domain)

使用stream对象的pipe

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

下面是上文系统命令执行的另一个例子,其中使用的spawn的stdout流:

  1. function cmd_stream(command,req,res) {
  2. console.log(new Date() + ‘ Run command stream from ‘ + req.ip);
  3. console.log(command);
  4. var spawn = require(‘child_process‘).spawn;
  5. var params = command.split(/\s+/);
  6. command = params.shift();
  7. var cmd_process = spawn(command,params);
  8. cmd_process.stderr.pipe(res);
  9. }

另一个文件流pipe的例子:

  1. function file_stream(file,req,res) {
  2. console.log(new Date() + ‘ Run readfile stream from ‘ + req.ip);
  3. var fs = require(‘fs‘);
  4. var rstream = fs.createReadStream(‘/tmp/myfile‘);
  5. // var rstream = fs.createReadStream(file);
  6. rstream.pipe(res);
  7. }
时间: 2024-11-03 22:03:41

Node.js 向客户端发送流数据的相关文章

SpringMVC客户端发送json数据时报400错误

当测试客户端发送json数据给服务器时,找不到响应路径? 原来是参数类型不符,即使是json也要考虑参数的个数和类型 解决:将age请求参数由"udf"改为"3"或任意数字即可

Servlet向客户端发送中文数据的编码情况

(更多内容请关注本人微信订阅号:it_pupil) 本文讲述服务端servlet向客户端浏览器发送中文数据的编码情况,需要抓住下面几点: 输出流发送数据,必须是以字节形式传输的.也就是说,如果你在服务端定义一个字符串,那么servlet要先编码成字节数组,再发送到客户端. 客户端浏览器在收到字节码数据时,需要将其解码成字符串显示出来. 在服务端,如果你使用的是字节流,那么只需要注意两点:  拿到字符串,以特定形式编码成字节数组(如UTF-8).(字节数组是你人工转换的) 告诉浏览器,以相同方式解

使用node.js cheerio抓取网页数据

想要自动从网页抓一些数据或者想把一坨从什么博客上拉来的数据转成一种有结构的数据? 居然没有现成的API可以取数据?!!! [email protected]#[email protected]#$… 没关系 网页抓取可以解决. 什么是网页抓取? 你可能会问... 网页抓取是以编程的方式(通常不用浏览器参与)检索网页的内容并从中提取数据的过程. 本文,小编会给大家展示一套强大的抓取工具,可以快速的对网面进行抓取,而且容易上手,它是由javascript 和node.js实现的. 最近我需要爬一些大

nginx反向代理node.js获取客户端IP

使用Nginx做node.js程序的反向代理,会有这么一个问题:在程序中获取的客户端IP永远是127.0.0.1 如果想要拿到真实的客户端IP改怎么办呢? 一.首先配置Nginx的反向代理 proxy_set_header server { listen 80; server_name chat.luckybing.top; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; pro

udp回显客户端发送的数据

这里让客户端给服务端发送的数据被服务端自动发回来 客户端: import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: client_socket.sendto(input('请输入要回显的数据:').encode(), ('127.0.0.1', 23234)) client_recv_temp_data = client_socket.recvfrom(1024) pri

Node.js WebSocket 客户端实例

Node.js var ws = require("ws"); var socket = new ws("ws://127.0.0.1:8001); var socket.on("open", function () { if (socket.readyState == 1) { var msg = {}; msg.status = 'ok'; socket.send(JSON.stringify(msg)); } }); var socket.on(&q

(九)springmvc之json的数据请求(客户端发送json数据到服务端)

index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&quo

tcp回显客户端发送的数据

客户端: import socket tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket.connect(('127.0.0.1', 12345)) while True: tcp_socket.send(input('你输入要回显的数据:').encode()) print('回显数据:', tcp_socket.recv(1024).decode()) 服务端: import socket tcp

node.js 获取客户端信息

结果: