如何在node.js中创建命名管道?
如何在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
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的限制更大(仅单向,不能支持多个客户端等)