nodejs之net模块的使用

news2024/9/22 7:13:39

vscode的底层ipc通讯都是基于node的net模块进行封装,今天大概讲解下net模块的使用

官方文档地址:https://nodejs.cn/api/net.html

net模块的作用

net模块提供了基于流的方式构建tcpipc服务器和客户端的能力。

node:net 模块提供异步网络 API,用于创建基于流的 TCP或 IPC 服务器 (net.createServer()) 和客户端 (net.createConnection())。

TCP和IPC介绍

OSI参考模型将网络通信功能划分为7层,即物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。TCP协议就是位于传输层的协议。
在这里插入图片描述

TCP

TCP:传输控制协议,可在同一台机器或不同机器或不同操作系统的进程间进行通信。

tcp特点

  • 面向连接

面向连接:就是指在正式通信前必须要与对方建立起连接;也正所谓的三次握手。

三次握手的主要目的是使得数据包的发送和接收同步。

三次握手大概流程:1.客户端A向主机B发出连接请求数据包;2.主机B向客户端A发送同意连接和要求同步的数据包;3.客户端A再发出一个数据包确认与主机B同步。

  • 端到端

  • 可靠

    • 应用数据被分割成TCP认为最合适发送的数据块
    • 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段;如果不能及时收到一个确认,将重发这个报文段。
    • 当TCP收到来自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送的,推迟发送。
    • TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输的过程中的任何变化。如果收到报文段的校验和有差错,TCP将丢弃这个报文段并希望发送方重新发送。
    • 既然TCP报文段作为IP数据包来传输,而IP数据报的到达可能会失序,那么TCP报文段的到达也可能会失序,如果有必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。然而,IP数据报会发生重复,TCP的接收端会进行重复数据的丢弃。
    • TCP还可以进行流量控制。TCP连接的每一方都有固定大小的缓存空间,TCP接收端只允许另一方发送端发送接收端缓存区所能容纳的数据。

IPC

IPC:(Inter Process Communication)即进程间通信,只能在同一台机器上进行不同进程间的通信,不能跨越物理机器!!

构建TCP服务器

TCP服务器和客户端在创建会话的过程中,服务器端和客户端分别提供一个套接字(socket),这两个套接字共同形成一个连接。服务器端和客户端则通过套接字实现两者之间连接的操作。

net.createServer([options][, connectListener])

  • options: object

  • alloHalfOpen:boolean,默认为false,则当可读端结束时,套接字将自动结束可写端;

  • pauseOnConnect:boolean,默认值false,指示是否应在传入连接上暂停套接字

  • connectLisetener: Function,是一个当客户端与服务器端建立链接时的回调函数,这个回调函数以socket端口对象作为参数

  • 返回net.Server

import net from 'net';

const server = net.createServer((socket) => {
  console.log('client connect')
  /***********************net.Socket事件*******************************/
  // 接收到数据时触发。
  socket.on('data', (data) => {
    console.log(data.toString())
  })
  // 当成功建立套接字连接时触发。
  socket.on('connect', () =>{
    console.log('套接字建立成功')
  })
  // 当写缓冲区变空时触发。
  socket.on('drain', () => {})
  // 当套接字的另一端表示传输结束时触发,从而结束套接字的可读端。
  socket.on('end', () => {
    console.log('数据接受完毕')
  })
  // 发生错误时触发,close事件将在此事件之后直接调用
  socket.on('error', (err) => {
    console.log(err)
  })
  // 一旦套接字完全关闭就触发
  socket.on('close', (hasError) => {
    // 参数 hadError 是布尔值,表示套接字是否由于传输错误而关闭。ture则表示由于传输错误而导致关闭
  })
})
/***************************net.Server 属性*****************************/
// 最大连接数字,设置此属性以在服务器的连接计数变高时拒绝连接。
server.maxConnections = 6;

/***************************net.Server事件******************************/
// 建立新连接时触发
server.on('connection', (socket) => {
  
})
// 发生错误时触发
server.on('error', (err) => {
  
})
// 服务器关闭时触发
server.on('close', () => {
  
})

/****************************net.Server方法*******************************/
// 异步获取服务器上的并发连接数
server.getConnections((err, count) => {
  if (err) return
  console.log(count)
})
// 获取监听地址端口参数信息
const address = server.address();

// 绑定监听端口
server.listen(8124, () => {
  console.log('TCP Server is runing')
})
// 停止服务器接受新连接并保持现有连接。
server.close((err) => {
  // 该函数是异步的,当所有连接都结束并且服务器触发 'close' 事件时,则服务器最终关闭。
  // 如果服务器在关闭时未打开,它将以 Error 作为唯一参数被调用。
})

构建TCP客户端

net.createConnection()

import net from 'net';
// 创建新的 net.Socket,并立即使用 socket.connect() 发起连接,然后返回启动连接的 net.Socket。
// 建立连接后,将在返回的套接字上触发 'connect' 事件。 最后一个参数 connectListener(如果提供)将作为 'connect' 事件的监听器添加一次。
const client = net.createConnection({
  port: 8124, // 端口
  host: '11.11.11.12', // 服务地址,默认localhost
}, () => {
  console.log('连接成功')
})
/*********************net.Socket 属性*************************/
// 接受的字节数
client.bytesRead = 1024;
// 发送的字节数
client.bytesWritten = 2048;
// 返回本地IP地址的字符串表示
client.localAddress
// 返回本地端口
client.localPort
// 远程 IP 地址的字符串表示形式
client.remoteAddress
// 远程 IP 系列的字符串表示形式。 'IPv4' 或 'IPv6'。
client.remoteFamily
// 远程端口的数字表示
client.remotePort
/*********************net.Socket 事件*************************/
// 连接server成功后触发
client.on('connect', () => {

})
// 接收到数据时触发
client.on('data', (data) => {
  console.log(data.toString())
})
// 当套接字的另一端表示传输结束时触发,从而结束套接字的可读端。
client.on('end', () => {})
// 当写缓冲区变空时触发。 可用于限制上传。
client.on('drain', () => {})
// 当套接字准备好使用时触发。
client.on('ready', () => {})
// 如果套接字因不活动而超时则触发。
client.on('timeout', () => {
  // 这只是通知套接字已空闲。 用户必须手动关闭连接。
  client.destroy() // 关闭连接
})
// 发生错误时触发。 'close' 事件将在此事件之后直接调用。
client.on('error', (err) => {
  console.log(err)
})

/*********************net.Socket 方法********************************/
// 销毁流并关闭连接。
client.destroy()
// 在给定的套接字上发起连接。
client.connect()
// 获取连接地址信息
client.address()
// 关闭socket,可传入数据,在关闭之前再write一次数据
client.end(data, () => {
  console.log('连接已关闭')
})
// 暂停读取数据
client.pause()
// 继续读取数据
client.resume()
// 为data事件中的datastream统一设置编码
client.setEncoding('utf8');
// 设置套接字超时事件
client.setTimeout(3000);
// 在套接字上发送数据。 第二个参数指定字符串情况下的编码。 它默认为 UTF8 编码。
client.write(data, (err) => {
  if (err) return;
  console.log('数据发送成功')
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT发展与技术基础

一、ChatGPT发展 【ChatGPT——GPT3.5】 诞生于:2022 年 11 月 类型:对话场景的大语言模型 特点:更贴近人的方式与使用者互动;在理解人类意图、精准回答问题、流畅生成结果方面远超人类预期。 功能:可以回答问题、…

bug--两个表格,数据来自于同一个抽屉表格,现在让两个表格的数据 不能一样--处理checked 和 disabled

步骤一、拿到表格数据 步骤二、处理 checked,要区分是A表 还是B表,这个区分要在 A表、B表 数据展示的组件里(根源)区分 : 点击A表,抽屉表格中A 已选的状态 是 checked 且 disabled,B 已选的 抽…

HCIA复习一

OSI七层模型 7.应用层: 用于人机交互,将抽象语言转化为编码; 6.表示层: 将编码转换为二进制;(加解密,压缩解压缩) 5.会话层: 管理通信双方的会话,细分为…

数模笔记6.30

目录 一、基础 建模步骤: 论文格式: 写作过程: 赛题类型: 二、优化类模型 2.1简单的优化模型 2.2数学规划模型 三、Lingo 一、基础 建模步骤: 找目标 找条件(变量、常量、自己的假设&#xff09…

Tomcat的优化多实例部署

一.tomcat核心组件模块 1.web容器:接受.响应请求 2.展示动态页面 2..JSP容器:翻译java---》servlet 3.serverlet容器:serverlet代码格式是用于JSP容器处理 简述: web容器 :1.接受、响应请求 2.展示动态页面 JSP容…

python之 flask 框架

创建安装虚拟环境 两种方法 第二种 # 先打开cmd 中断 # 查看virtual是否安装过 pip show virtualenv # 安装 pip install virtualenvwrapper-win # workon 查看虚拟环境 vorkon # 切换虚拟环境 # workon 虚拟环境 # mkvirtualenv 创建新的虚拟环境 mkvirtualenv falsk2…

MySQL 字符集与比较规则

字符集与比较规则 一. 字符集相关操作1. 查看字符集1.1 查看数据库当前字符集配置1.2 查看某数据库/数据表字符集 2. 修改字符集2.1 全局修改字符集2.2 修改已有库表字符集 3. 字符集级别二. 比较规则1. 后缀表示含义2. 查看指定数据集比较规则3. 查看/修改数据库/表比较规则 一…

计算机视觉:窥探数字世界的眼睛

目录 简介: 一. 计算机视觉的起源与发展 二. 计算机视觉的应用领域 三. 计算机视觉的挑战与未来发展 结论: 简介: 计算机视觉(Computer Vision)是人工智能(AI)领域中的一个重要分支&#…

同一VLAN不同交换机之间的数据转发

实验环境: 思科模拟器,Cisco Packet Tracer 实验拓扑: 配置步骤: (1)配置四台PC的IP地址 双击PC选择Desktop,然后选择IP Configuration配置ip (2)配置交换机 双击交换…

登录校验-interceptor/拦截器

Interceptor 概念:拦截前端对后端的某些请求 使用步骤 自定义拦截器类,实现HandlerInterceptor接口,重写所有的方法(preHandle方法在controller执行之前执行、【postHandle、afterCompletion】在controller执行后执行&#xff0…

基于java,springboot的零食零售系统设计与实现

背景 本系统实现管理员:首页、个人中心、用户管理、零食分类管理、零食信息管理、订单评价管理、系统管理、订单管理,用户;首页、个人中心、订单评价管理、我的收藏管理、订单管理,前台首页;首页、零食信息、零食资讯…

Vue工程创建及应用

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…

Python Pandas之loc、iloc

df.loc 通过标签索引获取数据 df.iloc 通过位置索引获取数据

Airtest:Windows桌面应用自动化测试二【Airtest基于图像识别自动控制手机App流程】

Airtest基于图像识别自动控制手机App流程 一、Airtest基于图像识别自动控制手机App流程二、基于图像识别生成脚本有两种操作:三、Airtest基于Poco的UI组件自动化控制App流程四、Airtest实现手机群控操作 Airtest介绍与脚本入门 Airtest相关api操作 一、Airtest基于…

暑期学JavaScript【第三天】

事件流 很多时候,一个事件可能会被多个元素监听。那么这些元素应该按什么顺序响应呢?从父到子称为捕获,从子到父称为冒泡。 事件捕获 可选参数,true or fause,带true代表按捕获方式响应 obj.addEventListener(cli…

短视频seo源码部署打包分享---开源

功能概要: 1. 按关键词搜索账号排名 2. 按关键词布局查询视频排名 3. 按天计费功能开发 4. 达标天数及关键词数量统计 开发概要: 区别于其他开发者,同类产品多用第三方,如:站长之家,本系统代码开发使…

| 从头打造个人网站(超详细)

哈喽🤗,这篇博客从0开始教大家创建自己的网站,包含个人网站,商用网站等,并且提供模板类型,提供修改模块样本~ 看完本博客你将会收获: 一个想要的类型网站学习React解答过程中遇到的问题最终效果 那就开始吧👩‍💻👨‍💻 ********************************…

AutoSAR系列讲解(入门篇)4.9-BSW小结

首先,要恭喜各位,最为枯燥难懂的一章你已经看完了。也许现在你还是一头雾水,但是相信大部分人都差不多,不必着急,因为AutoSAR单纯看理论最终也就只能看到这个程度了。所以看不太懂的小伙伴在这里先给自己一个定位&…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 主体架构与接口

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

Python dict keys方法:获取字典中键的序列【将keys转为list】

描述 dict.keys()方法是Python的字典方法,它将字典中的所有键组成一个可迭代序列并返回。 使用示例 >>> list({Chinasoft:China, Microsoft:USA}.keys()) [Chinasoft, Microsoft] >>> test_dict {Chinasoft:China, Microsoft:USA, Sony:Japan,…