web-dev-qa-db-fra.com

Utiliser pipe () dans le réseau Node.js

J'ai du mal à comprendre la fonction pipe présentée dans plusieurs exemples Node.js pour le module net .

var net = require('net');

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

Quelqu'un peut-il expliquer comment cela fonctionne et pourquoi cela est nécessaire?

63
Nick Parsons

La fonction pipe() lit les données d'un flux lisible au fur et à mesure de leur disponibilité et les écrit dans un flux inscriptible de destination.

L'exemple dans la documentation est un serveur d'écho, c'est-à-dire un serveur qui envoie ce qu'il reçoit. L'objet socket implémente les interfaces de flux lisibles et inscriptibles. Il écrit donc les données qu'il reçoit dans le socket.

Cela équivaut à utiliser la méthode pipe() à l'aide de programmes d'écoute d'événement:

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

pipe() lit depuis un flux lisible et écrit dans un flux inscriptible, un peu comme un tube Unix. Il fait toutes les choses "raisonnables" le long du chemin avec des erreurs, une fin de fichiers, si un côté est en retard, etc. Votre exemple particulier est légèrement déroutant car le socket est à la fois lisible et inscriptible.

Un exemple plus facile à comprendre est dans cette SO question = question) == où vous lisez à partir d'une requête http et écrivez dans une réponse http.

3
user949300

Considérons le gestionnaire de requêtes suivant

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

La méthode fs.createReadStream Lit le fichier dans le chemin de fichier indiqué (public/index.html) Et pipe() l'écrit dans la réponse (res) pour la vue du client.

2
Harrison Kamau

Il y a 2 sockets par connexion serveur-client (2 points finaux). Le socket lie IP Address:Port Number. Des numéros de port aléatoires sont attribués au client, tandis que le serveur possède un numéro de port dédié. Ceci est l'explication de base du fonctionnement du socket.

La tuyauterie est réservée à la redirection d'un flux lisible vers un flux inscriptible.

Que fait socket.pipe(socket)? Il redirige toutes les données du flux lisible (serveur) vers le flux inscriptible (client). Nous pouvons modifier cela en ajoutant des écouteurs d'événements, comme l'a souligné @hexacyanide.

1
KrisT