我正在使用node-tail在linux中读取文件并将其发送到套接字。
node.js发送从文本文件中读取的数据
var io = require('socket.io');
Tail = require('tail').Tail;
tail = new Tail("/tmp/test.txt");
io.sockets.on('connection', function (socket) {
tail.on("line", function(data) {
socket.emit('Message', { test: data });
});
});
接收方
var socket = io.connect();
socket.on('Message', function (data) {
console.log(data.test);
});
这有效,但当我尝试修改此部分时
tail = new Tail("/tmp/test.txt");
到这个
tail = new Tail("/tmp/FIFOFILE");
我无法从中获取任何数据。
无论如何在linux中读取命名管道?或者可以读取命名管道的包?
答案 0 :(得分:3)
我可以让它以愚蠢的方式工作:
// app.js
process.stdin.resume();
process.stdin.on('data', function(chunk) {
console.log('D', chunk);
});
从这样开始:
node app.js < /tmp/FIFOFILE
如果我为命名管道创建可读流,则在读取写入命名管道的第一个数据后结束。不确定为什么stdin
很特别。
答案 1 :(得分:0)
当最后一个过程完成写入FIFO时,操作系统将发送EOF。如果只有一个进程正在写入FIFO,则当该进程完成其填充时,您将获得EOF。此EOF触发Node关闭流。
@JoshuaWalsh在this answer中给出了避免这种情况的窍门,即:即使您无意进行写入,也可以自己打开管道进行读取和写入。这意味着操作系统会看到始终有至少一个进程正在写入文件,因此您永远都无法获得EOF。
所以...只需添加以下内容:
let fifoHandle = fs.open(fifoPath, fs.constants.O_RDWR,function(){console.log('FIFO open')});
您无需对fifoHandle进行任何操作-只需确保它粘住并且不会收集到垃圾即可。
实际上...就我而言,我使用的是createReadStream,我发现仅将fs.constants.O_RDWR添加到其中就足够了(即使我无意写出fifo。
let fifo = fs.createReadStream(fifoPath,{flags: fs.constants.O_RDWR});
fifo.on('data',function(data){
console.log('Got data:'+data.toString());
}