书籍大纲
第一章
一、Node:
Node.js是一个运行环境,可以运行JavaScript语言写出的代码;在Node.js出现以前(2009年以前),JavaScript主要运行在浏览器客户端,在Node.js出现后,JavaScript又多了一个运行环境---Node.js。
1、运行在浏览器和Node.js上JavaScript的区别:
(1)运行在浏览器的JavaScript不能访问本地的一切资源,要想访问只能使用浏览器提供的API,而且还需要得到用户授权,可使用的功能十分有限。
(2)运行在Node.js的JavaScript功能较多,如:本地文件读写,HTTP网络请求及响应,socket监听请求等;
2、Node.js 能解决什么问题?
(1) 实现高并发用户连接
在Java、PHP或ASP.NET等服务器语言中,每一个客户端连接都会为其创建一个新的线程,而每个线程耗费大约需要2MB的内存,如果如果我们的服务器是8GB内存,那么理论上最多同时为4000个左右的用户提供服务,增加服务器的数量会使成本上升,同时出现数据共享问题。
而Node.js放弃了“为每一个用户连接创建一个新线程”的思想,采用事件驱动。
(2) 实现高性能服务器
(3) 非阻塞I/O及事件循环机制
JavaScript是单线程的语言,V8 JavaScript提供了非阻塞I/O机制。在等待请求结果的时候,会继续执行请求后面的代码,不用等待数据返回。
Node.js能实现高并发也是因为其独特的事件循环机制。
- 事件驱动+异步I/o;
- 构建在JavaScript;
- 专为数据密集型实时程序设计
二、http服务器的实现:
// 方式1:只要有请求过来,它就会激发回调函数
var http = require('http')
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('Hello World');
}).listen(3000)
console.log('Server running at http://localhost:3000/')
// 方式2
var http = require('http')
var server = http.createServer()
server.on('request',function(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('Hello World111');
})
server.listen(3000)
console.log('Server running at http://localhost:3000/')
三、流数据:
把数据流看成特殊的数组,只不过数组中的数 据分散在空间上,而数据流中的数据是分散在时间上的。通过将数据一块一块地传送,开发人员 可以每收到一块数据就开始处理,而不用等所有数据都到全了再做处理。
1、通过stream读取文本数据
// 只要有新的数据块准备好,就会激发data事件,当所有数据块都加载完之后,会激发一个end事件。
const fs = require('fs');
var stream =fs.createReadStream('./resource.json')
stream.on('data',function(chunk){
console.log(chunk)
})
stream.on('end',function(){
console.log('finish')
})
json文件:
读取结果:
2、通过stream读取图片
var http = require('http')
const fs = require('fs');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'image/png'});
fs.createReadStream('./image.png').pipe(res)
}).listen(3000)
console.log('Server running at http://localhost:3000/')
打开浏览器输入localhost:3000/,即可看到图片。
第二章 构建有多个房间的聊天室程序
一、Socket.IO
定义:
Socket.IO为Node及客户端JavaScript提供了基于WebSocket以及其他传输方式的封装,它提供 了一个抽象层。如果浏览器没有实现WebSocket,Socket.IO会自动启用一个备选方案,而对外提 供的API还是一样的。
特点:
- 提供了开箱即用的虚拟通道,所以程序不用把每条消息都向已连接的用户广播,而 是只向那些预订了某个通道的用户广播。
- 事件发射器(Event Emitter)的好例子。事件发射器本质上是组织异步逻辑的 一种很方便的设计模式。
事件发射器是跟某种资源相关联的,它能向这个资源发送消息,也能从这个资源接收消息。