node.js的安装使用及示例

成都信息工程学院

Node.js的安装使用及示例

周星

2012/7/5

本文档分为介绍篇和使用篇,介绍篇关于node.js的介绍、应用及前景等;使用篇包括node.js安装和命令、架起一个http服务、完成一个”hello,world”、搭建一个只支持静态网页的web服务器、使node.js和socket.io实现websocket,搭建小型聊天室、node.js 和jquery的结合,通过本文档初学者可以很快了解node.js及其使用方法,当然本文档只是一个简要概括,更多的功能需要您深入去探究。有几个新概念需要您了解:V8引擎、Rest、服务器javascript。

目录

介绍篇: (3)

什么是node.js (3)

Node.js的适用场景 (3)

Node 旨在解决什么问题 (3)

ESTful API (4)

Twitter 队列 (4)

电子游戏统计数据 (4)

映像文件服务器 (4)

下面回答一些对于node.js和旧知识的一些问题 (5)

1服务端JS的实现,和我们传统的服务端实现相比,优势在哪里呢? (5)

2 node.js的开发效率和成本,具体体现在哪呢? (5)

使用篇: (5)

1 Node.js 的安装和控制台命令 (5)

2架一个HTTP服务 (7)

一、批量执行代码 (7)

二、前端呢?还是后端?这是个问题。 (7)

三、模块模块 (8)

四、HTTP 服务之Hello World (8)

3完成HelloWorld (10)

4搭建一个静态的web服务器 (12)

一读写文件 (12)

二、分析请求路径 (13)

5Websocket的实现 (16)

一、WebSocket 是什么 (16)

二、与传统的http相比,它的优点是什么 (16)

三、WebSocket 能干什么 (16)

四、WebSocket 协议与Socket.IO 模块 (16)

6利用Websocket实现聊天室 (18)

7websocket与jquery的结合 (20)

结束语 (22)

介绍篇:

什么是nod e.js

在介绍node.js之前,我们首先了解一下node.js的重要性,看看都有谁在用它。微软的云服务Azure已经开始支持Node.js、还有就是Ebay、Yahoo、Linkedin,这些IT界的大佬都在用,node.js未来肯定是光明的。

下面再说什么是node.js,node.js的官方网站这样自我描述: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 模式,这使得他是轻量而高效的,能够在分布设备上完美运行高数据吞吐的实时应用。如果还想深入了解,可能还需要您去了解一下google的V8引擎。介绍到此为止,下面我们来看一下node.js的适用场景。Nod e.js的适用场景

Node 旨在解决什么问题

Node 公开宣称的目标是“旨在提供一种简单的构建可伸缩网络程序的方法”。当前的服务器程序有什么问题?我们来做个数学题。在Java?和PHP 这类语言中,每个连接都会生成一个新线程,每个新线程可能需要2 MB 配套内存。在一个拥有8 GB RAM 的系统上,理论上最大的并发连接数量是4,000 个用户。随着您的客户端基础的增长,您希望您的web 应用程序支持更多用户,这样,您必须添加更多服务器。当然,这会增加业务成本,尤其是服务器成本、运输成本和人工成本。除这些成本上升外,还有一个技术问题:用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。例如,在Java 中,静态变量和缓存需要在每个服务器上的JVMs 之间共享。这就是整个web 应用程序架构中的瓶颈:一个服务器能够处理的并发连接的最大数量。

Node 解决这个问题的方法是:更改连接连接到服务器的方式。每个连接都创建一个进程,该进程不需要配套内存块,而不是为每个连接生成一个新的OS 线程(并向其分配一些配套内存)。Node 声称它绝不会死锁,因为它根本不允许使用锁,它不会直接阻塞I/O 调用。Node 还宣称,运行它的服务器能支持数万个并发连接。事实上,Node 通过将整个系统中的瓶颈从最大连接数量更改到单个系统的流量来改变服务器面貌。

ESTful API

提供Restful API 的Web 服务接收几个参数,解析它们,组合一个响应,并返回一个响应(通常是较少的文本)给用户。这是适合Node 的理想情况,因为您可以构建它来处理数万条连接。它仍然不需要大量逻辑;它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API 需求。

Twitter 队列

想像一下像Twitter 这样的公司,它必须接收tweets 并将其写入数据库。实际上,每秒几乎有数千条tweet 达到,数据库不可能及时处理高峰时段所需的写入数量。Node 成为这个问题的解决方案的重要一环。如您所见,Node 能处理数万条入站tweet。它能快速而又轻松地将它们写入一个内存排队机制(例如memcached),另一个单独进程可以从那里将它们写入数据库。Node 在这里的角色是迅速收集tweet,并将这个信息传递给另一个负责写入的进程。想象一下另一种设计(常规PHP 服务器会自己尝试处理对数据库本身的写入):每个tweet 都会在写入数据库时导致一个短暂的延迟,因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理2000 条入站tweet。每秒处理100 万条tweet 则需要500 个服务器。相反,Node 能处理每个连接而不会阻塞通道,从而能够捕获尽可能多的tweets。一个能处理50,000 条tweet 的Node 机器仅需20 台服务器即可。

电子游戏统计数据

如果您在线玩过《使命召唤》这款游戏,当您查看游戏统计数据时,就会立即意识到一个问题:要生成那种级别的统计数据,必须跟踪海量信息。这样,如果有数百万玩家同时在线玩游戏,而且他们处于游戏中的不同位置,那么很快就会生成海量信息。Node 是这种场景的一种很好的解决方案,因为它能采集游戏生成的数据,对数据进行最少的合并,然后对数据进行排队,以便将它们写入数据库。使用整个服务器来跟踪玩家在游戏中发射了多少子弹看起来很愚蠢,如果您使用Apache 这样的服务器,可能会有一些有用的限制;但相反,如果您专门使用一个服务器来跟踪一个游戏的所有统计数据,就像使用运行Node 的服务器所做的那样,那看起来似乎是一种明智之举。

映像文件服务器

一个拥有大型分布式网站的公司(比如Facebook 或Flickr)可能会决定将所有机器只用于服务映像。Node 将是这个问题的一个不错的解决方案,因为该公司能使用它编写一个简单的文件检索器,然后处理数万条连接。Node 将查找映像文件,返回文件或一个404 错误,然后什么也不用做。这种设置将允许这类分布式网站减少它们服务映像、.js 和.css 文

件等静态文件所需的服务器数量。

下面回答一些对于nod e.js和旧知识的一些问题

1服务端JS的实现,和我们传统的服务端实现相比,优势在哪里呢?

答:从几个方面看

1、和传统的服务端脚本语言, 原生的非阻塞io,能够很大程度上提高并发负载能力

2、对于java,c等直接开发的非阻塞服务,在开发效率和成本上要更胜出.

3、从语言特性上讲,js语言本身对事件机制由很好的支持,

2 node.js的开发效率和成本,具体体现在哪呢?

答:

1、java的nio实现代码量要比node多出很多,c的就要更多,而且debug起来比较复杂。

2、相对ruby等语言,node在执行效率上又胜出不少,而且node无协程个人觉得是比较好的选择。

有了这些相信您对node.js已经有了极大的兴趣,下面我们来到node.js使用的第一步:安装node.js和命令

使用篇:

1 Node.js 的安装和控制台命令

Windows系统的node.js安装非常简单,只需在官方网站上下载windows的安装包——一个.msi文件,双击安装就可以了,由于安装较为简单,在此不做描述。

这里需要注意的就是,我曾经在装完之后去找快捷方式,结果什么都没找到,安装时也没有指定node.js安装到了哪里,不过根据平时对windows的了解,很快在C:\Program Files (x86)这个文件夹里找到了nodejs文件夹(注:本人是64位windows7系统),而且环境变量默认是已经配好了的。此时我们打开命令行窗口,

发现输入node时不显示没有此命令提示了,说明我们已经安装好了。

当打开NodeJS文件夹的时候,您会发现有几个东西不知道是干什么用的,

在此先说明一下,node_modules里装的是NodeJS的模块,而nodejs的核心魅力都在这里面。而npm是用来管理模块的,如果您对linux有所了解,对npm也一定不会陌生。

现在您所学的javascript知识都将派上用场,因为node.js使用的就是V8引擎,在这里我们就可以跑javascript代码了。

为数不多的控制台命令可以用.help命令找到

现在万事俱备,我们可以开始node.js之旅了。

2架一个HTTP服务

上回说道:在Windows 平台,node.js 可以精简到一个可执行文件,运行这个文件,我们就得到了一个控制台,在这个控制台,我们可以以REPL (Read-Eval-Print-Loop) 的方式交互的执行js代码。

一、批量执行代码

现在面临的一个问题是:如何批量执行js 代码呢?回答是:可以将js 代码放进一个文件,然后键入如下命令

此时已经表明我们的.js程序运行成功了!!!

二、前端呢?还是后端?这是个问题。

我们知道,Javascript 就是依靠浏览器的,没有浏览器它什么都不是所以,估计您和我一样,第一次接触到Node.js 时,会误以为是一个新的前端框架。但事实是:Node.js 目的是为了建立服务器端应用的。在以后我们会完成搭建聊天室等任务,而且都是用很简单的代码完成,完全不用什么web服务器或者高级语言,相信完成之后nodejs会让您刮目相看。

三、模块模块

刚上大学时学C 语言的时候大家都知道,没有include ,连最简单的helloworld都没法做。任何语言,失去了强大类库的支持都是弱弱的任何成熟的语言,都是采用把强大的功能打包成类库的方式,实现语言的高扩展的。

之所以很多人感觉javascript有一种神秘色彩或者感觉它功能有很大的局限性,就是因为缺少强大的类库。所以,一帮IT牛人开始考虑解决这个问题了,这个项目就是CommonJS 。CommonJS 希望实现一个Javascript 标准类库,使开发者能够利用Javascirpt 来开发下列类型的应用:

1、服务器端应用;

2、命令行工具;

3、桌面基于GUI 应用

4、混合应用(Titanium, Adobe AIR)

node.js 是Common.JS 的实现者之一。这时我们该了解一个重要的函数了——require 函数。使用这个函数来引入别的模块,通俗点说它类似于include(C) 、import(JAVA) 。比如,node.js 内置了个模块,专门帮助我们实现http 服务。我们只需要:

var http = require(‘http’);

就可以开始使用该模块的功能了,目前就本人所知node.js 官网现在已经注册了5747 个第三方模块。安装这些模块也非常的简单,不过,还是先来完成第一个吧。

四、HTTP 服务之Hell o World

我们只用几行代码就可以实现一个http服务,先不要惊讶,见如下代码

然后保存成app.js 文件,并用:node app.js 运行。然后可以用浏览器访问了,地址是:http://localhost:888 。因为默认的80端口可能会有冲突,所以在这里我们使用了888端口。但是我们发现没有任何效果,这是因为:http.createServer 其实是可以带参数的,而在这里我们省略了参数,http.createServer 的参数应该是一个函数。这个函数在每次有

http 请求进来的时候就会跑一遍,也就是说,我们每用浏览器访问一次上面的地址,我们传进去的函数就运行一遍。下面我们再修改代码:

好,现在再访问试试。浏览器还是什么都没有。不过,每次我们刷新浏览器,后台都会告诉我们访问进来了。

就这样,一个http服务架成了,下一篇我们将完成一个helloworld

3完成HelloWorld

刚刚我们用node.js快速而方便的搭建了一个http服务器,现在我们要把helloworld发送出去。

大家知道,我们的Web应用抽象起来就是客户端发出请求request,请求到达服务器后,服务器给客户端发回一个应答response。服务器和客户端之间交流的语言就是HTTP 协议。

总之在web应用中的两个至关重要的东西就是request和response。

上一篇我们说到,每次有访问,我们的函数都会运行一次,所以只要把request和response作为参数传递给tellme函数,然后当请求到达时,node.js 就会把客户的请求封装成request ,预备发给客户的应答封装成response。我们拿到request ,看看他请求些什么,再把一些东西(如读出个文件或去查数据库)封装进进response ,发给客户端。代码如下:

运行他,再用浏览器访问他。在浏览器得到了“Hello world!”,

再看看服务器的控制台

这一大串的就是Request 了,它使用的是json格式,观察request 对象,我们可以找

到一些我们熟悉的东西。比如:request.url、request.method、比如headers,可以简化一下后台:

后台的显示内容一目了然。

至此HelloWorld示例结束,下一节是利用nodejs创建一个支持静态页面的web服务器。

4搭建一个静态的web服务器

如果想深入了解某个对象,可以在repl 环境下,把这个对象打印出来。例如引入的http 模块,可以repl 提示符下键入:node require(‘http’)然后回车,会出现

由此可见状态代码无需看文档即可查看。

下面开始正题,搭建一个支持静态页面的web服务器

一读写文件

为了完成搭建静态服务器,我们需要引入文件I/O ,node.js 内置了fs 模块,引入就可以读写文件了。请按下列方式组织目录:

Webserver

|_____ app.js

|_____ root

|_____ index.htm

这里root 文件夹就是存放页面的地方,稍懂一点web服务器的都很容易明白,这里不多做解释。一会我们要把内容从文件里读出来,显示在控制台并发送给浏览器。

在写代码之前,我们先用前面的方法查看fs 模块:

fs 里方法有很多。现在我们需要去查官网文档,我们就用fs.readFile方法。测试该方法的代码建议您自己先写一个,能更方便您了解和学习,本节代码如下:

注:__dirname是两个下划线_ _!!!

二、分析请求路径

我们已经实现了读取文本文件,并送到客户端浏览器的工作。但是读取的文件名是硬编码在代码里的。现在我们需要让用户来指定他需要什么文件,然后读出来给发过去。而用户指定的路径和文件名这个信息是通过request 传过来的,request 的众多的属性里,有一个为url 属性,以前我们都是通过url 来映射文件的路径的。不过到了现在MVC 和REST 时代,情况开始变得有些复杂,这里暂且不提。解释代码之前,我们先砍一下url,一条url 一般可以分成主机地址、路径和键值对,如图:

我们尝试引入url模块,用这个工具来解析了一串示例,得到一个对象。其中pathname 就是我们要的,不过现在我们需要将它映射为我们服务器端的绝对地址,代码如下(由于代码较长,截图不便,直接给出):

var http = require('http'),

fs = require('fs'),

urlutil = require('url'),

path = require('path');

http.createServer(function(request, response){

//get path from request's url

var urlpath = urlutil.parse(request.url).pathname;

//map the path to server path

var absPath = __dirname + "/webroot" + urlpath;

//test whether the file is exists first

path.exists(absPath, function(exists) {

if(exists) {

//if ok

fs.readFile(absPath,function(err, data) {

//our work is here

if(err) throw err;

console.log(data);

response.write(data);

response.end();

});

} else {

//show 404

response.end('404 File not found.');

}

});

}).listen(888);

console.log('Server start in port 888.');

至此本节结束,下一节的内容是利用nodejs和socket.io实现websocket

5Websocket的实现

一、W ebSocket 是什么

百度百科上说WebSocket 规范的目标是在浏览器中实现和服务器端双向通信.双向通信可以拓展浏览器上的应用类型,例如实时的数据推送(股票行情),游戏,聊天/im 等,而且websocket实现的是全双工通信。

二、与传统的http相比,它的优点是什么

双向全双工,持续连接,实时、事件驱动,低带宽消耗,文档、二进制均可,客户端不局限于浏览器。

三、W ebSocket 能干什么

理论上,socket 能干什么,他就能干什么

想要再具体了解websocket,请参见websocket官网。

四、W ebSocket 协议与Socket.IO 模块

Node.js 的第三方模块Socket.Io(详见socket.io官网)提供在Node.js 上使用WebSocket 协议的能力,我们需要安装socket.io,由于我们最后目的是要建立一个聊天室,所以我们先建一个文件夹,取名为chatroom,打开命令行窗口,移步到chatroom 目录下,键入如下命令:

D:\chatroom> npm install socket.io –d

由于我已经安装完成,这里不给出安装过程图了。

准备工作完成后,我们还是先写一个最最最简的架子,然后测试,代码如下:

如果见到如下图,则说明运行成功

现在我们可以说已经实现了一个websocket了,下一节我们将利用websocket搭建一个聊天室。

6利用Websocket实现聊天室

刚刚我们成功的实现了websocket,下面进入最激动的部分,实现聊天室:在chatroom 文件夹下建一个chatClient.htm ,代码如下:

Chat Client

Chat Client

运行服务器端app.js 文件,然后,用浏览器打开chatroom.htm 文件,观察服务器控制台:

此时显示websocket已经连接成功!!聊天室搭建完成。

这时我们再打开两个浏览器窗口访问:localhost:888就可以互相通信啦,至此聊天室搭建成功,本节结束。

7websocket与jquery的结合

flash 中有一个share object ,可以让大家通过网络共享一个对象。曾经有个示例,就是甲拖动屏幕上的小球,乙的屏幕上的小球也同样被拖动了,乙也同样可以拖动的动作共享给甲。完成这样的功能需要Flash Media Server,不过利用前面我们的nodejs,我们已经可以实现这个案例了而且不用插件。

js代码如下:

页面html代码如下:

Share Object

href="https://www.360docs.net/doc/7014634627.html,/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"

rel="stylesheet" type="text/css"/>

src="https://www.360docs.net/doc/7014634627.html,/ajax/libs/jqueryui/1.8/jquery-ui.min.js">