当前位置:首页 > 日记 > 正文

Node.js之网络通讯模块实现浅析

Node.js之网络通讯模块实现浅析

前言

想必我们在用Node.js用的最多的应该是创建http服务,所以对于每个Web开发工程师而言,Node.js的网络相关模块学习是必不可少。

Node.js的网络模块架构

在Node.js的模块里面,与网络相关的模块有Net、DNS、HTTP、TLS/SSL、HTTPS、UDP/Datagram,除此之外,还有v8底层相关的网络模块有tcp_wrap.ccudp_wrap.ccpipe_wrap.ccstream_wrap.cc等等,在Javascript层以及C++层之间通过process.binding进行桥接相互通信。

Net模块

Net模块提供了一些用于底层的网络通信接口,包括创建服务器以及客户端,其中HTTP模块也是基于Net模型的上层封装,在Net模块里面主要提供net.Server以及net.Socket

创建TCP服务端

创建一个TCP服务器,可以通过使用构造函数new net.Server或者使用工厂方法net.createServer,这两个方法都会返回一个net.Server类,可接收两个可选参数。

var net = require('net');var server = net.createServer(function(socket){  socket    .on('data',function(data){      console.log('socket data',data.toString());      socket.write( data.toString() );    })    .on('end',function(){      console.log('socket end')    })    .on('error',function(error){      console.log('socket error',error);    });});server.listen(56200,function(){  console.log('server run at ',server.address());});server.on('error',function(err){  throw err;});// 执行后:server run at { address: '::', family: 'IPv6', port: 56200 }

在listen监听的时候没有指定端口的话会自动随意监听一个端口,创建完成一个TCP服务器后,使用tenlent 0.0.0.0 56200,链接后可与服务器进行数据通信。通过createServer实例化一个服务后,服务会去监听客户端请求,与客户端建立了链接之后会在回调里面抛出建链的net.Socket对象。

创建TCP客户端

创建一个TCP客户端链接可以使用构造函数new net.Socket或者其工厂方法net.createConnection,创建成功后都会返回一个net.Socket实例。

var net = require('net');var client = net.createConnection({port:56200,host:'localhost'});client.on('connect',function(){  console.log('client connect');});client.on('data',function(data){  console.log('client data',toString());});client.on('error',function(error){  throw error;});client.on('close',function(){  console.log('client close');});

Socket

socket是啥这里就不做详细的阐述了,下面主要了解下net.Socket这个构造体主要有提供一些什么方法、监听事件的使用。

相关事件

  1. connect : 当客户端与服务端成功建立链接之后触发,如果链接不上服务器直接抛出error事件错误然后退出node进程。
  2. data : 当客户端收到服务器传送过来的数据或者是客户端传送给服务器的数据的时候触发回调。
  3. end : 当另外一侧发送FIN包断开的时候触发,默认情况下面 (allowHalfOpen == false)socket会自我销毁(如果写入待处理队列里面还没正式响应回包),但是我们可以设置allowHalfOpen参数为true,这样可以继续往该socket里面写数据,但是我们需要自己去调用 end 方法去消耗这个socket,不然可能会造成句柄泄漏。
  4. close : 链接断开的时候触发,但是如果在传输的过程中有错误的话这里会在回调函数里面抛出 error。
  5. timeout : 当socket超时空闲的时候触发,如果要在队列里面销毁需要手动去调close方法。
  6. lookup : 域名解析完成的时候触发。
  7. drain : 写完缓存的时候触发,可使用在上传大小限制中。

相关方法

  1. write() : 服务端给客户端发送数据或者是客户端给服务端发送数据。
  2. address() : 获取服务绑定的socket的IP地址,返回对象有三个属性,分别为端口、host以
  3. 及IPvX版本。
  4. end() : 半关闭socket,会发送一个FIN包,服务器仍然可能发送一些数据,也可以这样调用socket.end(data,encoding)。
  5. pause() : 暂停读取数据,可以用作对数据上传限制。
  6. resume() : 继续数据读取。
  7. setEncoding() : 设置数据流的获取格式。
  8. setKeepAlive() : 允许/禁止keep-alive功能。
  9. setNoDelay() : 禁止Nagele算法,TCP链接默认使用Nagle算法,它们在发送之前数据会被缓存。这是为true的话在每次socket.write()的时候会立即发送数据,默认为true。
  10. setTimeout() : 当一个空闲的socket在多少秒后不活跃会被接受到timeout事件,但是该socket不会停止销毁,需要手动调用end()或者destroy()。表示禁止空闲超时。

相关属性

  1. bufferSize : 当前缓存的等待被发送的字符串的数量。
  2. bytesRead : 收到的字节的数量。
  3. bytesWritten : 发送的字节的数量
  4. destroyed : 标识链接是否已经被破坏,一旦被破环,就不用使用该链接来传输数据。
  5. localAddress : 远程客户端链接本地地址的host。如果我们监听服务的host是0.0.0.0,而客户端链接的是'192.168.1.1',最后的值是后者。
  6. localPort : 本地的端口。
  7. remoteAddress : 客户端IP,如果socket已经是destryed的话,该值为undefined
  8. remoteFamily : 客户端是IPvX

回包异常处理

服务器从客户端接受到需要处理的数据后进入处理环节,再业务逻辑处理完成之前如果socket以外断开的话,待服务器再给客户端回报的时候会直接响应error事件并报错Error : This socket has benn ended by the other part,所以在回报之前服务端需要先判断该socket是否被销毁,如果没有被销毁则回包,如果已经断开则销毁:

var net = require('net');var biz = require('./biz');var server = net.createServer(function(socket){  socket    .on('data',function(data){      biz.do(data)        .then(function(){          if( !socket.destroyed ) {            socket.write( data.toString() );          } else {            // do some report            socket.destry();          }        })        .catch(function(){          !socket.destroyed && socket.end('server handler error');        });          })    .on('end',function(){      console.log('socket end')    })    .on('error',function(error){      console.log('socket error',error);    });});server.listen(56200,function(){  console.log('server run at ',server.address());});server.on('error',function(err){  throw err;});

限制客户端数据大小

对请求大小限制是服务安全里面比不可少的一个环节,服务端不能无限大小的去接受客户端发送过来的所有数据,而限制大小就是第一道门槛。

var net = require('net');var MAX_REQUEST_BYTES = 2 * 1024 * 1024; // 2Mvar server = net.createServer(function(socket){  socket    .on('data',function(data){            if(data.bytesRead > MAX_REQUEST_BYTES) {        socket.pause();        socket.end('data is too big, forbidden');        // do some report      }    })    .on('end',function(){      console.log('socket end')    })    .on('error',function(error){      console.log('socket error',error);    });});server.listen(56200,function(){  console.log('server run at ',server.address());});server.on('error',function(err){  throw err;});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

ps中怎样设置打印

ps中怎样设置打印

设置,方法,图片,电脑软件,ps,  一张好的照片P好了还需要在ps中打印,但是打印也需要设置的。那么大家知道ps中怎样设置打印图片吗?下面是小编整理的ps中怎样设置打印图片的方法,希望能帮到大家!ps中设置打印图片的方法首先双击软件图标,进入…

ubuntu编译nodejs所需的软件并安装

ubuntu编译nodejs所需的软件并安装

编译,所需,并安装,电脑软件,ubuntu,闲了一段时间后,要开始做个项目了!公司以java为主,因此一直以来的技术栈为springboot,zookeeper,jredis,dubbo,druid.....经典的分布式服务器体系架构。我花了点时间,统计了一下maven中的依赖包,共计35个以上,…

PS怎么设置自动更改其它文件相关内

PS怎么设置自动更改其它文件相关内

文件,相关内容,设置自动,电脑软件,PS,打个比方,用PS做了一本书,很多页,里面有很多一样的内容,比如说LO,怎么才能做到,在一个文件里面修改这个LO,其它的文件里的LO,自动更改呢?软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时…

php实现的二叉树遍历算法示例

php实现的二叉树遍历算法示例

算法示例,二叉树遍历,电脑软件,php,本文实例讲述了php实现的二叉树遍历算法。分享给大家供大家参考,具体如下:今天使用php来实现二叉树的遍历创建的二叉树如下图所示php代码如下所示:<?phpclass Node { public $value; public $child_left; …

如何避免QQ帐号被盗

如何避免QQ帐号被盗

被盗,帐号,电脑软件,QQ,  用户只要使用安全的电脑登录QQ,并在登录及聊天过程中注意一些关键的细节就可以在绝大多数情况下避免QQ被盗取的风险。目前,根据已掌握的盗号者非法获取QQ密码的案例,QQ安全团队提供了以下三条建议:建议一:各类上网场…

excel2013输入值非法的解决方法exc

excel2013输入值非法的解决方法exc

输入,解决方法,电脑软件,strong,  在Excel中,有些情况在输入数据之后显示值是非法的,其实这个是因为数据有效性限制了你的输入范围,接下来是小编为大家带来的excel2013输入值非法的解决方法,以下用03版本做示范,2013版本的跟03版本通用,希望对…

在页面中引入js的两种方法 | 推荐

在页面中引入js的两种方法 | 推荐

推荐,方法,两种,页面,电脑软件,在页面中引入js有两种基本方式:在页面中嵌入js、引用外部js文件。一、在页面中嵌入js这是在页面使用js最简单的方式了,一般我在写个小测试的情况下会用这种方式。把script元素写在</body>前面,script元素的内容…

浅谈JS封闭函数、闭包、内置对象

浅谈JS封闭函数、闭包、内置对象

闭包,内置对象,函数,浅谈,电脑软件,一、变量作用域指的是变量的作用范围,javascript中的变量分为全局变量和局部变量1、全局变量:在函数之外定义的变量,为整个页面公用,函数的内部外部都可以访问。2、局部变量:在函数内部定义的变量,只能在定义该…

详解JavaScript中的六种错误类型

详解JavaScript中的六种错误类型

错误类型,六种,详解,电脑软件,JavaScript,刚入前端坑,英语又不太好的同学,是不是还在为控制台的错误抓耳挠腮?今天就带大家看一看JavaScript中常见的错误类型。js中的控制台的报错信息主要分为两大类,第一类是语法错误,这一类错误在预解析的过程…

AI制作空间感非常强的3d立体环形文

AI制作空间感非常强的3d立体环形文

教程,文字,3d,空间感,环形,版权申明:本文原创作者&ldquo;小胡舵主&rdquo;,感谢&ldquo;小胡舵主&rdquo;的原创经验分享!使用AI制作空间感非常强的3d立体环形文字,我们要制作出来的文字效果是制作立体环形的感觉,凸显文字的空间感。本次教程内容主…

Excel中怎样随数值改变表格颜色

Excel中怎样随数值改变表格颜色

方法,数值,表格,颜色,电脑软件,  怎么在EXCEL里面设置我们输入正负数,它会自己改变表格的颜色?下面是小编为大家整理的Excel中随数值改变而改变表格颜色的方法,希望大家能够从中有所收获!Excel中随数值改变表格颜色的方法使用条件格式或单…

TIOBE编程语言排行榜前20的语言入

TIOBE编程语言排行榜前20的语言入

语言,书籍推荐,编程语言,入门,排行榜,根据TIOBE 编程语言排行榜前20的语言分享相关图书(部分空缺)。在正式介绍编程语言排行之前,你敢不敢先挑战一下自己的编程技能?!测试下自己的编程风格?!挑战编程技能:57道程序员功力测试题 践行“实践出真知”…