在Node.js net中使用pipe()

我有困难包装我的头绕着networking模块的几个Node.js示例中显示的pipefunction。

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

任何人都可以提供解释如何工作,为什么它是必需的?

pipe()函数在可读stream中读取数据,并将其写入目标可写stream。

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

这相当于使用事件监听器的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); }); 

pipe()从一个可读的stream中读取数据并写入一个可写的数据stream,就像一个Unixpipe道一样。 它一路做着所有“合理”的事情,错误,文件结束,如果一方落后等等。你特别的例子有点混乱,因为socket是可读和可写的。

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

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

pipe道保留用于将可读streamredirect到可写stream。

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

考虑下面的请求处理程序

`

 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方法读取给定文件path( public/index.html )中的文件, pipe()将其写入响应( res )以供客户端查看。