1

nodejs でファイル マルチキャストを送信するアプリケーションを作成します ファイルをチャンク単位で読み取り、このようにブロックで送信します

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

関数 sendBlock by 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);
            });
        });

メッセージを受信するクライアントを作成します

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 です。

送信者からすべてのデータを受信するには?

4

1 に答える 1

1

Node.js は、基盤となるオペレーティング システムの制限を受けます。オペレーティング システムは、プロセスが同時に保持できる未処理のハンドルの数に制限を設けています。

利用可能なファイル記述子の数を使い果たしている可能性があります。アプリケーションが消費しようとするファイル記述子の数を減らすために、接続プールを使用することをお勧めします。したがって、一度に 1000 件を送信しようとする代わりに、一度に 100 件の接続のプールにプログラムを制限します。

npm から利用できる接続プーリング ライブラリがいくつかあります。一般的な選択肢の 1 つはpoolrです。

于 2013-06-20T18:18:42.647 に答える