net模块和http模块是node最重要的两个模块,前者是基于TCP的封装,后者的本质也是TCP。他们通过 tcp通信,建立一个可以收发消息的web服务器。我在写的作品里面用的express也是封装的http的模块,本质都是一样的。
net建立TCP服务器,传入可选options配置信息。
net.createServer([options], [connectionListener])
//创建一个新的TCP服务器参数connectionListenner会被自动作为connection事件的监听器
options:{allowHalfOpen: false}如果允许半开连接,为true,当另一端的套接字发送FIN报文时套接字并不会自动发送FIN。套接字会变得不可读,但可写,应当调用end();
var net=require(‘net‘); var server=net.createrSever(function(c){ console.log(‘服务区已连接‘); c.on(‘end‘,function(){ console.log(‘服务器断开‘); }) c.write(‘hello\r\n‘); c.pipe(c); }).listen(3000,function(){ console.log(‘服务器绑定在3000端口‘); })
一个简单的例子,向连接的客户端写入hello。
net.connect(options,[connectionListener]),net.createConnection(options,[connectionListener]);
构建一个新的套接字对象并打开所给位置的套接字,当套接字就绪时会触发“connect”事件
options:{
port:客户端连接到的端口,
host:客户端连接到的主机,缺省为localhost
localAddress:网络连接绑定的本地接口,
family:IP栈版本,缺省为4
}
var net=require(‘net‘) var client=net.connect({port:3000},function(){ console.log(‘客户端已连接‘); client.write(‘word\r\n‘); }) client.on(‘data‘,function(data){ console.log(data.toString()); client.end(); }) client.on(‘end‘,function(){ console.log(‘break up‘); })
类net.server 用于创建一个TCP或UNIX服务器,服务器本质上是一个可监听传入连接的net.Socket
server.listen(port,[host],[backlog],[callback]);
在指定端口port的主机host上开始接受连接,如果省略host则服务器会接受所有来自IPV4地址的连接,端口为0,则会使用分随机分配的端口
backlog为连接等待队列的最大长度
这是一个异步函数,当服务器被绑定时会触发listening事件,最后一个参数callback会被做listening事件的监听器
server.on(‘error‘,function(e){ if (e.code==‘EADDRINUSE‘) { console.log(‘地址被占用,重试中……‘); setTimeout(function(){ server.close(); server.listen(PORT,HOST) }, 1000); }; })
server.close([callback]);停止服务器接收新连接,但保持已有连接。是一个异步函数,服务器在所有连接结束后关闭,并发送close事件;
server.address()返回操作系统报告的绑定的地址,协议族和端口。对查找操作系统分配的地址哪个端口已被分配非常有用
server.unref()如果这是事件系统中唯一一个活动的服务器,调用unref将允许程序退出,如果服务器已被unref,再次调用无影响
server.ref()如果这是仅剩的服务器,在一个之前被unref的服务器上调用ref将不会让程序退出;
server.maxConnections这个选项能在服务器连接数超过数量时拒绝连接
server.getConnections(callback)异步获取服务器当前活跃的连接数,用于套接字被发给子进程;回调传入err,count两参数
事件listening,在服务器调用server.listen绑定后触发
事件connection在一个新连接被创建时触发,socket是一个net.socket的实例
事件close服务器被关闭时触发
事件error当错误发生时触发
类net.Socket
·这个对象是一个TCP或UNIX套接字的抽象。net.Socket实例实现了一个双工流接口。
·他们可以被用户使用在客户端(使用connect())或者由node创建;通过connection服务器事件传递给用户
new net.Socket([options]) //构造一个新的套接字对象
{ fd: null //options对象
type: null
allowHalfOpen: false}
socket.connect(port,[host],[connectListener]) //使用传入的套接字打开一个连接 如果port和host都被传入,那么套接字将会倍已TCP套接字打开。
socket.connect(path,[connectListener])
//socket.bufferSize 是一个net.Socket的属性,用于socket.write()用于帮助用户获取更快的运行速度。
//socket.setEncoding([encoding])
//socket.write(data,[encoding],[cb])在套接字上发送数据
//socket.end([data],[encoding])半关闭套接字
//soclet.destroy()确保没有i/o活动在这个套接字。只用在错误发生情况下需要
//socket.pause()暂停读取。“data”事件不会被触发。对于控制上传非常有用
//socket.resume()在调用pause()后恢复读操作
//socket.setTimeout(timeout,[cb])如果套接字超过timeout毫秒数处于闲置状态,则超时,套接字会接受到一个‘timeout‘事件,但连接不会断开,除非手动end(),destroy()
·callback参数将会被添加成为‘timeout‘事件的一次性监听器
//socket.setNoDelay([noDelay])//禁用nagle算法;
//socket.setKeepAlive([enable],[initialDelay]) 禁用/启用长连接功能;enable默认为false,
事件lookup ·这个事件在解析主机名之后,连接主机之前被分发。对UNIX套接字不适用。
事件connect
事件data收到数据被分发。data参数会是一个buffer或string对象。
事件end套接字的另一端发送FIN包时,该事件被分发。
事件timeout
事件drain 当写入缓冲被清空时产生。课被用于控制上传流量
事件error close
net.isIP(input)测试input是否为ip地址,无效字符串返回0;
net.isIPv4(input); net.isIPv6(input);返回true or false
罗列一下node api,有需要瞅两眼