@by Ruth92(转载请注明出处)

第7章 网络编程

Node 只需要几行代码即可构建服务器,无需额外的容器。

Node 提供了以下4个模块(适用于服务器端和客户端):

  • net -> TCP
  • dgram -> UDP
  • http -> HTTP
  • https -> HTTPS

OSI 模型:由七层组成,分别为物理层、数据链路层、网络层、传输层、表示层、应用层。

一、构建 TCP 服务

  1. TCP

    TCP(传输控制协议),属于传输层协议,是面向连接的协议。

    许多应用层协议基于 TCP 构建,典型的是 HTTP、SMTP、IMAP 等协议。

    【显著特征】:在传输之前需要3次握手形成会话。

    • 只有会话形成之后,服务器端和客户端之间才能互相发送数据

    • 在创建会话的过程中,服务器端和客户端分别提供一个套接字,这两个套接字共同形成一个连接。

    • 服务器端与客户端则通过套接字实现两者之间连接的操作。

  2. 创建 TCP 服务器端

    TCP-Server.js

     var net = require('net');
    
     var server = net.createServer(function(socket) {
    // 新的连接
    socket.on('data', function(data) {
    socket.write('你好');
    }); socket.on('end', function() {
    console.log('连接断开');
    }); socket.write('欢迎光临《深入浅出Node.js》示例:\n');
    }); server.listen(8124, function() {
    console.log('server bound');
    });

    或者:

     var server = net.createServer();
    server.on('connection', function(socket) {
    // 新的连接
    });
    server.listen(8124);

    TCP-Client.js

    通过 net 模块自行构造客户端进行会话,测试上面构建的TCP服务

     var client = net.connect({
    port: 8124
    }, function() { // 'connect' listener
    console.log('client connected');
    client.write('world!\r\n');
    }); client.on('data', function(data) {
    console.log(data.toString());
    client.end();
    }); client.on('end', function() {
    console.log('client disconnected');
    });

    输出:

     client connected
    欢迎光临《深入浅出Node.js》示例: 你好
    client disconnected
  3. TCP 服务的事件

    (1)服务器事件: listeningconnectioncloseerror

    (2)连接事件: dataendconnectdrainerrorclosetimeout

    注意,TCP针对网络中的小数据包有一定的优化策略:Nagle算法(默认),可以调用 socket.setNoDelay(true) 去掉 Nagle 算法,使得 write() 可以立即发送数据到网络中。

二、构建 UDP 服务

UDP:用户数据包协议,与 TCP 一样同属于网络传输层。

UDP 与 TCP 的最大区别:

(1) TCP 中连接一旦建立,所有会话都基于连接完成,客户端如果要与另一个TCP服务通信,需要另创建一个套接字来完成连接;

(2)UDP 不是面向连接的,可以与多个 UDP 服务通信,提供面向事务的简单不可靠信息传输服务。

缺点:在网络差的情况下丢包严重;

优点:无须连接,资源消耗低,处理快速且灵活;

应用:音频、视频等,及 DNS 服务。

  1. 创建 UDP 套接字

    UDP 套接字一旦创建,既可以作为客户端发送数据,也可以作为服务端接收数据。

     var dgram = require('dgram');
    var socket = dgram.createSocket('udp4');
  2. 创建 UDP 服务器端

     var dgram = require('dgram');
    var server = dgram.createSocket('udp4'); server.on('message', function(msg, rinfo) {
    console.log('server got:' + msg + ' from ' + rinfo.address + ':' + rinfo.port);
    }); server.on('listening', function() {
    var address = server.address();
    console.log('Server listening ' + address.address + ':' + address.port);
    }); // 调用 dgram.bind(port, [address]) 方法对网卡和端口进行绑定
    // 该套接字将接收所有网卡上 41234 端口上的消息
    server.bind(41234);
  3. 创建 UDP 客户端

     var dgram = require('dgram');
    var message = new Buffer('深入浅出Node.js');
    var client = dgram.createSocket('udp4'); // send() 方法:socket.send(buf, offset, length, port, address, [callback]);
    client.send(message, 0, message.length, 41234, 'localhost', function(err, bytes) {
    client.close();
    });
  4. UDP 套接字事件

    messagelisteningcloseerror

三、构建 HTTP 服务

如果要构造高效的网络应用,应该从传输层(TCP/UDP)进行着手,但是对于经典的应用场景,应用层协议绰绰有余。

var http = require('http');

http.createServer(function(req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');
  1. HTTP

    浏览器,其实是一个 HTTP 的代理。

    HTTP 服务只做两件事情:处理 HTTP 请求和发送 HTTP 响应。

  2. http 模块

    http 模块将连接所有套接字的读写抽象为 ServerRequestServerResponse 对象,它们分别对应请求和响应操作。

    HTTP 请求:

    报文头部会通过 http_parser 进行解析。

    HTTP 响应:

    影响响应报文头部信息的 API:res.setHeader()res.writeHead()

    报文体部分调用:res.write()res.end()

    注意:无论服务器端在处理业务逻辑时是否发生异常,务必在结束时调用 res.end() 结束请求,否则客户端将一直处于等待的状态。当然,也可以通过延迟 res.end() 的方式实现客户端与服务器端之间的长连接,但结束时务必关闭连接。

    HTTP 服务的事件

    connectionrequestclosecheckContinueconnectupgradeclientError

  3. HTTP 客户端

     var http = require('http');
    
     var options = {
    hostname: '127.0.0.1',
    port: 1337,
    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);
    });
    }); req.end();

    HTTP 响应

    HTTP 代理

    为了重用 TCP 连接,http 模块包含一个默认的客户端代理对象 http.globalAgent。

    它对每个服务器端(host+port)创建的连接进行了管理,默认情况下,通过 http 提供的 ClientRequest 对象对同一个服务发起的 HTTP 请求最多可以创建5个连接。

    可以在 options 中传递 agent 选项,更改连接数限制。

    HTTP 客户端事件

    responsesocketconnectupgradecontinue

四、构建 WebSocket 服务

相比 HTTP,WebSocket 更接近于传输层协议,它并没有在 HTTP 的基础上模拟服务器端的推送,而是在 TCP 上定义独立的协议。

WebSocket 协议主要分为两个部分:握手和数据传输。

五、网络服务与安全

《深入浅出Node.js》第7章 网络编程的更多相关文章

  1. 《深入浅出Node.js》第6章 理解 Buffer

    @by Ruth92(转载请注明出处) 第6章 理解 Buffer ✁ 为什么需要 Buffer? 在 Node 中,应用需要处理网络协议.操作数据库.处理图片.接收上传文件等,在网络流和文件的操作中 ...

  2. 深入浅出Node.js(一):什么是Node.js

    Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟Joyent获得企业资助,再到 ...

  3. 一个月时间整理《深入浅出Node.js》

    今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在 ...

  4. 深入浅出Node.js(一):什么是Node.js(转贴)

    以下内容转自:http://www.infoq.com/cn/articles/what-is-nodejs/ 作者:崔康 [编者按]:Node.js从2009年诞生至今,已经发展了两年有余,其成长的 ...

  5. 《深入浅出node.js(朴灵)》【PDF】下载

    <深入浅出node.js(朴灵)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062563 内容简介 <深入浅出Node. ...

  6. 深入浅出Node.js(上)

    (一):什么是Node.js Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟 ...

  7. 读书笔记: 深入浅出node.js

    >> 深入浅出node.js node.js是c++编写的js运行环境 浏览器: 渲染引擎 + js引擎 后端的js运行环境 node.js用google v8引擎,同时提供很多系统级的A ...

  8. 深入浅出node.js游戏服务器开发1——基础架构与框架介绍

    2013年04月19日 14:09:37 MJiao 阅读数:4614   深入浅出node.js游戏服务器开发1——基础架构与框架介绍   游戏服务器概述 没开发过游戏的人会觉得游戏服务器是很神秘的 ...

  9. 《深入浅出Node.js》学习笔记(一)

    看了朴灵前辈的node.js系列文章,很开阔视野,虽然能力有限还是有很多不懂,但是还是希望能写下笔记,初步对node.js有点了解. 一.概念 Node.js不是JS应用.而是JS运行平台 Node. ...

随机推荐

  1. (转)Tomcat数据源连接池加密

    文章来源 :http://my.oschina.net/cimu/blog/164757 我们在使用Tomcat数据库连接池的时候都是明文存储数据库用户名和密码的,例如: <Resource n ...

  2. HDU--1233--还是畅通工程--并查集

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  3. kibana 搜索提示挡住输入框

    临时解决办法 $(".typeahead-items").css("margin-top","33px")

  4. sql之多表连接

    最近遇到特别多多表连接的问题,因此随笔记下,开始学java和mysql的时间太短,有见解不周的地方,希望读者可以提出探讨. 对于left join.right join和inner join(join ...

  5. http Content-type对照表

    http://tools.jb51.net/table/http_content_type Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定 义网络文件的类型和 ...

  6. Linux——makefile

    1.vim Makefile 或 vim makefile 2. targetName:a.o b.o   #targetFileName:A.c B.c ,split with a space gc ...

  7. css 之 文本缩进属性(text-indent)

    文章转自:http://www.10wy.net/Article/CSS/CSS_list_8.html查看更多更专业性的文章请到:网页设计网 文本缩进属性(text-indent) 这个属性设定文本 ...

  8. [收藏]谷歌htm/css规范

    通用样式规范 协议 省略图片.样式.脚本以及其他媒体文件 URL 的协议部分(http:,https:),除非文件在两种协议下都不可用.这种方案称为 protocol-relative URL,好处是 ...

  9. 适合PHP学习者的学习路线 10个PHP优化技巧

    适合PHP学习者的学习路线: (1) 熟悉HTML/CSS/JS..网页基本元素,完成阶段可自行制作简单的网页,对元素属性相对熟悉 (2) 理解动态语言的概念和运做机制,熟悉基本的PHP语法 (3) ...

  10. [Python]logging模块使用basicConfig后记录日志重复问题

    logging.basicConfig配置日志记录到文件A后,再使用logging.FileHandler生成记录到文件B的logger 在使用此logger记录日志时,会同时记录的文件A和文件B,感 ...