javascript-在Node.js中使用pipe()n

我在将net602的几个Node.js示例中显示的2560274099377577538048函数包裹起来时遇到麻烦。

var net = require('net');

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

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

Nick Parsons asked 2019-10-08T13:39:16Z
4个解决方案
88 votes

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

文档中的示例是回显服务器,它是发送接收到的信息的服务器。 pipe()对象同时实现了可读和可写的流接口,因此它会将接收到的所有数据写回套接字。

这等效于使用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);
});
hexacyanide answered 2019-10-08T13:39:47Z
3 votes

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

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

user949300 answered 2019-10-08T13:40:27Z
1 votes

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

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

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

KrisT answered 2019-10-08T13:41:14Z
1 votes

考虑以下请求处理程序

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

Harrison Kamau answered 2019-10-08T13:41:50Z
translate from https://stackoverflow.com:/questions/20085513/using-pipe-in-node-js-net