NodeJsは簡単なWEB上でサーバーをダウンロードすることを実現します.
5051 ワード
プロジェクト上のニーズはクラスタがPDFファイルを生成したり、PDFファイルにアクセスしたりすることができますが、ファイルサーバがないため、簡易なファイルサーバを行うことです.
ソリューション:クラスタ内のマシン(クライアント)がPDFファイルを生成した後、PDFファイルをファイルサーバに転送します.あるクライアントがこのPDFファイルにアクセスする必要がある場合は、(他のクライアントがこのPDFファイルを生成した可能性があるので)サーバに行って取得し、見つけられない場合は、自分のクライアントがPDFファイルを生成し、PDFファイルをサービスに押し付ける.
簡単な実施のために、NodeJsを採用して、小さなプログラムを実現します.多く言わないで、直接コードを入れます.
server.js
NodeJsについては、ほんの少ししか学んでいません.まだ多くの知識があります.みんなで見ればいいです.
ソリューション:クラスタ内のマシン(クライアント)がPDFファイルを生成した後、PDFファイルをファイルサーバに転送します.あるクライアントがこのPDFファイルにアクセスする必要がある場合は、(他のクライアントがこのPDFファイルを生成した可能性があるので)サーバに行って取得し、見つけられない場合は、自分のクライアントがPDFファイルを生成し、PDFファイルをサービスに押し付ける.
簡単な実施のために、NodeJsを採用して、小さなプログラムを実現します.多く言わないで、直接コードを入れます.
server.js
var express = require('express');
var url = require('url');
var fs = require('fs');
var http = require('http');
var queryString = require('querystring');
var bodyParser = require('body-parser');
var path=require('path');
var app = express();
app.use(bodyParser.json({limit:'1000kb'}));
app.use(bodyParser.urlencoded({limit:'1000kb',extended:true}));
var count=0;
app.post('/upload.node',function(req,resp){
console.log(' '+ (new Date()));
var data = new Buffer(req.body.fileData,'base64');
var filePath = req.body.filePath;
var pathObj = path.parse(filePath);//
var responseBody = {};
mkdirsSync(pathObj.dir);//
try{
var writerStream = fs.createWriteStream(filePath);
writerStream.write(data);
writerStream.end();
writerStream.on('finish', function() {
console.log(' '+ (new Date()));
});
writerStream.on('error', function(err){
console.log(err.stack);
});
responseBody=JSON.stringify({
returnMsg:'200'
});
}catch(err){
console.log(' '+ (new Date()));
responseBody=JSON.stringify({
returnMsg:'400'
});
}
//
//console.log('*** ' + count +' ***');
resp.status(200).end(responseBody.toString());
});
app.post('/download.node',function(req,resp){
console.log(' '+ (new Date()));
var filePath = req.body.filePath;
console.log('download');
var responseBody = {};
if(fs.existsSync(filePath)){
var data = fs.readFileSync(filePath);
var dataBase64 = data.toString('base64');
responseBody = JSON.stringify({
returnMsg:'200',
filePath:filePath,
fileData:dataBase64
});
console.log(' '+ (new Date()));
}else{
responseBody=JSON.stringify({
returnMsg:'400'
});
console.log(' '+ (new Date()));
}
//console.log('*** ' + ++count +' ***');
resp.status(200).end(responseBody.toString());
});
//
function mkdirsSync(filePath){
if(fs.existsSync(filePath)){
return true;
}else{
if(mkdirsSync(path.dirname(filePath))){
fs.mkdirSync(filePath);
return true;
}
}
}
var server = app.listen(20001,function(){
console.log('Server started.');
})
テストjsコードを提供します. ブラウザはgetで要求します.http://127.0.0.1:20000/upload.do?filePath=XXXXアップロードプロセスを起動できます.var express = require('express');
var url = require('url');
var fs = require('fs');
var http = require('http');
var queryString = require('querystring');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json({limit:'1000kb'}));
app.use(bodyParser.urlencoded({limit:'1000kb',extended:true}));
var count=0;
app.get('/upload.do',function(req,resp){
console.log('upload.do');
//var path = url.parse(req.url).pathname;
//console.log('Request for ' + path);
var filePath = req.query.filePath;
//var fileData = req.query.fileData;
var address = req.query.address;
upload(filePath,'127.0.0.1',20001);
console.log('*** ' + ++count +' ***');
var response = {
"first":req.query.filePath,
"last":req.query.address
};
resp.end(JSON.stringify(response));
});
function upload(filePath,address,port){
var Data = readFile(filePath);
var dataBase64 = Data.toString('base64');
console.log(Data);
console.log(dataBase64);
//var DataJSON = JSON.stringify(Data);
//fs.writeFile('D:/input.txt',dataBase64,function(err){
// if(err){
// console.err(err);
// }
//});
var JsonData = queryString.stringify({
filePath:filePath,
fileData:dataBase64
});
//console.log(JsonData);
var options = {
method: "POST",
host : address,
port : port,
path : '/upload.node',
headers: {
'Content-Type':'application/x-www-form-urlencoded'
}
};
var req = http.request(options, function(res){
res.setEncoding('utf8');
});
req.write(JsonData);
req.end();
}
function readFile(filePath){
var fileData = '';
try{
fileData = fs.readFileSync(filePath);
}catch(e){
fileData = '';
}
return fileData;
}
app.post('/download.do',function(req,resp){
// server.js
})
var server = app.listen(20000,function(){
console.log('Server started.');
})
これは簡単なNodejsプログラムです.このプログラムを直接使って測定します.結果は毎秒80個以上の要求を処理できます.基本的には現在の需要を満足できます.キャッシュ、キューなど多くの改善点があります.NodeJsについては、ほんの少ししか学んでいません.まだ多くの知識があります.みんなで見ればいいです.