node.js 可以作nodejs搭建web服务器器吗

网页设计教程与开发
提供各种常见网页效果
提供各种各样的设计教程
装扮QQ,让QQ变得更酷
设计参考,提高自升水平
学习服务器和操作系统
提供各种素材和工具
收藏学习资料
您现在的位置:&&>>&&>>&&>>&&>>&正文
轻松创建nodejs服务器(8):非阻塞是如何实现的
这节我们来了解一下nodejs实现非阻塞操作的方法。
我们先来修改一下 start的处理程序:
var exec = require("child_process").
function start() {
& console.log("Request handler 'start' was called.");
& var content = "empty";
& exec("ls -lah", function (error, stdout, stderr) {
&content =
function upload() {
& console.log("Request handler 'upload' was called.");
& return "Hello Upload";
exports.start =
exports.upload =
这段代码,创建了一个新的变量content(初始值为“empty”),执行“ls -lah”命令,将结果赋值给content,最后将content返回。
我们引入了一个新的Node.js模块,child_process,之所以用它,是为了实现一个既简单又实用的非阻塞操作:exec()。
那么exec()做了什么呢?
它从Node.js来执行一个shell命令。在上面的例子里,我们用它来获取当前目录下所有的文件(“ls -lah”),然后,当/startURL请求的时候将文件信息输出到浏览器中。
我们启动服务器,访问“http://localhost:8888/start”我们会发现页面输出的内容是 empty。
exec()发挥作用了,有了它,我们可以执行非常耗时的shell操作而无需迫使我们的应用停下来等待该操作。
虽然如此,但是页面输出的内容似乎不是我们想要的结果。
我们来分析一下原因:
我们的代码是同步执行的,这就意味着在调用exec()之后,Node.js会立即执行 return content ;
在这个时候,content仍然是“empty”,因为传递给exec()的回调函数还未执行到――因为exec()的操作是异步的。
下一节我们将介绍如何解决这个问题。
转载请注明:破洛洛(谢谢合作)
上一篇文章: 下一篇文章:
网友评论:
[][][][][][][][][][]node.js 怎么作为服务器_百度知道
node.js 怎么作为服务器
我有更好的答案
首先创建一个HTTP服务器,当服务器接收到客户端的请求后,向&&网站请求数据,当从该网站接受到的响应数据后,将响应数据发送给客户端. 代码如下: var http=require(&http&); var url=require(&url&); var server=http.createServer(function(sreq,sres){ var url_parts=url.parse(sreq.url); var opts={ host:&&, port:80, path:url_parts.pathname, headers:sreq.headers }; var creq=http.get(opts, function (cres) { sres.writeHead(cres.statusCode,cres.headers); cres.pipe(sres); }); sreq.pipe(creq); }); server.listen(.0.1&, function () { console.log(&开始监听&+server.address().port+&......&); }); 运行代码后,在浏览器端运行程序: 发现没有,界面是淘宝的官网,但是地址确实变成我们本...
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁【游戏开发】nodejs做游戏服务器开发前景如何?_互联网_易房网
nodejs做游戏服务器开发前景如何?
作者:admin
现在手游服务器好多用java的,比起java,用nodejs做游戏服务器开发有什么优势、劣势,网易也有开源pomelo框架,不过貌似现在用这框架的团队不多啊,对游戏服务器性能有了解的人事,
现在手游服务器好多用java的,比起java,用nodejs做游戏服务器开发有什么优势、劣势,网易也有开源pomelo框架,不过貌似现在用这框架的团队不多啊,对游戏服务器性能有了解的人事,请回答下易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
玩过一段时间pomelo 算混在contributor,不过1.0版本之后就没太关注;之前拿来做过一个游戏上线的部分实时性强的后台优势:开发成本低,快速迭代,能热更~性能还行,性价比不错劣势:对程序员还是有点要求的,如果对js了解不多容易写崩盘……Java的好处是这个语言比较工业级,程序员不那么容易崩盘。。。但是热更和性能上会搞起来麻烦点(NIO大法好)特别想说一下性价比的事情~ 如果是你对性能要求很高,扣内存扣到byte级别,那么最好用C++,不过这个人力成本会比较高,毕竟老司机难找;如果你对这方面不是特别敏感(滚服/限制人数之类的.),我觉得一个普通的JS程序员就能做出性能还行的服务器了,之后的等你赚钱了之后再考虑吧(逃ps. 至于 @bhuztez提到的1G限制,你可以用redis、pomelo分server来绕开;何况考虑多服务器的同步的问题,也不太好很多数据直接塞单个node里
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
如何迅速成长为一个中型技术团队?用 java--- 分割线 ---利益相关:目前正在用 Node.js 做一个手游服务器。还比较乐在其中。所以我说的千万不可当真。优势:Node.js配合NoSQL,可以说是变形金刚。只有策划想不到。闭包,异步,函数式做这种数据处理不能更自由了。无论是怎么变换,运算,存储都不会因为语言卡coding速度和性能。java就不一样了,新增/变更数据结构,网络连接的多协议支持,数据处理的逻辑链改动,同时还要兼顾性能都比较麻烦费脑,但是用java构建一条数据处理的管道又实在太别扭了。劣势:维护成本上来说Node.js明显被java甩开几条街。逻辑部分如果超过5W行js松松变成噩梦。届时肯定要迁移部分固定的业务逻辑到c++。但是其实也并没有什么明显的优劣势,已有团队就看已有团队顺手度,组建团队java,Node.js成本相差也不会差到1个数量级。反正要是牛逼了服务器最后肯定cpp重写。所以要是钱多应该直接cpp。
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
正在用nodejs开发游戏服务器,基本框架已经搭建完,现在在上面铺逻辑,说一下我认为的坑。首先网易的pomelo之前我花过一段时间去研究,本来希望直接用的,但是发现网易的维护太慢,反应的问题反馈不及时,项目时间又紧,没办法,只能自己动手写了。nodejs的接口设计的不错,自己写起来也不困难。核心问题是你要清楚游戏服务器要达到的目的。nodejs也有它的弊端,但是在我们的服务器里单线程真的不是问题,我们现在服务器开发单线程基本没有大问题,当然这个要看你的游戏具体情况了,异步才是最大的改变,以前写c++服务器的时候,rpc都是同步机制,现在用nodejs了,各种rpc接口都是异步调用,这大大改变了我们设计接口的思路,当然,我也是第一次用nodejs写服务器,也许后面就会觉得这也不是问题,至于上面提到的内存问题,其实也不是问题,如果你觉得v8本身的内存限制是个问题,就自己写c++接口去管理内存,或者是把服务器进程写成无状态的,然后把数据放redis里面去处理,我们现在就是这么干的。然后才是正真的问题来了,前后端语言不一致才是问题的关键。前端我们用的是cocos2dx,但是脚本用的是lua,不要问我为什么没有用js,因为之前我们用c++开发的时候,前后端脚本都是lua,前端程序又不想学js,于是就变成这样了,由于前后端脚本语言不一致,必然涉及到相同的逻辑需要用两种语言写两遍,维护起来就是坑爹,现在我们的做法是尽量让相同逻辑只运行在同一种语言下,例如把原来只需要客户端处理的逻辑移到服务器上去,或者服务器直接调用客户端逻辑,对于客户端用lua写的逻辑,我给nodejs写了一个lua绑定,这样nodejs就可以启动lua虚拟机来运行lua脚本了,但是仍然很坑,因为客户端在写lua逻辑的时候基本不会考虑你服务器会这么调用,他怎么方便怎么写,但服务器其实只想要调用客户端lua代码中的部分逻辑时就问题很大,这部分逻辑必须要保证安全而且尽量有用,例如客户端的UI逻辑就不可能让他跑在服务器上,总之这里各种坑。当然有人会说,那是你们客户端写的龊,模块化不够,当然,如果客户端能够非常好的模块化逻辑也不存在这个问题,但是当大家的deadline都被吃的死死的时候,当大家都加班都深夜的时候,你还能去喷跟你一起奋战的兄弟代码写的不好吗?当然,我也喷了,但是不会强求,本是同根生,相煎何太急。好像扯远了,上面有朋友提到,js代码超过多少就成为噩梦,我觉得还好,当然可能是我们还没有上线运营,至于为什么没有用c++来写,还真的是因为我觉得自己c++水平不够,不能这么快就撸一个游戏服务器出来,但是如果用nodejs,也许就可以,而且当时只有我一个服务器程序,反正光脚的不怕穿鞋的,看到nodejs这么火,也想体验一把。然后谈一谈性能,v8引擎的性能没什么好说的,网上一搜一大把,我的js代码也许就写的不怎么样,但自我感觉还可以,设计上也尽量异步了,服务器进程内部是用的zmq通信,我写了一个zmq的管家模式,当然针对我们游戏进行了一定的修改,跟客户端的连接一开始用的是原生的socket,lua那边我用的是luasocket,nodejs这边用的是net.socket,协议是我自己定义的,把数值、字符串序列化成二进制流,没有做压缩跟加密,性能看上去还不错,单个nodejs进程hold住4000客户端,每个cli每秒5个包,没有对包内容做处理,只做黏包的处理,每个包100bytes左右,12核24G内存的centos,开了5个node进程,CPU在30%左右,内存基本没变化,当然对内存我还是自己观察了的,还做了heapdump,为了防止存在内存泄漏的风险。这是没有做任何优化的效果。后来客户端程序说他不要用luasocket了,想要用websocket,好!你叼!然后就放弃了我之前写的那一套,其实我同意的另一个主要原因是我也想尝尝鲜,websocket之前没有用过,正好用一用,cocos2dx对websocket已经封装好了,nodejs这边,我用的是ws模块,试过了很多websocket模块,包括用的人很多的http://socket.io,但是最后还是觉得ws模块最简单耐操。websocket模块的性能是真让我吃了一惊,单个node2000连接,每秒只发2个包,CPU就尼玛跑到100%了,坑我呢。不过最后也没办法,只能将就这样了,我看了ws模块的代码,觉得性能出在解析ws字节流的地方,不过没有做分析,只是预测,好在我的服务器进程是无状态的,可以随便增加进程数量来解决这个性能问题。然后是开发前景,个人觉得nodejs在游戏服务器这块可能没有在web那边的影响那么大,原因也很简单,游戏所要求的性能确实比web要高,主要差别在于对实时性的处理。node单线程的架构很难在这方面努力,同时还有语言的问题,游戏前端用js来开发的,除了web游戏,真的是非常少见的,虽然cocos2dx有js的绑定,但是我依然看到大部分开发者选择lua绑定,不然为什么会出来一个quick-cocos呢,而前后端语言不一致问题真的很大,这个项目做完了,我就不打算继续用node开发游戏服务器了,当然,如果领导想要拿去换皮,我还是可以支持一下的,但是如果是全新做另一款风格不同的游戏,我很可能还是回归c++和lua了。还要提到其他的一些游戏服务器开发语言,我周围也有人用go在开发服务器,还有用php和python的,但是放眼看去,真的不多,最多的还是c++
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
pomelo偶是contributor个人以为除了 魔兽那样的顶级rpg其它基本都能搞定本身nodejs性能不输给java
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
占个坑,带我们的游戏上线后(马上就要上线了,一个月内),再来回答这个问题,我们的后台就是nodejs写的,游戏后台 express+redis+mysql..........
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
如何破除 Node.js 的 1GB 内存限制? - JavaScript
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
今天畅游公测的《魔剑之刃》的服务器有一部分用的就是nodejs
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
我只是想借个楼问一下为啥nodejs写的atom那么卡既然编辑器都被社区写成这样,怎么应对高负荷的服务器?
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将
追究责任;3.作者投稿可能会经我们编辑修改或补充。
泰州收费站清理道口积水保畅通
司机开车吃棒冰被罚款 交警称棒冰易化影响驾驶
运-20总师回应军迷:胖妞这个称呼我很喜欢
俄大妈头顶圆白菜坐地铁 高冷霸气引围观
广西宜州山洪导致木条铺满水电站
武汉小区被水淹 花甲环卫工跳入污水清捞垃圾
网传为什么救灾一线的官兵啃馒头喝矿泉水?官方解
铁岭醉男载怀孕妻子 撞飞民警
友情链接、商务合作QQ:& Nodejs创建HTTPS服务器
Nodejs创建HTTPS服务器
,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
转载请注明出处:
互联网应用越来越多,网络安全问题应该值得大家注意起来,特别是对于有在线支付业务的网站!为保证用户的账户安全,应该使用HTTPS协议代替HTTP协议,在数据传输层保持加密。
大部分的美国网站,当涉及到个人信息时,如果不提供HTTPS的服务,多数用户都会拒绝使用的。中国的网民什么时候,才会有这种意识呢?
HTTP和HTTPS介绍
用Nodejs创建HTTPS服务器(Win7)
用Nodejs创建HTTPS服务器(Linux)
抓取请求,验证加密
1. HTTP和HTTPS介绍
HTTP: 超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTPS:(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
HTTPS和HTTP的区别
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTP和HTTPS的介绍,摘自
在Nodejs中,我们可以通过内置的https库,来实现HTTPS服务器。
Nodejs的HTTPS使用文档:
2. 用Nodejs创建HTTPS服务器(Win7)
win7 64bit
IP: 192.168.1.13
Nodejs:v0.10.5
Npm:1.2.19
创建express的开发环境
~ D:\workspace\javascript>express -e
nodejs-https
~ D:\workspace\javascript>cd nodejs-https && npm install
ejs@0.8.5 node_modules\ejs
express@3.2.6 node_modules\express
├── methods@0.0.1
├── fresh@0.1.0
├── cookie-signature@1.0.1
├── range-parser@0.0.4
├── debug@0.7.4
├── buffer-crc32@0.2.1
├── cookie@0.1.0
├── commander@0.6.1
├── mkdirp@0.3.4
├── send@0.1.0 (mime@1.2.6)
└── connect@2.7.11 (pause@0.0.1, qs@0.6.5, bytes@0.2.0, cookie@0.0.5, formidable@1.0.14, send@0.1.1)
我本地已经安装了,其中包括了openssl程序。
~ D:\workspace\javascript\nodejs-https>git --version
git version 1.8.1.msysgit.1
~ D:\workspace\javascript\nodejs-https>openssl version -a
OpenSSL 0.9.8e 23 Feb 2007
built on: Sat Sep 15 20:34:58 EDT 2007
platform: MSys
bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) blowfish(idx)
compiler: gcc -D_WINDLL -DOPENSSL_PIC -DOPENSSL_THREADS
-DDSO_DLFCN -DHAVE_DLFCN_H -DTERMIOS -DL_ENDIAN -D__CYGWIN__ -f
omit-frame-pointer -fnative-struct -O3 -mcpu=pentium -march=i486 -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -
DSHA1_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM
OPENSSLDIR: "/usr/ssl"
openssl生成证书文件
#生成私钥key文件:
~ D:\workspace\javascript\nodejs-https>openssl genrsa -out privatekey.pem 1024
Generating RSA private key, 1024 bit long modulus
...........................++++++
........++++++
#通过私钥生成CSR证书签名
~ D:\workspace\javascript\nodejs-https>openssl req -new -key privatekey.pem -out certrequest.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:fens.me
Organizational Unit Name (eg, section) []:fens.me
Common Name (eg, YOUR name) []:Conan Zhang
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# 通过私钥和证书签名生成证书文件
~ D:\workspace\javascript\nodejs-https>openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
Signature ok
subject=/C=CN/ST=Beijing/L=Beijing/O=fens.me/OU=fens.me/CN=Conan Zhang/emailAddress=
Getting Private key
新生成了3个文件:certificate.pem, certrequest.csr, privatekey.pem
~ D:\workspace\javascript\nodejs-https>ls -l
-rwx------
mkpasswd 877 Dec 14 10:53 app.js
-rwx------
mkpasswd 956 Dec 14 11:22 certificate.pem
-rwx------
mkpasswd 704 Dec 14 11:21 certrequest.csr
drwx------+ 1
0 Dec 14 11:10 node_modules
-rwx------
mkpasswd 216 Dec 14 11:03 package.json
-rwx------
mkpasswd 887 Dec 14 11:20 privatekey.pem
drwx------+ 1
0 Dec 14 10:53 public
drwx------+ 1
0 Dec 14 10:53 routes
drwx------+ 1
0 Dec 14 10:53 views
privatekey.pem: 私钥
certrequest.csr: CSR证书签名
certificate.pem: 证书文件
修改启动文件:app.js
~ vi app.js
var https = require('https')
,fs = require("fs");
var options = {
key: fs.readFileSync('./privatekey.pem'),
cert: fs.readFileSync('./certificate.pem')
https.createServer(options, app).listen(3011, function () {
console.log('Https server listening on port ' + 3011);
启动服务器:
~ D:\workspace\javascript\nodejs-https>node app.js
Express server listening on port 3000
Https server listening on port 3011
打开浏览器:HTTP访问
由于我们证书是自己创建的,没有经过第三方机构的验证,因此会出现警告的提示。大家可以去有资质的网络运营商,去申请自己的证书。比如:,优惠码:WOWfensme
这样我们就在win7完整的HTTPS服务器创建。
3. 用Nodejs创建HTTPS服务器(Linux)
创建过程与win7类似
Linux: Ubuntu 12.04.2 LTS 64bit deskop
IP: 192.168.1.20
Nodejs: npm 1.2.21
node v0.11.2
创建express项目
~ cd /home/conan/nodejs
~ express -e
nodejs-https
~ cd nodejs-https
~ sudo npm install
用openssl生成证书文件
~ openssl version -a
OpenSSL 1.0.1 14 Mar 2012
built on: Tue Jun
4 07:26:06 UTC 2013
platform: debian-amd64
bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DOPENSSL_NO_TLS1_2_CLIENT -DOPENSSL_MAX_TLS1_2_CIPHER_LENGTH=50 -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"
~ openssl genrsa -out privatekey.pem 1024
~ openssl req -new -key privatekey.pem -out certrequest.csr
~ openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
修改文件app.js
~ vi app.js
//在最下面
var https = require('https')
,fs = require("fs");
var options = {
key: fs.readFileSync('./privatekey.pem'),
cert: fs.readFileSync('./certificate.pem')
https.createServer(options, app).listen(3011, function () {
console.log('Https server listening on port ' + 3011);
启动服务器
~ node app.js
Express server listening on port 3000
Https server listening on port 3011
打开浏览器:
4. 抓取请求,验证加密
为了验证数据在传输过程中是加密的,我们用wireshark抓取网络包。
HTTP请求:http://192.168.1.20:3000/users?a=111
HTTPS请求:https://192.168.1.20:3011/users?a=112
在HTTP下面,URL请求的参数是被暴露的。在HTTPS下面,URL的请求参数是被加密的。因此,希望需要填写个人信息,及在线支付的网站,都把HTTPS服务器搭建起来。防止私密数据,在网络传输过程中被获取。
转载请注明出处:
This entry was posted in ,
Designed by

我要回帖

更多关于 nodejs服务器搭建 的文章

 

随机推荐