在Node.js网络中使用pipe()


71

我很难pipe理解net模块的几个Node.js示例中显示的功能。

var net = require('net');

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

任何人都可以提供有关其工作原理以及为什么需要这样做的解释吗?

Answers:


103

pipe()功能从可读流中读取可用的数据,并将其写入目标可写流。

文档中的示例是回显服务器,它是发送接收到的信息的服务器。该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);
});

2
您能否链接到管道(net.Soctket)的文档。还是没有?
Paul Brewczynski 2014年

9
在这里。然后,如果您在此处查看,说明net.Socket实例实现了双工流。

但是“实施广告双工流接口”是什么意思?这是否意味着它继承自它?流在net.Socket原型中吗?为什么叫“接口”界面时,我只不过是“文件”指定什么方法,你可以在某些对象找到..
保罗Brewczynski

1
是的,这意味着它继承自stream.Duplex,它同时继承stream.Readablestream.Writable。在这种情况下,“接口”严格来说不是接口的OOP定义,而可以只是应用程序之间的联系点。

1
“应用程序之间的联系点”是什么意思?以及为什么他们使用这样的术语可能会产生误导。而且他们不会说它是如何实现的(该对象在原型链中还是在混合中)
Paul Brewczynski 2014年

5

pipe()从可读流中读取并写入可写流,就像Unix管道一样。它会执行所有“合理的”操作,包括错误,文件结尾,如果一侧落后等。您的特定示例会有些混乱,因为它们socket既可读又可写。

在这个SO问题中,一个更容易理解的示例是您从http请求中读取并写入http响应中。


2

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

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

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


2

考虑以下请求处理程序

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)以供客户端查看。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.