我想要使用node.js读取日志文件(大小为1-2 MB)。感谢这个论坛的帮助,我使用的是:
new lazy(fs.createReadStream(clientMessage.selectedFile))
.lines
.forEach(function(line){
sendData(line,client,playBackSpeed);});
sendData函数本质上是一个解析器,使用一个开关,逐行收集日志文件中的数据。以下是sendData函数中该解析器的片段:
switch (lineTokens[0]) //first token is the command idenitifier
{
case "$F":{ // heartbeat signal
var elapspedTimeIndex = 4, flagIndex = 5;
var heartBeat = "{\"heartBeat\": {\"elapsedTime\":"+ lineTokens[elapspedTimeIndex].trim() +", \"flag\":"+ lineTokens[flagIndex].trim() + "}}";
var now = new Date().getTime();
while(new Date().getTime() <= now + playBackSpeed) {} //sleep before we move on
client.send(heartBeat);
}
return;
}
}
我要定期发送数据,比如在1到5秒之间。在客户端UI中,有一种方法可以改变所需的播放速度。上面的代码工作正常但我无法在此文件流启动后更改playBackSpeed的值。我使用socket.io进行消息交换,这是正常的。似乎创建延迟的while循环阻止了客户端/服务器交换。我尝试输入一个setTimeout,但所有这一切都是playbackSpeed间隔的延迟,并将所有数据一次性发送到客户端。我确信这是一个I / O阻塞问题但是,我似乎可以从中挖掘出来。
答案 0 :(得分:0)
将数据推送到FIFO缓冲区并使用定时器事件发送
switch (lineTokens[0]) //first token is the command idenitifier
{
case "$F":{ // heartbeat signal
var elapspedTimeIndex = 4, flagIndex = 5;
var heartBeat = "{\"heartBeat\": {\"elapsedTime\":"+ lineTokens[elapspedTimeIndex].trim() +", \"flag\":"+ lineTokens[flagIndex].trim() + "}}";
client.queue.add(heartBeat);
}
return;
}
}
function checkQueue()
{
var msg = client.queue.pop();
if (!msg) return;
client.send(msg);
}
function setSpeed(newSpeed)
{
if (timerID)
clearInterval(timerID);
timerID = setInterval(checkQueue, playBackSpeed);
}
setSpeed(playBackSpeed);