《Node.js 实战》读书笔记(一)

301 阅读3分钟

书籍大纲

第一章

一、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)的好例子。事件发射器本质上是组织异步逻辑的 一种很方便的设计模式。

事件发射器是跟某种资源相关联的,它能向这个资源发送消息,也能从这个资源接收消息。

项目代码:github.com/HuangJiajia…