socket.pipe(socket); 是什么作用?
 发布于 13 年前  作者 xian366  24766 次预览  最后一次回复是 10 年前  来自  

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

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

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

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

17 回复
leizongmin

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

平时需要这样写的代码:

s1.on('data', function (chunk) {
  s2.write(chunk);
});

s1.on('end', function (chunk) {
  s2.end();
});

直接用pipe()这样就可以实现

s1.pipe(s2);

不知道理解对不对,请楼下指正

xian366

s2 是 什么?

xian366

嗯,在api上看到了,不明白,有什么作用,请赐教。

leizongmin

@xian366 s1和s2都是socket的实例嘛

xian366

@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

leizongmin

@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');

建议qj一把源码

v8node

pipe主要是使IO的流式(stream)操作更方便自然. 流式读写的最大好处一是省内存;二是精简代码. 推荐看看这篇文章http://docs.nodejitsu.com/articles/advanced/streams/what-are-streams

v8node

最经典的案例是一边读文件,一边pipe给HTTP response. 我测试过使用pipe来做文件复制操作,测试表明其复制速度比系统cp命令快.文件越大,差距越明显. 需要注意的是由于操作系统缓存,第二次调用cp会比第一次快,需要排除这个因素.

chishaxie

@xian366 这是管道啊……

chishaxie

@xian366 应该会少两次拷贝如果是on(‘data’,function(d){ con.write(d); }); 这种有内核到用户态的拷贝 还有一次用户态到内核态的拷贝……

chishaxie

@xian366 这是TCP回显服务器啊,将socket的输入流绑定到自身的输出流,也就是套接字获得什么数据就输出什么数据……于是叫TCP回显……

cmingxu

@leizongmin 正解, 与操作系统的pipe概念没啥关系。

sipgear

好好学习一下。