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

20

Как создать именованный канал в 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
источник
  • github.com/zacgeis/fifoJS –  github.com/zacgeis/fifoJS 21.09.2012 в 15:24

3 ответа

23

Похоже, что названия каналов не поддерживаются и не поддерживаются в ядре 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
источник
  • Возможно ли передать сокет в качестве аргумента командной строки? –  polkovnikov.ph 06.05.2014 в 15:52
  • @ polkovnikov.ph да, server.listen (process.argv [2]); –  jpillora 29.06.2014 в 13:27
22

Работа с именованными каналами в 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
источник
  • Любой способ отправить HTTP-запрос по этому каналу? И могут ли другие клиенты отправлять сообщения другим клиентам? –  oligofren 13.10.2015 в 22:29
  • Являются ли трубы в основном такими же, как сокеты UNIX, но работают под окнами? –  NiCk Newman 18.06.2016 в 22:44
  • @NiCkNewman: Именованные каналы Windows (NT) очень похожи на сокеты домена Unix, да. У них есть некоторые отличия (отдельное пространство имен файловой системы, использование API-интерфейсов файлов для ввода-вывода и их собственных API-интерфейсов для управления, а не использование API-интерфейсов сокетов), не сохраняются, когда процесс сервера уходит, передача HANDLE отличается от передачи fd, доступ через сеть, если вы включите его), но варианты использования почти идентичны. Защита труб Windows может быть сложной, но возможна. Unix (названные) каналы / FIFO гораздо более ограничены (односторонние, не могут поддерживать несколько клиентов и т. Д.), –  CBHacking 07.04.2017 в 01:24
-1

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

    
ответ дан Vodun 01.08.2012 в 13:47
источник
  • К сожалению, в моем случае использования мне нужен точно именованный канал, и я не могу использовать метод watchFile :-( –  wako 02.08.2012 в 14:44