2013-06-20 32 views
1

我寫的應用程序發送的的NodeJS 文件播我的塊讀取文件,並將其發送塊這樣不能趕在「1000消息的NodeJS UDP

for (var block = 1; block <= number_of_block; block++) { 
        sendBlock(FILEPATH, block) 

由CHUNK功能sendBlock

function sendBlock(file, block) { 
      fs.open(file, 'r', function(err, fp) { 
      if (err) {    
       return; 
      } 
      var buf = new Buffer(4 + CHUNK_SIZE); 
      fs.read(fp, buf, 4, CHUNK_SIZE, (block - 1) * CHUNK_SIZE, function(err, bytesRead) { 
       if (err) { 

       } 
       buf[0] = 0; 
       buf[1] = opcodes.OPCODE_DATA; 
       buf[2] = (block >> 8) & 0xFF; 
       buf[3] = block & 0xFF; 
       udpserver.send(buf, 0, 4 + bytesRead, PORT, MULTICAST_IP_ADDRESS); 
       fs.close(fp); 
      }); 
     }); 

創建客戶端接收消息

fs.open(fileName, 'a', function(e, id) { 
       if (4 + CHUNK_SIZE > message.length) { 
        fs.write(fd, message, 4, message.length - 4, (block - 1) * CHUNK_SIZE, function() { 
         fs.close(fd, function() { 
          console.log('file closed', block); 
          send("miss block:" + missArray); 
         }); 
        }); 
       } else { 
        console.log("message length:", message.length) 
        console.log((block - 1) * CHUNK_SIZE) 

        fs.write(fd, message, 4, CHUNK_SIZE, (block - 1) * CHUNK_SIZE, function() { 
         fs.close(fd, function() { 
          console.log('1file closed', block); 
          if (block % NUMBER_BLOCK == 0) { 
           if (blockArray.length > 0) { 
            missArray = missArray.concat(blockArray); 
           } 
           blockArray = range(block + 1, NUMBER_BLOCK) 
          } 

          //udpserver.send(block+1) 
         }); 
        }); 
       } 
      }); 

但是,當服務器發送超過1000消息客戶端無法趕上這一切 服務器發送

block -- 6907 
block -- 6908 
block -- 6909 
block -- 6910 
block -- 6911 
block -- 6912 
block -- 6913 

客戶reveive寫

block ------ 1008 
block ------ 1009 
block ------ 1010 
block ------ 1011 

我測試獲得最大的文件是10.4 MB。

如何接收發件人的所有數據?

回答

1

Node.js受底層操作系統的限制。操作系統限制進程可同時處理的未完成句柄的數量。

這很可能是您耗盡了可用文件描述符的數量。我建議使用連接池來減少應用程序嘗試使用的文件描述符的數量。因此,不要一次嘗試發送1000個事情,而要一次將您的程序限制在一個說100個連接的池中。

有幾個連接池庫可通過npm - 一個流行的選擇是poolr