【问题标题】:How to create a named pipe in node.js?如何在 node.js 中创建命名管道?
【发布时间】:2012-07-29 19:20:17
【问题描述】:

如何在 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);
    }
});

【问题讨论】:

标签: node.js pipe named-pipes


【解决方案1】:

在 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

【讨论】:

  • 有什么方法可以通过该管道发送 HTTP 请求?其他客户端可以向其他客户端发送消息吗?
  • 管道和unix socket基本一样,但是在windows下工作?
  • @NiCkNewman:Windows (NT) 命名管道非常类似于 Unix 域套接字,是的。它们有一些区别(单独的文件系统命名空间,使用文件 API 进行 IO 和他们自己的 API 进行管理而不是使用套接字 API,当服务器进程消失时不会持续存在,传递 HANDLE 与传递 fd 不同,Windows 管道 可以通过网络访问,如果你启用它),但用例几乎相同。保护 Windows 管道可能很棘手,但这是可能的。 Unix(命名)管道/FIFO 受到更多限制(仅限单向,不能支持多个客户端等)
【解决方案2】:

Node 核心似乎不支持也不会支持名称管道 - 来自 Ben Noordhuis 2011 年 10 月 11 日:

Windows 有命名管道的概念,但既然你提到了mkfifo 我 假设您的意思是 UNIX FIFO。

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

https://groups.google.com/d/msg/nodejs/9TvDwCWaB5c/udQPigFvmgAJ

命名管道和套接字非常相似,但是 net 模块通过指定 path 而不是 hostport 来实现本地套接字:

例子:

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

【讨论】:

  • @polkovnikov.ph 是的,server.listen(process.argv[2]);
【解决方案3】:

也许使用fs.watchFile 而不是命名管道?见documentation

【讨论】:

  • 不幸的是,在我的用例中,我需要完全命名的管道,但我不能使用 watchFile 方法:-(
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2014-12-21
相关资源
最近更新 更多