第七章 网络编程
Node提供了net,dgram,http,https四个模块,可以分别用于处理TCP,UDP,HTTP,HTTPs,适用于服务器端和客户端。
7.1构建TCP服务
7.1.1 TCP
TCP(传输控制协议),在OSI模型(七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层)中输入传输层协议。许多应用层协议基于TCP构建,如:HTTP,SMTP,IMAP.
TCP三次握手:
7.1.2 创建TCP服务端
实例代码(略)
7.1.3 TCP服务事件
1.服务器事件
listening:在调用server.listen()绑定端口或者domain socket后出发,server.listen(port,listeningListener).
connection:每个客户端套接字连接掉服务器端时触发,net.createServer()
close:调用server.close()后,服务器将停止 接收新的套接字,但保持当前存在的连接,等待所有连接断开后,触发该事件。
error:服务器异常时触发该事件。
2.连接事件
可以通过data事件从一端读取另一端发来的数据,也可以通过write()方法从一端向另一端发送数据
data:当一端调用write()发送数据时,另一端会触发data事件,时间传递的数据即是write()发送的数据。
end:当连接中的任意端发送了FIN数据时,将会触发该事件。
connect:该事件用于客户端,当套接字与服务器端连接成功时会被触发。
drain:任意一端调用write()发送数据时,当前这端会触发该事件。
error:异常发生时触发
close:套接字完全关闭时触发
timeout:超时触发
7.2 构建UDP服务
UDP与TCP同属于网络传输层,但UDP不是面向连接的,不是可靠数据传输。由于它无须连接,资源消耗低,处理快速灵活,适合偶尔丢包不产生重大影响的场景,如音频,视频。DNS也是基于它实现的。
当套接字对象用在客户端时,可以调用send()方法发送消息到网络中。
socket.send(buf,offset,length,port,address,[callback]);
7.2.4 UDP套接字事件
message:当UDP套接字侦听网卡端口后,接收到消息时触发,触发携带的数据位消息Buffer对象和一个远程地址信息。
listening:当UDP套接字开始侦听时触发该事件。
close:调用close()方法时触发该事件,并不再触发message事件,如需再次触发message事件,重新绑定即可。
error:当异常发生时触发。如果不侦听,异常将直接退出。
7.3 构建HTTP服务
HTTP协议(超文本传输协议)位于应用层,可用来构建高效的网络应用。
请求->处理->响应
从协议的角度讲,现在的应用,如浏览器,其实就是一个HTTP的代理,用户的行为将会通过它装化为HTTP请求报文发送给服务器端。
无论是HTTP请求报文还是响应报文,报文内容都包含两个部分:报文头和报文体。
7.3.2 http模块
1.http请求
http的请求方法常见的又:GET,POST,DELETE,PUT,CONNECT等
http请求对象和http响应对象是相对较底层的封装,现行的web框架如Connect和Express都是在这两个对象的基础上进行高层封装完成的。
2.http响应
http影响报文头部信息的api为res.setHeader()和res.writeHead();
res.writeHead(200,{'Content-Type':'text/plain'});
3.http服务的事件
connection:在开始http请求和响应齐纳,客户端你和服务器端需要建立底层的TCP连接,这个连接可能因为开启了keep-alive,可以在多次请求响应之间使用,当这个连接建立时,服务器触发一次connection事件。
request事件:。。。。
7.3.3 HTTP客户端
var options = {
hostname: '127.0.0.1',
port: 1334,
path: '/',
method:'GET'
};
var req = http.request(options, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log(chunk);
});
});
各参数解释如下:
host:服务器的域名或ip地址,默认为localhost
hostname:服务器名称
port:服务器端口,默认为80
localAddress:建立网络连接的本地网卡
socketPath:Domain套接字路径
method:HTTP请求方法,默认为GET
path:请求路径,默认为/
headers:请求头对象
auth:basic认证,这个值将被计算成请求头中的authorization部分。
1.HTTP响应
7.4构建websocket服务
websocket与node的配合堪称完美:
websocket客户端基于事件的编程模型与Node中自定义事件相差无几
websocket实现了客户端与服务端之间的长连接,而Node事件驱动的方式十分擅长与大量客户端保持高并发的连接。
websocket相比http有如下好处:客户端与服务端只建立一个TCP连接,可以使用更少的连接
websocket服务端可以推动数据到客户端,这远比http请求响应模式更灵活,更高效
有更轻量级的协议头,减少数据传送量
var socket = new WebSocket('ws://127.0.0.1:12010/updates');
socket.onopen = function () {
setInterval(function() {
if (socket.bufferedAmount == 0)
socket.send(getUpdateData());
}, 50);
};
socket.onmessage = function (event) {
// TODO:event.data
};
websocket更接近于传输层协议,它并没有在http基础上模拟服务器端的推送,而是在tcp上定义独立的协议。让人迷惑的部分在于websocket的握手部分是由http完成的,让人觉得它可能是基于http实现的。
websocket协议主要分为两个部分:握手和数据传输。