web-dev-qa-db-fra.com

Comment créer un canal nommé dans node.js?

Comment créer un canal nommé dans node.js?

P.S .: Pour l'instant, je crée un tuyau nommé comme suit. Mais je pense que ce n'est pas la meilleure façon

var mkfifoProcess = spawn('mkfifo',  [fifoFilePath]);
mkfifoProcess.on('exit', function (code) {
    if (code == 0) {
        console.log('fifo created: ' + fifoFilePath);
    } else {
        console.log('fail to create fifo with code:  ' + code);
    }
});
24
wako

On dirait que les pipes de noms ne sont pas et ne seront pas supportées dans Node Core - de Ben Noordhuis le 10/11/11:

Windows a un concept de canaux nommés, mais puisque vous mentionnez mkfifo I Supposez que vous entendez par FIFO UNIX.

Nous ne les supportons pas et ne le ferons probablement jamais (les FIFO en mode non bloquant Risquent de bloquer la boucle d'événements), mais vous pouvez utiliser les sockets UNIX si vous avez besoin de fonctionnalités similaires.

https://groups.google.com/d/msg/nodejs/9TvDwCWaB5c/udQPigFvmgAJ

Les pipes et sockets nommés sont très similaires, cependant, le module net implémente les sockets locaux en spécifiant une path au lieu de Host et port:

Exemple:

var net = require('net');

var server = net.createServer(function(stream) {
  stream.on('data', function(c) {
    console.log('data:', c.toString());
  });
  stream.on('end', function() {
    server.close();
  });
});

server.listen('/tmp/test.sock');

var stream = net.connect('/tmp/test.sock');
stream.write('hello');
stream.end();
26
jpillora

Travailler avec des pipes nommés sous Windows

Nœud v0.12.4

var net = require('net');

var PIPE_NAME = "mypipe";
var PIPE_PATH = "\\\\.\\pipe\\" + PIPE_NAME;

var L = console.log;

var server = net.createServer(function(stream) {
    L('Server: on connection')

    stream.on('data', function(c) {
        L('Server: on data:', c.toString());
    });

    stream.on('end', function() {
        L('Server: on end')
        server.close();
    });

    stream.write('Take it easy!');
});

server.on('close',function(){
    L('Server: on close');
})

server.listen(PIPE_PATH,function(){
    L('Server: on listening');
})

// == Client part == //
var client = net.connect(PIPE_PATH, function() {
    L('Client: on connection');
})

client.on('data', function(data) {
    L('Client: on data:', data.toString());
    client.end('Thanks!');
});

client.on('end', function() {
    L('Client: on end');
})

Sortie:

Server: on listening
Client: on connection
Server: on connection
Client: on data: Take it easy!
Server: on data: Thanks!
Client: on end
Server: on end
Server: on close

Note sur les noms de pipe:

C/C++/Nodejs:
\\.\pipe\PIPENAME CreateNamedPipe

.Net/Powershell:
\\.\PIPENAME NamedPipeClientStream/NamedPipeServerStream

Les deux utiliseront le descripteur de fichier:
\Device\NamedPipe\PIPENAME

27
befzz

Peut-être utiliser fs.watchFile au lieu du tube nommé? Voir documentation

0
Vodun