2011-06-10 78 views
0

我有要使用node.js读取的日志文件(大小为1-2 MB)。感谢帮助在这个论坛上,我使用的东西,如:将JSON数据发送到从文件读取时触发的客户端

new lazy(fs.createReadStream(clientMessage.selectedFile)) 
.lines 
.forEach(function(line){ 
sendData(line,client,playBackSpeed);}); 

的发送数据的功能本质上是一个分析器,使用开关,通过线收集从日志文件中的数据,行。以下是在送出数据功能解析器的一个片段:

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,但是所做的只是延迟播放间隔,并一次将所有数据发送到客户端。我确信这是一个I/O阻塞问题,但我似乎可以从中发现这一点。

回答

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); 
发送它
相关问题