【发布时间】:2014-05-31 13:05:42
【问题描述】:
伙计们。我尝试使用 node.js 创建一个 p2p 文件共享应用程序。下载文件时,会逐块下载文件。
以下代码中使用的块大小为 1KB。但是它有一个问题,当可用套接字数MAX_SOCKET_CNT设置为30时,它就不起作用了。
如何运行代码:
首先运行node server.js,然后运行node client.js,这会将名为fav.mp3的文件下载到fav-local.mp3。
下载后,尝试运行diff fav.mp3 fav-local.mp3检查文件是否下载完成。
您能帮我找出问题所在吗?
欢迎任何答案或建议。提前致谢。
这里是源代码:
server.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);
});
});
}
【问题讨论】:
标签: javascript node.js download filestream p2p