现在的位置: 首页 > 综合 > 正文

Node.js开发指南之三:核心模块介绍续

2013年09月16日 ⁄ 综合 ⁄ 共 3991字 ⁄ 字号 评论关闭


1 buffer

buffer为Node提供的处理二进制字节流的工具,原始数据存在在buffer对象里,当需要与string相互转换时,需要指定string的编码。目前Node支持下列编码:ascii,utf8,utf16le,base64,hex。binary在未来可能会被Node抛弃。

下面列举Buffer类的方法和属性

new Buffer(size)  new Buffer(array) new Buffer(str,[encoding])  构造一个buffer

toString([encoding] , [start], [end])  将buffer转换为字符串

write(str , [encoding])  将str写入buffer

buf[index]  基于位置访问字节内容

byteLength(str, [enc])  返回str的字节长度

concat(list)  将list中的buffer连接并返回

copy(dst, [dst-start], [src-start],[src-end])  将指定的数据复制到目的buffer指定位置,有人建议不要使用buf上的+,而使用copy来提升速度

slice([start],[end])

readUint8(offset)   从buffer中读出1个字节,类似的有readUInt16LE readUInt16Be,readUInt32LE/BE

writeUInt8(value,offset) 向buffer中写入数据,相应接口同Read系列。

在网络编程上,有主机序和网络序的区分,LE采用小端读法,在小端机上,为主机序。BE采用大端读法,在小端机上为网络序。

fill(value,[offset], [end]) 填充buff

length 长度

 

2 http

 HTTP模块比较复杂,即有Server支持,也有客户端支持

2.1 Server支持的组件

2.1.1 http.Server

本模块为我们提供了创建HTTP服务器的类,其支持以下方法:

listen(port,[host].[backlog],[callback])

listen(path,[callback])

listen(handle,[callback])

close([callback])

支持处理以下事件:

connection  function(socket)  {}  每次TCP连接建立时触发

close   function(0 {}  服务关闭的时候触发

connect  function(req,sock,head) {}  当http请求为connect方法时触发

clientError  function(excp)  {}  当客户端错误时触发

request    function(req,  resp) {}  每次当有请求到来的时候触发,req为http.ServerRequest实例,resp为;http.ServerResponse实例

2.1.2  ServerRequest

由HTTP模块内部创建,为Readable Stream接口的实现,支持以下事件。

data  function(chunk) { }   当有流上出现数据时触发,如果流设置了编码chunk为字符串,否则为buffer

end   function() {}    当在流上调用end()时触发

close  function() {}  当底层连接关闭时触发。

属性说明

method  HTTP方法,只读

url          请求URL串,只有首行中的路径

headers  请求中的HTTP首部

connection  net.Socket对象

方法说明

setEncoding()

pause()/resume()

2.1.3 ServerResponse

实现了Writable Stream接口,会触发下列事件

close()

方法说明:

writeHead(code,[code string],[headers])

setHeader(name,value)

removeHeader(name)

write(chunk,[encoding])

end([data],[encding])

属性说明

statusCode

2.2 客户端组件

2.2.1 http.request(option,callback)

用来发送HTTP请求,option = {host, hostname, port, lcoalAddress,socketPath, method,path, headers ,auth, agent  },callback=function(response). 返回一个http.ClientRequest对象。

http.get(option,callback) 用来支持get请求 callback=function(response)

2.2.2 http.ClientRequest

支持事件:

response  function(resp) {}

socket  function(socket) {}

connect function(resp,sock,head) {}

支持方法

write(data,[encoding])

end([data], [encoding])

abort()

setTimeout(timeo,[callback])

setNoDelay()

setSocketKeepAlive()

 

2.2.3 http.ClientResponse

事件

data

end

close

属性

statusCode

httpVersion

headers

方法

setEncoding()

pause()

resume()

3  dgram /UDP SERVER

dgram模块可以让我们快速构建一个UDP的服务器或客户端

creatSocket(type,[callback])  返回一个UDP的SOCKET,后续操作将都在此上进行

对于Socket类

bind(port, [address])  为socket绑定端口和地址

send(buf, start,length,port,address,[callback])  通过此socket向目的地址发送数据

close()   关闭socket

address()  获取socket的本地地址,{port, address,protocol}

setTTL(ttl)  设置IP的TTL属性

setBroadcast(flag)   设置为多播属性

setMulticastTTL(ttl)  设置IP多播TTL属性

setMulticastLoopback(flag)  设置或清除本地回环接收多播功能

addMembership(multiAddr , [interface])  在指定接口处加入多播组

dropMembership(multiaddr, [interface])  退出多播组

Socket上的事件:

message :  function(msg, raddr) {}   当UDP接收到消息时触发

error :   function(err) {}  当出现异常时触发

close:   function() {} 

下面是一个UDP的服务器代码,客户端向服务器发送hello,服务器回送world

var udpServer = require('dgram');

var main = function()
{
  socket = udpServer.createSocket('udp4');
  socket.bind(2048);
  //var local = socket.address();

  socket.on('error',function(err){
    console.log('error has happened ',err);
  });

  socket.on('message',function(data,addr){
     console.log('recvfrom addr ',addr); 

     var rbuf  = new Buffer('world','utf-8');
  });

  var rbuf = new Buffer('hello');
  var opt = {ip:'192.168.1.3',port:8080};

  socket.send(data,0,data.length,opt.port,opt.ip);
};

main();

4 Net

net模块可以让我们快速构建TCP的服务器和客户端的模块,具体模块不在此详细介绍,类似于HTTP模块

5 DNS

此模块相对比较简单,导出了一系列函数用来完成DNS请求及记录的解析

lookup(domain,'family',callback)   callback(err,address,family) { }

resolve(domain, [rrtype],callback)   callback(err,address) { }  type包括:A,AAAA,MX,TXT,PTR,SRV,NS,CNAME

var dns = require('dns');
var dom = process.argv[2];

/*
dns.lookup(dom,function(err,addr,family){
  console.log('1',err,addr,family);
});
*/

var types = ['A','AAAA','MX','TXT','SRV','PTR','NS','CNAME'];

var handler = function(type)
{
  try{
    dns.resolve(dom,type,function(err,address){
      if(!err)
        console.log(type,address);
      else
        console.log(type,err);
    });
  }catch(exp)
  {
    console.log('unsupport method');
  }
}

types.forEach(handler);

抱歉!评论已关闭.