第六章 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协议下和服务端完成一次特殊的握手
首先,Sec-WebSocket-Key 是一个Base64 encode的值,这个是浏览器随机生成的,主要的目的是验证服务器是否是真的支持WebSocket。然后,Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。
接着服务器端需要对Sec-WebSocket-Key按照固定的算法进行加密后并返回,如下图所示:
这就代表成功开启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>