nodejs-基本&回调&eventemitor&buffer

服务例子

var http = require("http");
http.createServer(function (request, response) {

    // 发送 HTTP 头部
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

npm安装路径

全局目录

npm install xxx -g
#查看和设置
npm config set prefix "目录路径"
npm config get prefix

当前目录(不太好)

npm install xxx

npm更多参考:
http://www.runoob.com/nodejs/nodejs-npm.html

REPL

命令

ctrl + c - 退出当前终端
ctrl + c 按下两次 - 退出 Node REPL
ctrl + d - 退出 Node REPL
向上/向下 键 - 查看输入的历史命令
tab 键 - 列出当前命令
.help - 列出使用命令
.break - 退出多行表达式
.clear - 退出多行表达式
.save filename - 保存当前的 Node REPL 会话到指定文件
.load filename - 载入当前 Node REPL 会话的文件内容

回调函数

阻塞

var fs = require("fs");

var data = fs.readFileSync('test.txt');

console.log(data.toString());
console.log("程序执行结束!");

非阻塞

var fs = require("fs");
fs.readFile('test.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");

事件循环

事件绑定

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
    console.log('连接成功。');

    // 触发 data_received 事件
    eventEmitter.emit('data_received');
}

// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);

// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
    console.log('数据接收成功。');
});

// 触发 connection 事件
eventEmitter.emit('connection');

console.log("程序执行完毕。");

回调函数是最后一个参数
错误对象是第一个参数
处理err参数

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err){
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("程序执行完毕");

EventEmitter

EventEmitter类,事件触发与监听
EventEmitter 对象如果在实例化时发生错误,会触发 'error' 事件。
当添加新的监听器时,'newListener' 事件会触发。
当监听器被移除时,'removeListener' 事件被触发。
例子

//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); 

event 对象注册了事件 some_event 的一个监听器
EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
例子

//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 参数'); 

on 函数用于绑定事件函数
emit 属性用于触发一个事件

error 事件
异常时会触发error事件,当error触发时,没有监听器会抛异常
可以设置一个监听器

继承EventEmitter
一般是继承它,fs、net、 http都是它的子类

方法

addListener(event, listener)
on(event, listener)	
once(event, listener)   #只触发一次,然后解除
removeListener(event, listener)
removeAllListeners([event])
setMaxListeners(n)
listeners(event)
emit(event, [arg1], [arg2], [...])
listenerCount(emitter, event)

事件

newListener(event,listener)
removeListener(event,listener)  #会改变后续的索引
var events = require('events');
var eventEmitter = new events.EventEmitter();

// 监听器 #1
var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

// 绑定 connection 事件,处理函数为 listener1 
eventEmitter.addListener('connection', listener1);

// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

// 处理 connection 事件 
eventEmitter.emit('connection');

// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

Buffer

js本身只有字符串,没有二进制类型,tcp及文件流需要二进制类型
一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存
创建

var buf = new Buffer(10);
var buf = new Buffer([10, 20, 30, 40, 50]);
var buf = new Buffer("www.runoob.com", "utf-8");//"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"

写入缓冲区

buf.write(string[, offset[, length]][, encoding])
//string - 写入缓冲区的字符
//offset - 缓冲区开始写入的索引值,默认为 0
//length - 写入的字节数,默认为 buffer.length
//encoding - 使用的编码。默认为 'utf8'
//返回值:实际写入的大小

例子

buf = new Buffer(256);
len = buf.write("www.runoob.com");

console.log("写入字节数 : "+  len);

读取数据

buf.toString([encoding[, start[, end]]])
//encoding - 使用的编码。默认为 'utf8' 。
//start - 指定开始读取的索引位置,默认为 0。
//end - 结束位置,默认为缓冲区的末尾。
//返回值:解码缓冲区,使用指定编码返回字符串

例子

buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}

console.log( buf.toString('ascii'));       // 输出: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   // 输出: abcde
console.log( buf.toString('utf8',0,5));    // 输出: abcde
console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 编码, 并输出: abcde

buffer转json

var buf = new Buffer('www.runoob.com');
var json = buf.toJSON(buf);

console.log(json);

转后的数据

{ type: 'Buffer',
  data: [ 119, 119, 119, 46, 114, 117, 110, 111, 111, 98, 46, 99, 111, 109 ] }

缓冲区合并

Buffer.concat(list[, totalLength])
//list用于合并的 Buffer 对象数组列表
//totalLength定合并后Buffer对象的总长度
//返回值:Buffer

var buffer1 = new Buffer('菜鸟教程 ');
var buffer2 = new Buffer('www.runoob.com');
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 内容: " + buffer3.toString());

缓冲区比较

// buf.compare(otherBuffer);
//返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同

var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
   console.log(buffer1 + " 在 " + buffer2 + "之前");
}else if(result == 0){
   console.log(buffer1 + " 与 " + buffer2 + "相同");
}else {
   console.log(buffer1 + " 在 " + buffer2 + "之后");
}

拷贝缓冲区

//buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
//targetBuffer - 要拷贝的 Buffer 对象。
//targetStart - 数字, 可选, 默认: 0
//sourceStart - 数字, 可选, 默认: 0
//sourceEnd - 数字, 可选, 默认: buffer.length

var buffer1 = new Buffer('ABC');
// 拷贝一个缓冲区
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());

缓冲区裁剪

//buf.slice([start[, end]])
//start - 数字, 可选, 默认: 0
//end - 数字, 可选, 默认: buffer.length
//返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切
var buffer1 = new Buffer('runoob');
// 剪切缓冲区
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());

缓冲区长度

var buffer = new Buffer('www.runoob.com');
//  缓冲区长度
console.log("buffer length: " + buffer.length);

buffer方法及参考:
http://nodejs.cn/api/buffer.html
http://www.runoob.com/nodejs/nodejs-buffer.html

posted @ 2017-03-21 11:02  zhangshihai1232  阅读(153)  评论(0)    收藏  举报