Nodejs - EventEmitter,Buffer

前面一片我们提到了EventEmitter,并且知道EventEmitter从events中导入和一些简单例子。

EventEmitter

这里我们继续学习一些EventEmitter相关知识。

在Javascript中如果定义两个相同名字的方法。后者将会覆盖前者成为最终赢家。但是我们给EventEmitter注册两个相同名字的监听,Nodejs将会只两个监听事件。

//event.js 文件
var events = require(‘events‘);
var emitter = new events.EventEmitter();
emitter.on(‘someEvent‘, function(arg1, arg2) {
    console.log(‘listener1‘, arg1, arg2);
});
emitter.on(‘someEvent‘, function(arg1, arg2) {
    console.log(‘listener2‘, arg1, arg2);
});
emitter.emit(‘someEvent‘, ‘arg1 参数‘, ‘arg2 参数‘);
//node 执行输出结果
$ node event.js
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

我们可以从结果中看到。两次监听都被执行。并且执行顺序按注册顺序依次执行。

接着我们可以看看EventEmitter具有哪些方法

  1. addListener(event,listener) ,为指定事件添加监听器到监听器的尾部
  2. on(event,listener),为指定事件注册一个监听器,接收一个字符串event和回调函数
  3. once(event,listener) , 为指定事件注册一个监听器,但是此监听器只触发一次。触发过后将会解除解除
//event2.js

var eventEmitter = require(‘events‘).EventEmitter;

var event = new eventEmitter();

event.once(‘test_once‘,function(){
    console.log(‘test once‘);
});

event.emit(‘test_once‘);
event.emit(‘test_once‘);

//执行结果

  4.removeListener(event,listener),移除指定事件的某个监听器,改监听器必须是改时间已注册的监听器,它接收两个参数。一个是时间名称。一个是自身回调函数

  5.removeAllListener([event]) ,移除所有时间的监听器,如果指定事件则和removeListener功能相同。可接收时间数组。删掉对应事件的监听器。

  6.setMaxListener(numher),默认情况下。EventEmitter只支持最大10个监听器。超过10个Nodejs将会发出警告。setMaxListener就可以用于提高监听器的默认限制。

  7.listeners(event),返回指定事件的监听器数组

  8.emit(event,[arg1],[arg2],[...]),按参数顺序执行每一个监听器,如果有注册监听器返回true,否则返回false。

  9.listenerCount(emitter,event),返回指定监听器数量

    events.EventEmitter.listenerCount(emitter, eventName) //已废弃,不推荐
    events.emitter.listenerCount(eventName) //推荐

EventEmitter 定义了一个特殊的事件error,当我们遇到一次的时候通常会被触发。当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。

Buffer(缓冲区)

首先我们来看看Buffer模块的常用方法(有些方法在旧版中是没有的)

  1. new Buffer(size) ,分配一个新的size大小的8位字节的Buffer (已在新版本废弃,替代者Buffer.alloc)。

  2. new Buffer(buffer),拷贝参数buffer的数据到新的Buffer实例(已废弃,替代者Buffer.from(buffer))。

  3. new Buffer(str[, encoding] ),分配新的buffer,包含str字符串,默认编码为utf8(已废弃,替代者Buffer.from(str[, encoding] ))。

  4.buf.length,返回buffer实例的bytes数。他是对象分配的内存数,并不表示内容大小。但是会随内容大小改变而改变

  5. buf.write(str[, offset[, length]][,encoding]),根据参数 offset 偏移量和指定的 encoding 编码方式,将参数 string 数据写入buffer。 offset 偏移量默认值是 0, encoding 编码方式默认是 utf8。 length 长度是将要写入的字符串的 bytes 大小。 返回 number 类型,表示写入了多少 8 位字节流。如果 buffer 没有足够的空间来放整个 string,它将只会只写入部分字符串。 length 默认是 buffer.length - offset。 这个方法不会出现写入部分字符。

  6. buf.writeUIntLE(value,offset,byteLength[,noAsset]) / buf.writeIntLE(value,offset,byteLength[,noAssert]) , 将value写入到buffer中。他由offset和byteLength决定。最高支持48位无符号整数,小端对齐,noAssert默认为false需要验证value和offset的有效性,为true将不再验证。

  7. buf.writeUIntBE / buf.writeIntBE (value,offset,byteLength[,noAssert]) / ,和writeUIntLE唯一的区别是writeUIntBE是大端对齐。

  8. buf.readUIntLE / buf.readIntBE (offset,byteLength[, noAssert]) , 支持读取48位以下无符号,小端对齐的数字,noAssert= true,offset 不再验证是否超长,反之则验证。

  9. buf.readyUIntBE / buf.readIntBE (offset, byteLength[, noAssert]) ,支持读取48位以下,大端对齐的数字,noAssert=true,offset不在验证是否超长。反之则验证。

  10. buf.toString(encoding,start,end) , 根据encoding返回解码的string内心,start,end作为取值范围。

  11. buf.toJSON() ,将Buffer转换成JSON对象

  12. buf[index], 获取或设置指定的字节。返回值代表一个字节,所以返回值的合法范围是十六进制0x00到0xFF 或者十进制0至 255。

  13. buf.equals(otherBuffer),比较两个缓冲区是否相等.

  14. buf.compare(otherBuffer),比较两个Buffer是否相同。

  15. buf.copy(targetBuffer,targetStart,sourceStart,sourceEnd),buffer 拷贝,源和目标可以相同。 targetStart 目标开始偏移和 sourceStart 源开始偏移默认都是 0。 sourceEnd 源结束位置偏移默认是源的长度 buffer.length

  16. buf.slice(start,end),剪切 Buffer 对象,根据 start(默认是 0 ) 和 end (默认是 buffer.length ) 偏移和裁剪了索引。 负的索引是从 buffer 尾部开始计算的。

  17. buf.readUInt8(offset, noAssert)根据指定的偏移量,读取一个无符号 8 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 如果这样 offset 可能会超出buffer 的末尾。默认是 false。

  18. buf.readUInt16LE(offset[, noAssert]),根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。

  19 buf.readUInt16BE(offset[, noAssert]),根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数,大端对齐。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
  20. buf.readUInt32LE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个无符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
  21. buf.readUInt32BE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个无符号 32 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
  22 buf.readInt8(offset[, noAssert]),根据指定的偏移量,读取一个有符号 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
  23 buf.readInt16LE(offset[, noAssert]),根据指定的偏移量,使用特殊的 endian 格式读取一个 有符号 16 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
  24. buf.readInt16BE(offset[, noAssert]),根据指定的偏移量,使用特殊的 endian 格式读取一个 有符号 16 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
  25. buf.readInt32LE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
  26 buf.readInt32BE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
  27 buf.readFloatLE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。
  28. buf.readFloatBE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。
  29. buf.readDoubleLE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
  30. buf.readDoubleBE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
  31 buf.writeUInt8(value, offset[, noAssert]),根据传入的 offset 偏移量将 value 写入 buffer。注意:value 必须是一个合法的无符号 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则不要使用。默认是 false。
  32。 buf.writeUInt16LE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的无符号 16 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  33. buf.writeUInt16BE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的无符号 16 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  34. buf.writeUInt32LE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式(LITTLE-ENDIAN:小字节序)将 value 写入buffer。注意:value 必须是一个合法的无符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  35. buf.writeUInt32BE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式(Big-Endian:大字节序)将 value 写入buffer。注意:value 必须是一个合法的有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  36. buf.writeInt8(value, offset[, noAssert])
  37. buf.writeInt16LE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。
  38. buf.writeInt16BE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。
  39. buf.writeInt32LE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  40. buf.writeInt32BE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  41. buf.writeFloatLE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  42. buf.writeFloatBE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  43. buf.writeDoubleLE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  44 buf.writeDoubleBE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
  45 buf.fill(value[, offset][, end]),使用指定的 value 来填充这个 buffer。如果没有指定 offset (默认是 0) 并且 end (默认是 buffer.length) ,将会填充整个buffer。

我们使用了一些常用的方法。我们来看看结果。

const buf = Buffer.from(‘allen‘);
console.log(‘buf.length : ‘ + buf.length);
buf.write(‘hello‘,2,10,‘utf8‘);
console.log(‘buf.toString() : ‘ + buf.toString());
console.log(‘buf.toJSON() : ‘ + buf.toJSON());
console.log(‘buf[index] : ‘ + buf[2]);
const buf1 = Buffer.from(‘allen‘);
console.log(‘buf.equals(buf1) : ‘ + buf.equals(buf1));
console.log(‘buf.compare(buf1) : ‘ + buf.compare(buf1));
console.log(‘buf.copy : ‘ + buf.copy(buf1,3,0,5) + ", toString() : " + buf.toString());
console.log(‘buf.slice() : ‘ + buf.slice(0,1) + ",toString() : " + buf.toString());

我们可以看看对应的结果:

原文地址:https://www.cnblogs.com/allenj/p/10192235.html

时间: 2024-11-08 11:04:21

Nodejs - EventEmitter,Buffer的相关文章

大熊君大话NodeJS之------Buffer模块

一,开篇分析 所谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存. JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作.除了可以读取文件得到Buffer的实例外,还能够直接构造,例如: var buffer = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ; Buffer与字符串类似,除了可以用.length属

NodeJS中Buffer模块详解

一,开篇分析 所谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存. JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作.除了可以读取文件得到Buffer的实例外,还能够直接构造,例如: 复制代码 代码如下: var buffer = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ; Buffer与字符串类似,除了

Nodejs·理解Buffer

Node里面的Buffer其实就是用于网络请求.文件读取等等操作,而且是分配在堆外,不会占用堆内的内存,这也是因为本来V8的内存就很小,如果读取大文件,那就...... 之前有看过Logstash的Buffer源码,感觉比这个高级多了....而Ruby中的Buffer则有点缓存的性质,支持大小的限制,以及定时刷新等等... 看来Buffer就是解决了V8之前应用于浏览器端偏小内存的限制,而直接在底层堆外申请大内存,但是又怕现用现申请增加CPU负载,所以采用了分块申请的形式. 另外Buffer中统

nodejs中Buffer的创建和转换

buffer是用来做什么?主要是用来处理二进制文件流和TCP流的文件缓存区.我们可以将二进制流和string,json,int进行转换,也可以进行复制,或者通过自带的函数进行判断buffer的一些状态. 创建Buffer对象(实例) 1.使用var buffer = new Buffer(size)创建对象,然后用buffer.fill(value,[offset],[end])来初始化对象. 2.使用var buffer = new Buffer(array)创建对象. 3.使用var buf

理解Nodejs的Buffer

上周同事用我们的工具写了一个关于全国比较出名的景点介绍的APP,地址在这里.整个APP中文字符比较多,文件也比较大,计算了下整个APP描述文件大小在4M左右.整个描述文件要放到第三方CDN.在这中间,我们的服务器主要负责获取前端传上来的数据,做一些加工处理并压缩后抛给第三方CDN服务器. Node接受POST数据通常的写法: var load = function(stream, onDone) { var data = ''; stream.on('data', function(chunk)

nodejs基础 -- buffer缓冲区

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区.在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库.Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库.原始

浅析nodejs的buffer类

1.什么时候该用buffer,什么时候不该用 看一下如下的测试代码,分别是拼接各种不同长度的字符串,最后直接拼接了10MB的字符串 var string,string2,string3; var bufstr,bufstr2,bufstr3; var j; console.time('write 1000 string'); for(j=0;j<1000;j++){ var x = j+''; string += x; } console.timeEnd('write 1000 string')

[转载]缓冲模块Buffer——nodejs中间件系列

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 创业者,程序员(Java,R,Jav

《深入浅出Nodejs》—— 读后总结

这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完. 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的..... 什么是Nodejs Nodejs有几个特性:异步IO,事件驱动,单线程,跨平台 异步IO可以保证在CPU计算的同时,异步的加载IO,加快了应用的访问.不像传统的服务器是使用什么阻塞IO啊.轮训IO等等,它相当于在发送处理请求时,直接传一个回调函数,当异步的IO结束后,会自动的执行回调. 事件驱动,则是把粒度降低到事件级别.传统的服务器是一个请求分配一个线程进行