Как создать именованную трубу в 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);
}
});
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');
})
Вывод:
Сервер: на прослушивании
Клиент: на соединении
Сервер: на соединении
Клиент: на передаче данных: Спокойно!
Сервер: на данные: Спасибо!
Клиент: на конец
Сервер: на конец
Сервер: on close
Примечание по поводу имен труб:
C/C++ / Nodejs:
\\\\.\pipe\PIPENAME
CreateNamedPipe
.Net / Powershell:
\\\\.\pipe\PIPENAME
NamedPipeClientStream / NamedPipeServerStream
Оба будут использовать хэндл файла:
\Device\NamedPipe\PIPENAME
.
Похоже, name pipes не поддерживаются и не будут поддерживаться в ядре Node - от Ben Noordhuis 10/11/11:
В Windows есть концепция именованных труб, но поскольку вы упомянули
mkfifo
, я... предполагаю, что вы имеете в виду UNIX FIFOs.Мы не поддерживаем их и, вероятно, никогда не будем поддерживать (FIFO в неблокирующем режиме). режиме могут заблокировать цикл событий), но вы можете использовать сокеты UNIX, если вам нужна подобная функциональность.
https://groups.google.com/d/msg/nodejs/9TvDwCWaB5c/udQPigFvmgAJ
Именованные трубы и сокеты очень похожи, однако модуль net
реализует локальные сокеты, указывая путь
, а не хост
и порт
:
Пример:
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();