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