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
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号