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);
}
});
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();
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
Peut-être utiliser fs.watchFile
au lieu du tube nommé? Voir documentation