在Node.js net中使用pipe()

时间:2013-11-20 01:11:35

标签: javascript node.js tcp

我无法绕过net模块的几个Node.js示例中显示的pipe函数。

var net = require('net');

var server = net.createServer(function (socket) {
  socket.write('Echo server\r\n');
  socket.pipe(socket);
});

任何人都可以解释这是如何工作的以及为什么需要它?

4 个答案:

答案 0 :(得分:89)

pipe()函数在可读流可用时读取数据并将其写入目标可写流。

文档中的示例是一个echo服务器,它是一个发送它接收内容的服务器。 socket对象实现了可读和可写的流接口,因此它将接收到的任何数据写回套接字。

这相当于使用事件侦听器使用pipe()方法:

var net = require('net');
net.createServer(function (socket) {
  socket.write('Echo server\r\n');
  socket.on('data', function(chunk) {
    socket.write(chunk);
  });
  socket.on('end', socket.end);
});

答案 1 :(得分:3)

pipe()从可读流中读取并写入可写流,就像Unix管道一样。如果一方落后等,它会在错误,文件结束等方面完成所有“合理”的事情。您的特定示例有点令人困惑,因为socket既可读又可写。

更容易理解的示例是in this SO question,您可以从http请求中读取并写入http响应。

答案 2 :(得分:1)

考虑以下请求处理程序

var server = http.createServer(function(req, res){
     console.log('Request for ' + req.url + ' by method ' + req.method);
    if(req.method == 'GET'){
        var fileurl;
        if(req.url == '/')fileurl = '/index.html';
        else {
            fileurl = req.url;
        }
    }
    var filePath = path.resolve('./public'+fileurl);
    var fileExt = path.extname(filePath);
    if(fileExt == '.html'){
          fs.exists(filePath, function(exists){
        if(!exists){
          res.writeHead(404, {'Content-Type': 'text/html'});
          res.end('<h1>Error 404' + filePath + 'not found </h1>');
          //the end() method sends content of the response to the client
          //and signals to the server that the response has been sent
          //completely
          return;
        }
        res.writeHead(200, {'Content-Type':'text/html'});
        fs.createReadStream(filePath).pipe(res);
      })
    }
}

fs.createReadStream方法读取给定文件路径(public/index.html)中的文件,pipe()将其写入响应(res)以供客户端查看。

答案 3 :(得分:1)

每个服务器 - 客户端连接有2个套接字(2个端点)。套接字绑定IP Address:Port Number。客户端获得随机端口号,而服务器具有专用端口号。这是套接字如何工作的基本解释。

管道保留用于将可读流重定向到可写流。

socket.pipe(socket)的作用是什么? 它将所有数据从可读流(服务器)重定向到可写流(客户端)。我们可以通过添加事件监听器来调整它,正如@hexacyanide指出的那样。