我无法绕过net模块的几个Node.js示例中显示的pipe
函数。
var net = require('net');
var server = net.createServer(function (socket) {
socket.write('Echo server\r\n');
socket.pipe(socket);
});
任何人都可以解释这是如何工作的以及为什么需要它?
答案 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指出的那样。