第七章 网络编程

2018-08-07  本文已影响0人  大唐雷恋

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协议主要分为两个部分:握手和数据传输。

上一篇下一篇

猜你喜欢

热点阅读