web-dev-qa-db-de.com

Mit pipe () in Node.js net

Ich habe Probleme, die Funktion pipe, die in mehreren Node.js-Beispielen für das net -Modul gezeigt wird, in den Kopf zu bekommen.

var net = require('net');

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

Kann jemand erklären, wie dies funktioniert und warum es erforderlich ist?

63
Nick Parsons

Die Funktion pipe() liest Daten aus einem lesbaren Stream, sobald sie verfügbar sind, und schreibt sie in einen beschreibbaren Zielstream.

Das Beispiel in der Dokumentation ist ein Echoserver, ein Server, der sendet, was er empfängt. Das socket -Objekt implementiert sowohl die lesbare als auch die schreibbare Stream-Schnittstelle. Daher schreibt es alle empfangenen Daten zurück in den Socket.

Dies entspricht der Verwendung der pipe() -Methode mit Ereignis-Listenern:

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() liest aus einem lesbaren Stream und schreibt in einen beschreibbaren Stream, ähnlich wie bei einer Unix-Pipe. Es erledigt alle "vernünftigen" Dinge auf dem Weg mit Fehlern, dem Ende von Dateien, wenn eine Seite zurückfällt usw. Ihr spezielles Beispiel ist etwas verwirrend, weil das socket sowohl lesbar als auch beschreibbar ist.

Ein einfacher zu verstehendes Beispiel ist in dieser SO frage wo Sie aus einer http-Anfrage lesen und in eine http-Antwort schreiben.

3
user949300

Betrachten Sie den folgenden Anforderungshandler

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

Die Methode fs.createReadStream Liest die Datei im angegebenen Dateipfad (public/index.html) Und pipe() schreibt sie in die Antwort (res) für die Clientansicht.

2
Harrison Kamau

Es gibt 2 Sockets pro Server-Client-Verbindung (2 Endpunkte). Socket bindet IP Address:Port Number. Dem Client werden zufällige Portnummern zugewiesen, während der Server eine dedizierte Portnummer hat. Dies ist die grundlegende Erklärung der Funktionsweise von Sockets.

Piping ist für die Umleitung eines lesbaren Streams in einen beschreibbaren Stream reserviert.

Was macht socket.pipe(socket)? Es leitet alle Daten vom lesbaren Stream (Server) zum beschreibbaren Stream (Client) um. Wir können dies optimieren, indem wir Ereignis-Listener hinzufügen, wie @hexacyanide hervorgehoben hat.

1
KrisT