当前位置: 首页 > news >正文

Nodejs 第五十四章(net)

net模块是Node.js的核心模块之一,它提供了用于创建基于网络的应用程序的API。net模块主要用于创建TCP服务器和TCP客户端,以及处理网络通信。

image.png

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,用于在计算机网络上进行数据传输。它是互联网协议套件(TCP/IP)的一部分,是应用层和网络层之间的传输层协议。

TCP的主要特点包括:

  1. 可靠性:TCP通过使用确认机制、序列号和重传策略来确保数据的可靠传输。它可以检测并纠正数据丢失、重复、损坏或失序的问题。
  2. 面向连接:在进行数据传输之前,TCP需要在发送方和接收方之间建立一个连接。连接的建立是通过三次握手来完成的,确保双方都准备好进行通信。
  3. 全双工通信:TCP支持双方同时进行双向通信,即发送方和接收方可以在同一时间发送和接收数据。
  4. 流式传输:TCP将数据视为连续的字节流进行传输,而不是离散的数据包。发送方将数据划分为较小的数据块,但TCP在传输过程中将其作为连续的字节流处理。
  5. 拥塞控制:TCP具备拥塞控制机制,用于避免网络拥塞和数据丢失。它通过动态调整发送速率、使用拥塞窗口和慢启动算法等方式来控制数据的发送速度。

场景

  1. 服务端之间的通讯

服务端之间的通讯可以直接使用TCP通讯,而不需要上升到http层

server.js

创建一个TCP服务,并且发送套接字,监听端口号3000

import net from 'net'const server = net.createServer((socket) => {setInterval(()=>{socket.write('XiaoMan')},1000)
})
server.listen(3000,()=>{console.log('listening on 3000')
})

client.js

连接server端,并且监听返回的数据


import net from 'net'const client = net.createConnection({host: '127.0.0.1',port: 3000,
})client.on('data', (data) => {console.log(data.toString())
})
  1. 从传输层实现http协议

创建一个TCP服务

import net from 'net'const http = net.createServer((socket) => {socket.on('data', (data) => {console.log(data.toString())})
})
http.listen(3000,()=>{console.log('listening on 3000')
})

net.createServer创建 Unix 域套接字并且返回一个server对象接受一个回调函数

socket可以监听很多事件

  1. close 一旦套接字完全关闭就触发
  2. connect 当成功建立套接字连接时触发
  3. data 接收到数据时触发
  4. end 当套接字的另一端表示传输结束时触发,从而结束套接字的可读端

通过node http.js 启动之后我们使用浏览器访问一下

image.png

可以看到浏览器发送了一个http get 请求 我们可以通过关键字get 返回相关的内容例如html

import net from 'net'const html = `<h1>TCP Server</h1>`const reposneHeader = ['HTTP/1.1 200 OK','Content-Type: text/html','Content-Length: ' + html.length,'Server: Nodejs','\r\n',html
]const http = net.createServer((socket) => {socket.on('data', (data) => {if(/GET/.test(data.toString())) {socket.write(reposneHeader.join('\r\n'))socket.end()}})
})
http.listen(3000, () => {console.log('listening on 3000')
})

image.png

相关文章:

  • 讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
  • R语言基础的代码语法解译笔记
  • 通过OceanBase 3.x中not in无法走hash连接的变化,来看OB优化器的发展
  • 2024蓝桥杯每日一题(区间合并)
  • pdf也可以制作成可翻页的电子书吗?
  • sensitive-word 敏感词 违规文字检测
  • python字符串转换成字典
  • 【论文速读】| 大语言模型引导的协议模糊测试
  • 【Java探索之旅】运算符解析 算术运算符,关系运算符
  • 我把Spring Cloud的超详细资料介绍给你,面试官不会生气吧?geigei
  • 【完美实现】VITE + VUE3 + SVG图片解析+element-plus开发环境初始化(基于macos)
  • 面试宝典-【redis】
  • ECharts饼图图例消失踩的坑
  • 电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程
  • mineadmin 快速安装部署(docker环境)
  • Apache Pulsar 2.1 重磅发布
  • canvas绘制圆角头像
  • Elasticsearch 参考指南(升级前重新索引)
  • Git初体验
  • Java,console输出实时的转向GUI textbox
  • JavaWeb(学习笔记二)
  • Java知识点总结(JavaIO-打印流)
  • jquery cookie
  • jQuery(一)
  • 关于Java中分层中遇到的一些问题
  • 利用DataURL技术在网页上显示图片
  • 如何设计一个比特币钱包服务
  • AI算硅基生命吗,为什么?
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #微信小程序:微信小程序常见的配置传旨
  • (003)SlickEdit Unity的补全
  • (java)关于Thread的挂起和恢复
  • (分布式缓存)Redis哨兵
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (一)认识微服务
  • (转)程序员技术练级攻略
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .gitignore文件忽略的内容不生效问题解决
  • .Net Core 中间件验签
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net程序帮助文档制作
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET中 MVC 工厂模式浅析
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .project文件
  • .vimrc 配置项
  • @WebServiceClient注解,wsdlLocation 可配置
  • [1]-基于图搜索的路径规划基础
  • [20180129]bash显示path环境变量.txt
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [C#]winform部署PaddleOCRV3推理模型