【问题标题】:Using pipe() in Node.js net在 Node.js 网络中使用 pipe()
【发布时间】:2013-12-03 19:55:24
【问题描述】:

我无法理解pipe 函数,这些函数在net 模块的几个Node.js 示例中显示。

var net = require('net');

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

谁能解释一下它是如何工作的以及为什么需要它?

【问题讨论】:

    标签: javascript node.js tcp


    【解决方案1】:

    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);
    });
    

    【讨论】:

    • 您能否链接到管道(net.Soctket)的文档。还是没有?
    • 它位于here。然后,如果你看一下here,就会发现net.Socket 实例实现了双工流。
    • 但是“实现广告双工流接口”是什么意思?这是否意味着它继承自它?流在 net.Socket 原型中?当我的接口只是指定您在某个对象中可以找到哪些方法的“文档”时,为什么将其称为“接口”..
    • 是的,这意味着它继承自stream.Duplex,它继承了stream.Readablestream.Writable。在这种情况下,“接口”并不是严格意义上的 OOP 定义的接口,它可以只是应用程序之间的一个接触点。
    • “应用程序之间的联系点”是什么意思?以及为什么他们使用这样一个可能具有误导性的术语。而且他们不会说它是如何实现的(这个对象是在原型链中,还是一个mixin)
    【解决方案2】:

    pipe() 从可读流读取并写入可写流,很像 Unix 管道。它一路做所有“合理”的事情,包括错误、文件结束、如果一侧落后等。您的特定示例有点令人困惑,因为socket 既可读又可写。

    一个更容易理解的例子是in this SO question,你从一个http请求读取并写入一个http响应。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        考虑以下请求处理程序

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

        【讨论】:

          猜你喜欢
          • 2016-02-09
          • 2016-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-08
          • 1970-01-01
          • 2015-05-12
          • 2021-12-03
          相关资源
          最近更新 更多