在node.js 见到了不少次的, .pipe的用法,在gzip压缩的时候,要用,
还有 stream.pipe(destination, [options]) .
socket的的时候, socket.pipe(socket); 这句话的作用是什么?
请教,这些.pipe 有什么作用?
没用过这个,大概是这样吧:
平时需要这样写的代码:
s1.on('data', function (chunk) {
s2.write(chunk);
});
s1.on('end', function (chunk) {
s2.end();
});
直接用pipe()
这样就可以实现
s1.pipe(s2);
不知道理解对不对,请楼下指正
s2 是 什么?
嗯,在api上看到了,不明白,有什么作用,请赐教。
@xian366 s1和s2都是socket的实例嘛
那nodejs.org 首页提供的,
var net = require('net');
var server = net.createServer(function (socket) {
socket.write('Echo server\r\n');
socket.pipe(socket);
});
server.listen(1337, '127.0.0.1');
socket.pipe(socket); 这一句有什么作用呢,他就一个socket 。
请教 @chishaxie
@xian366 就是客户端发神马数据过来,服务器就返回相同的数据嘛,这个自己试试就知道了。跟这个代码效果是一样的:
var net = require('net');
var server = net.createServer(function (socket) {
socket.write('Echo server\r\n');
socket.on('data', function (chunk) {
socket.write(chunk);
});
});
server.listen(1337, '127.0.0.1');
@leizongmin 非常感谢。
建议qj一把源码
pipe主要是使IO的流式(stream)操作更方便自然. 流式读写的最大好处一是省内存;二是精简代码. 推荐看看这篇文章http://docs.nodejitsu.com/articles/advanced/streams/what-are-streams
最经典的案例是一边读文件,一边pipe给HTTP response. 我测试过使用pipe来做文件复制操作,测试表明其复制速度比系统cp命令快.文件越大,差距越明显. 需要注意的是由于操作系统缓存,第二次调用cp会比第一次快,需要排除这个因素.
@xian366 这是管道啊……
@xian366 应该会少两次拷贝如果是on(‘data’,function(d){ con.write(d); }); 这种有内核到用户态的拷贝 还有一次用户态到内核态的拷贝……
@xian366 这是TCP回显服务器啊,将socket的输入流绑定到自身的输出流,也就是套接字获得什么数据就输出什么数据……于是叫TCP回显……
@leizongmin 正解, 与操作系统的pipe概念没啥关系。
好好学习一下。