如何在Node.js中创建一个命名管道?

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

5
好的,我会尽力进行翻译并保持原意不变。以下是需要翻译的内容:https://github.com/zacgeis/fifoJS - user860639
3个回答

43

在Windows上使用命名管道

Node 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请求?其他客户端可以向其他客户端发送消息吗? - oligofren
管道基本上与Unix套接字相同,但在Windows下工作吗? - NiCk Newman
3
Windows (NT) 命名管道与 Unix 域套接字非常类似。它们有一些区别(独立的文件系统命名空间,使用文件 API 进行 IO 操作并使用自己的 API 进行管理,而不是使用套接字 API;当服务器进程关闭时不会持久化;传递句柄与传递 fd 不同;如果启用,Windows 管道可以通过网络访问),但用例几乎相同。保护 Windows 管道可能很棘手,但是是可行的。Unix(命名)管道 / FIFO 的功能更加有限(仅支持单向,无法支持多个客户端等)。 - CBHacking

34

看起来Node核心不支持命名管道,也不会支持 - 来自Ben Noordhuis 10/11/11:

Windows有一个命名管道的概念,但由于你提到了mkfifo,我认为你是指UNIX FIFOs。

我们不支持它们,也很可能永远不会支持(非阻塞模式下的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]); - jpillora

-1

也许可以使用 fs.watchFile 代替命名管道?请参见文档


1
很不幸,在我的使用情况中,我需要确切的命名管道,而我不能使用watchFile方法 :-( - wako

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接