项目上的需求是集群均可生成PDF文件或是访问PDF文件,但是没有文件服务器,故做一个简易的文件服务器。
解决方案:集群内的机器(客户端)生成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"htmlcode">
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程序,直接用此程序去压测,得到结果是每秒可处理八十多个请求,基本上能满足现在的需求,还有很多改进的地方,比如加入缓存,队列....等等。
对于NodeJs本人也只是学到了一点皮毛,还有很多知识点没去探究。大家看看就行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。