Как создать именованный канал в node.js?

17

Как создать именованный канал в node.js?

P.S .: На данный момент я создаю именованный канал следующим образом. Но я думаю, что это не лучший способ.

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);
    }
});
    
задан wako 01.08.2012 в 00:36
источник

3 ответа

22

Похоже, что названия каналов не поддерживаются и не поддерживаются в ядре Node - от Ben Noordhuis 10/11/11:

  

В Windows есть концепция именованных каналов, но поскольку вы указываете mkfifo I   Предположим, вы имеете в виду UNIX FIFO.

     

Мы не поддерживаем их и, вероятно, никогда не будем (FIFO в неблокирующих   режим может блокировать цикл событий), но вы можете использовать   UNIX, если вам нужна аналогичная функциональность.

Ссылка

Именованные каналы и сокеты очень похожи, однако модуль net реализует локальные сокеты, указав path , а не host и port :

Пример:

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();
    
ответ дан jpillora 14.08.2013 в 10:20
источник
19

Работа с именованными каналами в Windows

Узел 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');
})

Вывод:

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

Примечание о названиях труб:

  

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

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

  Оба будут использовать дескриптор файла:
\Device\NamedPipe\PIPENAME

    
ответ дан befzz 24.08.2015 в 00:23
источник
-1

Может быть, использовать fs.watchFile вместо именованного канала? См. документацию

    
ответ дан Vodun 01.08.2012 в 13:47
источник