zoukankan      html  css  js  c++  java
  • 新技术你知道吗?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





  • 相关阅读:
    exports 与 module.exports 的区别
    [读书笔记] JavaScript设计模式: 单例模式
    mybaits及mybaits generator 插件使用指南(亲测原创)
    【转】系统吞吐量等知识相关
    java的JDBC驱动使用链接数据库
    java程序引用别的jar包打包方法
    ftp服务器不能上传文件故障
    lftp下载文件无法覆盖,提示" file already existst and xfer:clobber is unset" 问题解决
    jar/war文件的解释
    linux 自动输入用户名和密码 ftp
  • 原文地址:https://www.cnblogs.com/otlive/p/2378796.html
Copyright © 2011-2022 走看看