【问题标题】:Can not catch over >1000 message when server send over 1000 message at a time nodejs udp当服务器一次发送超过 1000 条消息时,无法捕获超过 1000 条消息 nodejs udp
【发布时间】:2013-06-21 02:18:42
【问题描述】:

我编写应用程序以通过 nodejs 发送文件多播 我逐块读取文件并像这样以块的形式发送它

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

客户接收并写入

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

我测试接收的最大文件是 10.4 MB。

如何接收发送方的所有数据?

【问题讨论】:

    标签: node.js udp


    【解决方案1】:

    Node.js 受底层操作系统的限制。操作系统对一个进程可以同时持有的未完成句柄的数量进行了限制。

    您可能已经用尽了可用文件描述符的数量。我建议使用连接池来减少应用程序尝试使用的文件描述符的数量。因此,与其尝试一次发送 1000 个内容,不如将您的程序限制为一次包含 100 个连接的池。

    通过 npm 可以使用多个连接池库 - 一种流行的选择是 poolr

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2021-05-22
      • 2023-03-15
      相关资源
      最近更新 更多