socket.pipe(socket); 是什么作用?
发布于 12 年前 作者 xian366 23800 次浏览 最后一次编辑是 8 年前

在node.js 见到了不少次的, .pipe的用法,在gzip压缩的时候,要用,

还有 stream.pipe(destination, [options]) .

socket的的时候, socket.pipe(socket); 这句话的作用是什么?

请教,这些.pipe 有什么作用?

17 回复

没用过这个,大概是这样吧:

平时需要这样写的代码:

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的实例嘛

@leizongmin

那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概念没啥关系。

好好学习一下。

回到顶部