美文网首页
第七章 网络编程

第七章 网络编程

作者: 大唐雷恋 | 来源:发表于2018-08-07 21:24 被阅读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协议主要分为两个部分:握手和数据传输。

    相关文章

      网友评论

          本文标题:第七章 网络编程

          本文链接:https://www.haomeiwen.com/subject/lozavftx.html