如何在node.js中创建命名管道?

如何在node.js中创建命名管道?,node.js,pipe,named-pipes,Node.js,Pipe,Named Pipes,如何在node.js中创建命名管道 附言: 现在,我正在创建一个命名管道,如下所示。但我认为这不是最好的办法 var mkfifoProcess = spawn('mkfifo', [fifoFilePath]); mkfifoProcess.on('exit', function (code) { if (code == 0) { console.log('fifo created: ' + fifoFilePath); } else { co

如何在node.js中创建命名管道

附言: 现在,我正在创建一个命名管道,如下所示。但我认为这不是最好的办法

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);
    }
});

可能使用
fs.watchFile
而不是命名管道?请参见

看起来节点核心不支持也不会支持名称管道-摘自Ben Noordhuis 10/11/11:

Windows有命名管道的概念,但自从您提到
mkfifo
I 假设您指的是UNIX FIFO

我们不支持它们,可能永远也不会支持(非阻塞中的FIFO) 模式有可能使事件循环死锁),但您可以使用 UNIX套接字,如果您需要类似的功能

命名管道和套接字非常相似,但是,
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();
在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


不幸的是,在我的用例中,我需要精确命名的管道,我不能使用watchFile方法:-(@polkovnikov.ph yes,
server.listen(process.argv[2]);
有什么方法可以通过该管道发送HTTP请求吗?其他客户端可以向其他客户端发送消息吗?管道基本上与unix套接字相同,但在windows下工作吗?@NiCkNewman:windows(NT)命名管道非常类似于Unix域套接字,是的。它们有一些不同之处(单独的文件系统名称空间,使用文件API for IO和它们自己的API进行管理,而不是使用套接字API,当服务器进程消失时不会持久化,传递句柄不同于传递fd,如果启用,可以通过网络访问Windows管道),但使用情况几乎相同。保护Windows管道可能很棘手,但也是可能的。Unix(命名)管道/FIFO的限制更大(仅单向,不能支持多个客户端等)