当服务器一次发送超过1000条消息时,不能超过1000条消息nodejs udp

我写应用程序来发送文件多播由nodejs我读块文件并发送块像这样

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

函数sendBlock由CHUNK

 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); }); }); 

我创build客户端来接收消息

 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 

客户感受和写作

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

而我testing收到的最大文件是10.4 MB。

如何接收发件人的所有数据?

Node.js受底层操作系统的限制。 操作系统限制进程可以同时处理的未完成句柄的数量。

您可能会耗尽可用文件描述符的数量。 我build议使用连接池来减less应用程序尝试使用的文件描述符的数量。 因此,不要一次尝试发送1000个事情,而是一次将您的程序限制在一个说100个连接的池中。

有几个连接池库通过npm可用 – 一个stream行的select是poolr 。