二十五、Node中的Buffer缓冲器和EventEmitter事件触发器

举报
毛利 发表于 2021/07/15 03:02:10 2021/07/15
【摘要】 @Author:Runsen @Date:2020/6/5 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。 我要反复查漏补缺,将2018年的东西捡回来,形成高效学习。 今天,我要写的是Node中的Buffer缓冲器和EventEm...

@Author:Runsen
@Date:2020/6/5

作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。

我要反复查漏补缺,将2018年的东西捡回来,形成高效学习。

今天,我要写的是Node中的Buffer缓冲器和EventEmitter事件触发器,写之前,先去菜鸟教程看看,偷窥学习一下JavaScript表单中的验证API。

Buffer缓冲器

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。

但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

Buffer 类在全局作用域中,因此无需使用 require(‘buffer’).Buffer。

const buf = Buffer.from('Runsen', 'ascii');

// 输出 52756e73656e

console.log(buf.toString('hex'));

// 输出 UnVuc2Vu
console.log(buf.toString('base64'));

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

buffer类用来创建专门存放二进制数据的缓冲区域,因此输出只有二进制

创建buffer类

**1、创建buffer类,写入内容
var buf = new Buffer('www.baidu.com','utf-8');  //<Buffer 77 77 77 2e 62 61 69 64 75 2e 63 6f 6d>
console.log(buf);
var buf = new Buffer(26);
var len = buf.write('www.baidu.com');
console.log('写入字节数:'+len);  //写入字节数:13

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

读取缓冲区数据

buffer.toString(encoding, star, end); encoding编码格式 默认使用utf8编码格式 star:开始位置 end:结束位置

var buf = new Buffer(26);
for(var i = 0; i < 26; i++){ buf[i] = i;
}
console.log(buf); 
//<Buffer 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19>  十六进制数
var buf = new Buffer(26);
for(let i = 0; i < 26; i++){ buf[i] = i + 97; //转换成小写字母
}
console.log(buf.toString('ascii'));   //abcdefghijklmnopqrstuvwxyz
console.log(buf.toString('ascii', 0, 10));  //abcdefghij  截取下标,截至下标
console.log(buf.toString('utf8', 0, 10));   //abcdefghij
console.log(buf.toString(undefined, 0, 5));   //abcde   使用utf8编码格式输出

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

转换为json格式输出

var buf = new Buffer(26);
for(let i = 0; i < 26; i++){ buf[i] = i + 97; //转换成小写字母
}
console.log(buf.toJSON(buf));

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

合并缓冲区

用的是Buffer.concat(list[, totalLength]);

var buf1 = new Buffer('www.baidu.com');
var buf2 = new Buffer('百度一下,你就知道');
var buf3 = Buffer.concat([buf1,buf2]);
console.log(buf3.toString());  //www.baidu.com百度一下,你就知道

  
 
  • 1
  • 2
  • 3
  • 4

Buffer的操作

Buffer还支持切片、拷贝、拼接、比较等操作。

看个示例代码,演示切片、拷贝和拼接的用法:

var buf1 = new Buffer('1234');
var buf2 = new Buffer('12567');
var bufList = [buf1, buf2];
var buf3 = Buffer.concat(bufList);
var buf4 = buf3.slice(3, 8);
var buf5 = new Buffer(5);
buf3.copy(buf5, 0, 1);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

缓冲区长度

var buf = new Buffer('Runsen');
var newbuf = buf.slice(3,5);
console.log(newbuf.toString());   //se
console.log('length:'+newbuf.length);   //length:5

  
 
  • 1
  • 2
  • 3
  • 4

下面是Buffer缓冲器的总结

EventEmitter

Nodejs 使用了一个事件驱动、非阻塞 IO 的模型。events模块是事件驱动的核心模块。很多内置模块都继承了events.EventEmitter。

var events = require('events');

  
 
  • 1

nodejs的events 模块只提供了一个对象: events.EventEmitter。EventEmitter的核心就是事件发射与事件监听器功能的封装。EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

这是菜鸟教程的案例

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { console.log('some_event 事件触发'); 
}); 
setTimeout(function() { event.emit('some_event'); 
}, 1000); 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行结果如下:

运行这段代码,1 秒后控制台输出了 ‘some_event 事件触发’。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用some_event 的监听器。

下面最我编写的代码,以加强对事件驱动的理解:

const events = require('events');
const sum = new events.EventEmitter();
let execsum = 0;
let A = 0;
let B = 0;
function sumA() { console.log('A = ', A); A = A + 1;
}

// 简写成函数,ES6语法

sum.on('eventB', () => { console.log('\n'); console.log('B = ', B); B = B + 1;
});

sum.on('eventA', sumA);


// 计数器

setInterval(() => { sum.emit('eventA');
}, 1000);

setInterval(() => { sum.emit('eventB');
}, 2000);
console.log('end');

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

执行效果如下面的GIF所示。

A一秒加一次

B两秒加一次

文章来源: maoli.blog.csdn.net,作者:刘润森!,版权归原作者所有,如需转载,请联系作者。

原文链接:maoli.blog.csdn.net/article/details/106565966

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。