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 です。
送信者からすべてのデータを受信するには?