新技术你知道吗?Node.js的HelloWorld!

大名鼎鼎的JavaScript引擎V8想必不少朋友都知道,即使你不知道V8的名字,总听说过Google Chrome浏览器的JavaScript引擎是最快的吧.其实Google Chrome浏览器用的就是V8.今天我们介绍的一款开源软件也正是在V8的基础上发展而来的,不同的是,它不是运行于浏览器中,而是独立出来,用于其它领域,比如说应用服务器什么的。

言过正传,Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始。他。Node为创建http服务器作了优化,所以你在网上看到的大部分示例和库都是集中在web上(http框架、模板库等)。它的官方简介如下:

“Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.”

翻译过来就是:“Node.js是建立在Chrome浏览器的JavaScript运行时基础上,用于快速构建可扩展的网络应用的平台。 Node.js的使用事件驱动,非阻塞I / O模型,使得它量轻高效,可完美的用于分布式环境下的数据密集型、实时应用程序。”

这里需要强调的是,它还很“新”,目前官方的版本是“v0.6.12”,也就是说还有许多需要改进和完善的地方,当然这并不妨碍我们通过一个“HelloWorld”测试程序来窥其一斑,也不会妨碍大牛们通过对其特点的发现和源码的分析,学习和借鉴其先进的思想。有人说互联网时代,应用程序永远都是Beta版,我不否认这样做的积极意义,但请务必注意,如果你今天就打算将其用于实际应用的话,请先做好必要的测试,当你发现了它足够多的BUG和限制条件后,也许你才有条件稳妥的将其应用于实际。请相信,“Node.js”就是这样的Beta版。

一、首先让我们建立起环境:

1、到“http://nodejs.org/”处下载最版本,有Windows版和Macintosh版安装包,还有源码包,我下载的是Windows版的安装包;

2、安装运行环境,对Windows版来说简单方便,执行安装包即可。它会默认安装到“Program Files”目录下。

二、建立HelloWorld测试服务器程序:

用记事本新建一个JavaScript文件:svr.js

 1  var http = require('http');  //请求http模块,以下程序中,变量http代表该模块
 2  var getCount=0; //为测试使用的变量,用于记录客户端请求次数
 3  
 4  console.time('[HelloWorldSvr][Start]'); //开始服务启动计时器,命名并开始一个计时器,将来通过其名称来结束该计时器,并输出到控制台
 5  
 6  http.createServer(function (request, response) { //创建一个http服务器,唯一的参数是一个匿名的请求响应函数,如下
 7      getCount++;  //请求计数器加1
 8      var getNo=getCount; //记录本次请求的序号,方便日志输出
 9  
10      console.time('[HelloWorldSvr][Get]'+getNo); //开始请求响应计时器
11  
12      console.log(request.url); //向控制台输出请求的路径
13      //以下多行简单的忽略请求的路径,直接向http返回一段html文本
14      response.writeHead(200, {'Content-Type': 'text/html'});
15      response.write('<html><body>');
16      response.write('<h1>*** Node.js ***</h1>');
17      response.write('<h2>Hello World!'+getNo+'</h2>');
18      response.end('</body></html>');
19      console.timeEnd('[HelloWorldSvr][Get]'+getNo); //结束请求相应计时器,并向控制台输出本次请求相应花费的时间
20  }).listen(8124);  //开始侦听8124端口,也就是说,从此刻开始本机8124端口上建立起了一个简单的http服务器,不管如何请求,都返回一段简单的html文本
21  
22  console.log('[HelloWorldSvr][Start] running at http://127.0.0.1:8124/'); //向控制台输出服务启动的信息
23  console.timeEnd('[HelloWorldSvr][Start]'); //结束服务启动计时器,并向控制台输出服务启动花费的时间

以上就是构建一个简单的http服务器的全部代码,这个服务启侦听8124端口,对任何http请求都返回一段包含请求序号的html网页。

 

三、运行并测试服务器程序:

要将其运行起来可在命令行下输入(假设Node.js安装在“c:\Program Files\nodejs\”目录,你的新建的svr.js文件就放在其中):

"C:\Program Files\nodejs\node.exe" svr.js

运行结果如下:

我们看到,我们的HelloWorld服务器已经运行于http://127.0.0.1:8124,启动时间为8毫秒。

如何停下来呢?简单,只需要在命令行中输入CTL+C就行。

让我们再次运行起HelloWorld服务器,并打开浏览器访问http://127.0.0.1:8124地址,结果如下:

浏览器显示了返回的网页,刷新几次可以观察网页内容的变化(请求序号)和服务器控制台的日志。如上图,服务器启动花了16毫秒,浏览器请求了主机127.0.0.1地址的8124端口下的根路径"/",服务器响应花费了1毫秒。之后还有多次请求,包括浏览器其请求网站图标的请求(路径为“/favicon.ico”,呵呵,不幸的是,我们的服务器简单到只会返回同一个网页)。

 

四、建立HelloWorld测试客户端程序:

clt.js

 1 var http = require('http'); //请求使用http模块,变量http将在以下代码中指代该模块
 2 console.time('[HelloWorldClt][Start]'); //开始客户端启动计时器
 3 
 4 var testHttpGetCountMax=100; //测试循环次数
 5 var testHttpGetCount=0; //测试请求计数器
 6 var testHttpResCount=0; //测试返回计数器
 7 
 8 var testHttpGet=function(aHost,aPort,aPath){ //定义测试方法,输入参数分别为:主机地址,端口号和路径
 9 
10 testHttpGetCount++; //每次调用测试方法,请求计数器+1
11 var testNo=testHttpGetCount; //本次测试编号
12 
13 var options = { //http请求的参数,用于接下来的http协议的GET调用的选项
14     host:aHost, //主机
15     port:aPort, //端口
16     path:aPath  //路径
17 };
18 
19 //创建http的GET请求对象,第一个参数为调用选项,第二个参数为返回回调函数,用于处理请求的返回
20 var req= http.get(options, function(res){ 
21     //以下几行注释用于在控制台输出实际的返回信息,有兴趣的朋友可以取消注释看看
22     //console.time('[HelloWorldClt][Get]'+testNo);
23     //console.log('STATUS: ' + res.statusCode);
24     //console.log('HEADERS: ' + JSON.stringify(res.headers));
25     //res.setEncoding('utf8');
26     //res.on('data', function (chunk) {
27     //    //console.log('BODY: ' + chunk);
28     //});
29 
30     //res为回调函数的参数,代表http协议get方法返回的对象,以下给res设置结束时间'end'的处理函数
31     res.on('end', function () {
32         //console.timeEnd('[HelloWorldClt][Get]'+testNo);
33         testHttpResCount++; //每结束一个请求,测试返回计数器+1
34         if(testHttpResCount==testHttpGetCountMax){ //如果返回数等于测试循环数
35             console.timeEnd('[HelloWorldClt][GetTest'+testHttpGetCountMax+']'); //结束测试计时器,并输出测试总时间
36         }
37     });
38 
39 });
40 
41 //给请求对象设置错误事件'error'的处理函数
42 req.on('error', function(e) { 
43     //console.timeEnd('[HelloWorldClt][Get]'+testNo);
44     console.log('Err: ' + e.message); //输出错误信息
45 });
46 
47 };
48 
49 console.time('[HelloWorldClt][GetTest'+testHttpGetCountMax+']'); //开始测试计时器
50 for (i = 0; i < testHttpGetCountMax; i++) //循环若干次
51 {
52     testHttpGet('127.0.0.1',8124,'/'); //请求服务器
53 }
54 
55 console.timeEnd('[HelloWorldClt][Start]'); //结束客户端启动计时器,并输出到控制台

以上建立一个客户端测试程序,循环多次调用服务器,并计时。这段测试代码可以充分显示Node.js的事件驱动的优势,以及javaScript函数式编程的魅力。代码中已经有足够的注释了,这里不再重述。需要指出的是,Node.js编程继承了JavaScript的函数式编程和面向对象的双重优势,在此基础上,还提供了模块化的封装,当然这些也超出了本文的范围,本文中所有代码均以简单为目的,毕竟只是一个"HelloWorld"。

五、运行并测试客户端:

新开一个命令行窗口,并输入(假设Node.js安装在“c:\Program Files\nodejs\”目录,你的新建的clt.js文件就放在其中):

"C:\Program Files\nodejs\node.exe" clt.js

运行结果如下:

我们看到,客户端启动花了21毫秒,向服务器请求100次,共花费199毫秒。

 

六、小结

通过这样两段代码,我们可以看出:

1、Node.js的运行环境相对简单,便于维护;

2、Node.js可以运行于服务器、也可以用于客户端;

3、Node.js继承了JavaScript的优势,特别是运用于服务器,可以构建方便灵活的Web2.0的服务端;

4、Node.js提供了一个高度柔性的框架,可方便的扩充模块。

当然,运用Node.js也需要注意:

1、 它还是Beta版,Beta有风险,使用需谨慎;

2、除非你对JavaScript本身有充分的了解,特别是面向对象以及函数式编程等等,请不要盲目使用,补补课先;

3、它只是一个优秀的框架和运行环境,目前还谈不上平台,要用于实际,还需要自己定义相当多的模块才行(http://nodejs.org/docs/latest/api/appendix_1.html处是其官方推荐的一些第三方模块)。

总的来说,使用Node.js给人一种清新的感觉,就像当初Web2.0的Ajax使人们重新发现JavaScript一样,这是JavaScript迈向成功的又一领域的开始。厌倦了WS的庞杂、Tomcat的简约、IIS的善变后,拿起JavaScript给自己写个应用服务器吧,至少在特定应用下,它会带给你惊喜。我喜欢编程不仅是因为它是解决问题方法,更是因为好的程序可以给人带来美的享受。。。。


作者:汪峰 www.otlive.cn



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值