读书笔记之《深入浅出Node.js》(3)

时间:2022-03-11 09:07:11

第六章 Buffer对象

Buffer对象的适用场景:处理网络协议、操作数据库、处理图片、接受上传文件,特别是在网络流和文件的操作中,要处理大量的二进制数据,所以需要用到Buffer对象,且Buffer对象占用的内存属于堆外内存,不是通过V8分配。
Buffer模块中与性能有关的部分是用C++写的,非性能相关的部分用JavaScript写,真正的内存是在Node的C++部分中申请的。
Buffer对象可以按照不同的编码方式转为字符串

"use strict";
var fs = require('fs');
var iconv = require('iconv-lite');
var reader = fs.createReadStream('../../public/test_buffer.txt');

var arrChunk = [];
//数组中存放了所以的Buffer对象,最后再一次性拼接
reader.on('data', function (chunk) {
  arrChunk.push(chunk);
});
reader.on('end', function () {
  var buf = Buffer.concat(arrChunk);
  var str = iconv.decode(buf, 'utf8');
  console.log(str);
});

字符串在网络中进行传输时,会被转换为Buffer,那样的话可以提前转为Buffer,这样能减少CPU的重复使用。

var http = require('http');
var hello = '';
for (var i = 0; i < 1000; i++) {
  hello += "JavaScript "
}

//预先将字符串转换为Buffer对象
hello = new Buffer(hello);

http.createServer(function (req, res) {
  res.writeHead(200);
  res.end(hello);
}).listen(8000);

第七章 网络编程

Node提供了net、dgram、http、https这四个模块,分别用于处于TCP、UDP、HTTP、HTTPS
这里我对WebSocket协议比较感兴趣,重点看了下WebSocket。

首先,WebSocket协议已经是HTML5标准的一部分了,相比较传统的HTTP协议,它的好处如下:

  • 客户端与服务器端只用一个TCP连接。
  • 服务器可以推送消息到客户端,客户端也可以推送消息到服务器端,更加灵活。(解决了轮询技术中服务器端没法主动请求客户端的缺陷)

具体的过程其实是要客户端在HTTP协议下和服务端完成一次特殊的握手
读书笔记之《深入浅出Node.js》(3)
首先,Sec-WebSocket-Key 是一个Base64 encode的值,这个是浏览器随机生成的,主要的目的是验证服务器是否是真的支持WebSocket。然后,Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。
接着服务器端需要对Sec-WebSocket-Key按照固定的算法进行加密后并返回,如下图所示:
读书笔记之《深入浅出Node.js》(3)
这就代表成功开启WebSocket协议啦~~
具体代码如下:

//后端我用的是Node.js,其他语言也有对应的框架支持WebSocket协议
var http = require('http');
var app = http.createServer(function (req, res) {
  res.writeHead(200);
  res.end("ok");
}).listen(8888);
//ws是一个实现了WebSocket协议的包
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({server: app});
wss.on('connection', function (ws) {
  ws.on('message', function (data, flags) {
    console.log(data);
    ws.send("Node.js");
  });
  ws.on('close', function () {
    console.log('stopping client');
  });
  ws.on('open', function () {
    ws.send("Node.js");
  });
});
//这里是客户端的代码
<script type="text/javascript"> var ws = 'ws:127.0.0.1:8888' var webSocket = new WebSocket(ws); webSocket.onmessage = function (event) { console.log(event.data); } webSocket.onopen = function () { webSocket.send("Hello"); } </script>