gpt4 book ai didi

javascript - p2p文件下载中node.js写入文件流无序

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:16 26 4
gpt4 key购买 nike

伙计们。我尝试使用node.js 创建一个p2p 文件共享应用程序。下载文件时,会逐 block 下载文件。

以下代码中使用的 block 大小为 1KB。但它有一个问题,当可用套接字数 MAX_SOCKET_CNT 设置为 30 时,它将不起作用。

如何运行代码:

首先,运行node server.js,然后运行node client.js,这会将名为fav.mp3的文件下载到fav-local.mp3

下载完成后,尝试运行diff fav.mp3 fav-local.mp3检查文件是否下载完整。

能帮我看看问题出在哪里吗?

欢迎任何答案或建议。提前致谢。

这是源代码:

服务器.js

var http = require("http");
var url = require("url");
var fs = require('fs');

function downloadBlock(request, response){
var urlParts = url.parse(request.url, true);
var query = urlParts.query;

if('block_id' in query){
response.writeHead(200, {"Content-Type": "audio/mpeg"});
var startHere=parseInt(query["block_id"]);
var BLOCK_SIZE=1024;
var currentPosition=startHere*BLOCK_SIZE;
var readStream = fs.createReadStream('fav.mp3',{start: startHere*BLOCK_SIZE, end:startHere*BLOCK_SIZE+BLOCK_SIZE-1});
readStream.pipe(response);
}else{
response.writeHead(200, {"Content-Type": "text/html"});
response.write("refused");
response.end();
console.log("Warning: not a file block download request...");
}
}


http.createServer(downloadBlock).listen(8801);
console.log("Server has started. please ensure that the fav.mp3 file(size=439355B) is here.");
<小时/>

client.js

var http = require('http');
var fs = require('fs');

var remoteFile='fav.mp3';
var fileSize=439355;
var localFile='fav-local.mp3';
var totalBlocks=Math.floor((fileSize+1023)/1024);
/**************************************************/
//KEY POINT
var MAX_SOCKET_CNT=totalBlocks; //worked
//var MAX_SOCKET_CNT=30;//not work //????because of recursive downloadBlock function????
/*************************************************/
for(var i=0;i<MAX_SOCKET_CNT;++i){
downloadBlock('127.0.0.1',8801,remoteFile, localFile,i,totalBlocks);
}

function downloadBlock(IP,PORT,remoteFile,localFile,blockID,totalBlocksNum){
if(blockID >= totalBlocksNum) return;
var BLOCK_SIZE=1024;
var file = fs.createWriteStream(localFile,{start: blockID*BLOCK_SIZE});
var request = http.get("http://localhost:"+PORT+"/download_block?block_id="+blockID, function(response) {
response.pipe(file);
file.on('finish', function() {
var callback=function downloadBlockOver(){
console.log("compelete download blockID:"+blockID);
var nextBlockID=blockID+MAX_SOCKET_CNT;
if(nextBlockID<totalBlocksNum){
downloadBlock(IP,PORT,remoteFile,localFile,nextBlockID,totalBlocksNum); //why not this work if MAX_SOCKET_CNT=30???
}
}
file.close(callback);
});
});
}

最佳答案

啊哈。最后,我找到了解决方案。您必须先创建该文件。然后在下载之前用“r+”更改写入流的标志。

function touchFile(fileName,fileSize){
var BLOCK_SIZE=1024;
var totalBlocks=Math.floor((fileSize+BLOCK_SIZE-1)/BLOCK_SIZE);
var file = fs.createWriteStream(fileName);
var blockBuffer=new Buffer(BLOCK_SIZE);
for(var i=0;i<totalBlocks-1;++i){
file.write(blockBuffer,0, BLOCK_SIZE);
}
var leftToFill=new Buffer(fileSize-(totalBlocks-1)*BLOCK_SIZE);
file.write(leftToFill,0, leftToFill.Length);
file.end();
}

添加函数“touchFile(localFile,fileSize);”在下载 block 之前。然后更改:

var file = fs.createWriteStream(localFile,{start: blockID*BLOCK_SIZE});

var file = fs.createWriteStream(localFile,{start: blockID*BLOCK_SIZE,flags:'r+',autoClose: true});

现在就可以了。

关于javascript - p2p文件下载中node.js写入文件流无序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23970423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com