我对在 Node.js 的 net 模块中出现的 pipe
函数感到困惑。
var net = require('net');
var server = net.createServer(function (socket) {
socket.write('Echo server\r\n');
socket.pipe(socket);
});
有人能解释一下这是怎么工作的,以及为什么它是必需的吗?
我对在 Node.js 的 net 模块中出现的 pipe
函数感到困惑。
var net = require('net');
var server = net.createServer(function (socket) {
socket.write('Echo server\r\n');
socket.pipe(socket);
});
有人能解释一下这是怎么工作的,以及为什么它是必需的吗?
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);
});
pipe()
方法从可读流中读取数据并将其写入可写流,类似于Unix管道。在此过程中,它会处理所有“合理”的情况,如错误、文件末尾、一侧滞后等。您的特定示例可能稍微令人困惑,因为socket
既可读又可写。
一个更易理解的例子可以在这个 Stack Overflow 问题中找到,在该问题中,您从http请求中读取数据并将其写入http响应。
IP地址:端口号
。客户端被分配随机端口号,而服务器有专用端口号。这是套接字工作原理的基本解释。socket.pipe(socket)
是什么意思?它将从可读流(服务器)到可写流(客户端)的所有数据重定向。我们可以通过添加事件侦听器来进行微调,如@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
方法读取给定文件路径 (public/index.html
) 中的文件,pipe()
将其写入响应 (res
) 以供客户端查看。
net.Socket
实例实现了一个双工流。 - hexacyanidestream.Duplex
,而stream.Duplex
又同时继承了stream.Readable
和stream.Writable
。在这个上下文中,“接口”并不严格遵循面向对象编程中“接口”的定义,它只是应用程序之间的联系点。 - hexacyanide