iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Node.js之网络通讯模块实现浅析
  • 162
分享到

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

网络通讯模块Node 2022-06-04 17:06:20 162人浏览 八月长安
摘要

前言 想必我们在用node.js用的最多的应该是创建Http服务,所以对于每个web开发工程师而言,node.js的网络相关模块学习是必不可少。 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.cc、udp_wrap.cc、pipe_wrap.cc、stream_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这个构造体主要有提供一些什么方法、监听事件的使用。

相关事件

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

相关方法

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

相关属性

bufferSize : 当前缓存的等待被发送的字符串的数量。 bytesRead : 收到的字节的数量。 bytesWritten : 发送的字节的数量 destroyed : 标识链接是否已经被破坏,一旦被破环,就不用使用该链接来传输数据。 localAddress : 远程客户端链接本地地址的host。如果我们监听服务的host是0.0.0.0,而客户端链接的是'192.168.1.1',最后的值是后者。 localPort : 本地的端口。 remoteAddress : 客户端IP,如果socket已经是destryed的话,该值为undefined。 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; // 2M
var 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;
});

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

--结束END--

本文标题: Node.js之网络通讯模块实现浅析

本文链接: https://www.lsjlt.com/news/12697.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Docker如何实现网络通讯
    这篇文章主要介绍“Docker如何实现网络通讯”,在日常操作中,相信很多人在Docker如何实现网络通讯问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Docker如何实现网络...
    99+
    2024-04-02
  • Pytorch实现ResNet网络之ResidualBlock残差块
    目录Residual Block实现一个残差块Residual Block ResNet中最重要的组件是残差块(residual block),也称为残差单元(residual un...
    99+
    2023-05-17
    Pytorch ResNet网络残差块 Pytorch ResNet Residual Block
  • Java IO网络模型实现解析
    目录前言正文一. BIO二. Non Blocking IO三. IO多路复用四. NIO总结前言 本篇文章会对Java中的网络IO模型的概念进行解释,并给出具体的Java代码实现...
    99+
    2023-03-19
    Java IO网络模型 Java IO
  • Java实现多对多网络通讯的流程
    基本流程 客户端发送信息(指定目标客户端)至固定的一个服务端,服务端接收信息进行处理后发送至相应的客户端 通讯核心类 Socket类与流相辅相成,完成通讯。在accept方法返回了...
    99+
    2024-04-02
  • ESP8266WiFi模块与Android APP实现数据传输(二)---AP模式通讯
    目录 前言: 1.ESP8266模块设定: (1)准备阶段: (2)AT指令配置WiFi模块: 2.Android手机端APP设置: 3.ESP8266与APP通讯:  4.串口调试器和APP程序等资源下载途径 前言:         ...
    99+
    2023-09-10
    android 嵌入式硬件 单片机 mcu 物联网
  • kubernetes如何实现集群各模块之间的通信
    这篇文章主要为大家展示了“kubernetes如何实现集群各模块之间的通信”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes如何实现集群各模块之间的通信”这篇文章吧。一: 通信结...
    99+
    2023-06-04
  • C语言之通讯录的模拟实现代码
    目录纲要:一.通讯录的静态版本    1.添加联系人  2.展示联系人  3.删除联系人  4.查找联系人信息  5.修改联系人信息  6.排序联系人 --- 我们使用 qsort ...
    99+
    2024-04-02
  • Node.js使用http模块实现后台服务器流程解析
    目录客户端与服务器IP地址域名和域名服务器端口号什么是http模块创建基本的web服务器小结客户端与服务器 客户端 : 在网络节点中,负责消费资源的电脑,叫做客户端,例如:在网络中你...
    99+
    2024-04-02
  • C++简单实现RPC网络通讯的示例详解
    目录一、RPC简介1.1 简介1.2 本地调用和远程调用的区别1.3 RPC运行的流程1.4 小结二、RPC简单实现2.1 客户端实现代码2.2 服务端代码三、加强版RPC(以&ld...
    99+
    2023-05-18
    C++实现RPC网络通讯 C++ RPC网络通讯 C++ 网络通讯
  • Java网络编程之UDP实现原理解析
    UDP实现通信非常简单,没有服务器,每个都是客户端,每个客户端都需要一个发送端口和一个接收端口。一个客户端向另一个客户端发送消息时,需要知道对方的IP和接收端口,所用到的类为Data...
    99+
    2024-04-02
  • 微信小程序网络请求模块封装的具体实现
    目录前言具体实现1.确定结构2.service网络请求的基本配置和公共方法3.apis创建对应功能模块的网络请求方法4.使用总结前言 在进行一个微信小程序项目开发的时候我需要网络请求...
    99+
    2024-04-02
  • Pytorch深度学习经典卷积神经网络resnet模块实例分析
    这篇文章主要介绍“Pytorch深度学习经典卷积神经网络resnet模块实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Pytorch深度学习经典卷积神经网络resnet模块实例分析”文章能帮...
    99+
    2023-06-30
  • 怎么在JAVA项目中实现一个UDP网络通讯功能
    今天就跟大家聊聊有关怎么在JAVA项目中实现一个UDP网络通讯功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体如下:UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用...
    99+
    2023-05-31
    java udp ava
  • 怎么在JAVA项目中实现一个TCP网络通讯功能
    怎么在JAVA项目中实现一个TCP网络通讯功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体如下:TCP(Transmission Control Prot...
    99+
    2023-05-31
    java tcp ava
  • 详解利用Pytorch实现ResNet网络之评估训练模型
    目录正文评估模型训练 ResNet50 模型正文 每个 batch 前清空梯度,否则会将不同 batch 的梯度累加在一块,导致模型参数错误。 然后我们将输入和目标张量都移动到所需的...
    99+
    2023-05-16
    Pytorch ResNet网络 Pytorch ResNet
  • 如何进行C#网络编程服务器端程序的实现源码浅析
    本篇文章为大家展示了如何进行C#网络编程服务器端程序的实现源码浅析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#网络编程服务器端程序实现源码是怎么样的呢?让我们来看看其中重要的一部分:由于在此次...
    99+
    2023-06-17
  • 通过抓包实现Python模拟登陆各网站的原理分析
    今天就跟大家聊聊有关通过抓包实现Python模拟登陆各网站的原理分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、教程1.1 基本介绍通过分析登陆流程并使用 Python 实现模...
    99+
    2023-06-17
  • 通过抓包实现Python模拟登陆各网站的原理分析是怎样的
    这篇文章将为大家详细讲解有关通过抓包实现Python模拟登陆各网站的原理分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  一、教程简介  1.1 基本介绍(私信小编001 、00...
    99+
    2023-06-02
  • python网络爬虫之模拟登录 自动获取cookie值 验证码识别的具体实现
    目录1、爬取网页分析2、验证码识别3、cookie自动获取4、程序源代码chaojiying.pysign in.py1、爬取网页分析 爬取的目标网址为:https://www.gu...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作