Node.js中net模块详解
Node.js 中 net 模块 API 详解
Node.js 的 net 模块提供了基于 TCP/IP 的网络功能,用于创建 TCP 服务器和客户端。以下是 net 模块的所有 API 详解:
1. 创建 TCP 服务器
const net = require('net');// 1. 基本服务器
const server = net.createServer((socket) => {console.log('客户端已连接');socket.on('data', (data) => {console.log('收到数据:', data.toString());socket.write('服务器已收到数据');});socket.on('end', () => {console.log('客户端已断开连接');});socket.on('error', (err) => {console.error('Socket 错误:', err);});
});server.listen(3000, '127.0.0.1', () => {console.log('服务器运行在 127.0.0.1:3000');
});// 2. 使用 Server 类
const server2 = new net.Server((socket) => {console.log('客户端已连接');
});server2.listen(3001);// 3. 处理连接事件
server.on('connection', (socket) => {console.log('新连接建立');// 设置超时socket.setTimeout(60000); // 60 秒// 设置保活socket.setKeepAlive(true, 60000);// 设置缓冲区大小socket.setNoDelay(true);
});// 4. 错误处理
server.on('error', (err) => {console.error('服务器错误:', err);
});// 5. 关闭服务器
server.close(() => {console.log('服务器已关闭');
});
2. 服务器方法
// 1. 启动服务器
server.listen(3000, '127.0.0.1', () => {console.log('服务器运行在 127.0.0.1:3000');
});// 2. 关闭服务器
server.close(() => {console.log('服务器已关闭');
});// 3. 获取服务器地址信息
const address = server.address();
console.log('服务器地址:', address);
// { address: '127.0.0.1', family: 'IPv4', port: 3000 }// 4. 获取最大连接数
const maxConnections = server.maxConnections;
console.log('最大连接数:', maxConnections);// 5. 设置最大连接数
server.maxConnections = 100;// 6. 获取当前连接数
const connections = server.connections;
console.log('当前连接数:', connections);
3. Socket 对象
// 1. Socket 属性
server.on('connection', (socket) => {console.log('远程地址:', socket.remoteAddress);console.log('远程端口:', socket.remotePort);console.log('本地地址:', socket.localAddress);console.log('本地端口:', socket.localPort);console.log('字节读取:', socket.bytesRead);console.log('字节写入:', socket.bytesWritten);console.log('超时设置:', socket.timeout);console.log('保活设置:', socket.keepAlive);console.log('保活初始延迟:', socket.keepAliveInitialDelay);console.log('无延迟设置:', socket.noDelay);console.log('可写状态:', socket.writable);console.log('可读状态:', socket.readable);console.log('已销毁:', socket.destroyed);
});// 2. Socket 事件
server.on('connection', (socket) => {// 数据事件socket.on('data', (data) => {console.log('收到数据:', data.toString());});// 结束事件socket.on('end', () => {console.log('连接结束');});// 关闭事件socket.on('close', (hadError) => {console.log('连接关闭, 是否有错误:', hadError);});// 错误事件socket.on('error', (err) => {console.error('Socket 错误:', err);});// 超时事件socket.on('timeout', () => {console.log('连接超时');});// 可写事件socket.on('drain', () => {console.log('缓冲区已清空');});// 查找事件socket.on('lookup', (err, address, family, host) => {console.log('DNS 查找结果:', address, family, host);});// 准备事件socket.on('ready', () => {console.log('Socket 已准备就绪');});
});// 3. Socket 方法
server.on('connection', (socket) => {// 写入数据socket.write('Hello Client\n');// 结束写入socket.end();// 暂停读取socket.pause();// 恢复读取socket.resume();// 设置超时socket.setTimeout(60000);// 设置保活socket.setKeepAlive(true, 60000);// 设置无延迟socket.setNoDelay(true);// 获取地址信息const address = socket.address();console.log('Socket 地址:', address);// 销毁 Socketsocket.destroy();
});
4. 创建 TCP 客户端
// 1. 基本客户端
const client = new net.Socket();client.connect(3000, '127.0.0.1', () => {console.log('已连接到服务器');client.write('Hello Server');
});client.on('data', (data) => {console.log('收到数据:', data.toString());
});client.on('end', () => {console.log('与服务器断开连接');
});client.on('error', (err) => {console.error('客户端错误:', err);
});// 2. 使用 createConnection
const client2 = net.createConnection(3000, '127.0.0.1', () => {console.log('已连接到服务器');client2.write('Hello Server');
});// 3. 使用 Unix 域套接字
const unixClient = net.createConnection('/tmp/socket.sock', () => {console.log('已连接到 Unix 域套接字');
});// 4. 使用选项对象
const client3 = net.createConnection({port: 3000,host: '127.0.0.1',timeout: 5000,keepAlive: true,keepAliveInitialDelay: 10000,noDelay: true
}, () => {console.log('已连接到服务器');
});
5. 客户端事件
// 1. 连接事件
client.on('connect', () => {console.log('已连接到服务器');
});// 2. 数据事件
client.on('data', (data) => {console.log('收到数据:', data.toString());
});// 3. 结束事件
client.on('end', () => {console.log('与服务器断开连接');
});// 4. 关闭事件
client.on('close', (hadError) => {console.log('连接关闭, 是否有错误:', hadError);
});// 5. 错误事件
client.on('error', (err) => {console.error('客户端错误:', err);
});// 6. 超时事件
client.on('timeout', () => {console.log('连接超时');
});// 7. 可写事件
client.on('drain', () => {console.log('缓冲区已清空');
});// 8. 查找事件
client.on('lookup', (err, address, family, host) => {console.log('DNS 查找结果:', address, family, host);
});// 9. 准备事件
client.on('ready', () => {console.log('Socket 已准备就绪');
});
6. 客户端方法
// 1. 连接到服务器
client.connect(3000, '127.0.0.1', () => {console.log('已连接到服务器');
});// 2. 写入数据
client.write('Hello Server\n');// 3. 结束连接
client.end();// 4. 销毁连接
client.destroy();// 5. 暂停读取
client.pause();// 6. 恢复读取
client.resume();// 7. 设置超时
client.setTimeout(5000);// 8. 设置保活
client.setKeepAlive(true, 10000);// 9. 设置无延迟
client.setNoDelay(true);// 10. 获取地址信息
const address = client.address();
console.log('客户端地址:', address);
7. 网络工具函数
// 1. 检查是否为 IP 地址
const isIP = net.isIP('192.168.1.1');
console.log('是否为 IP 地址:', isIP); // 4 (IPv4) 或 6 (IPv6) 或 0 (不是 IP)// 2. 检查是否为 IPv4 地址
const isIPv4 = net.isIPv4('192.168.1.1');
console.log('是否为 IPv4 地址:', isIPv4); // true 或 false// 3. 检查是否为 IPv6 地址
const isIPv6 = net.isIPv6('2001:db8::1');
console.log('是否为 IPv6 地址:', isIPv6); // true 或 false// 4. 获取本地 IP 地址
const os = require('os');
const interfaces = os.networkInterfaces();
console.log('网络接口:', interfaces);
8. 实际应用示例
// 1. 回显服务器
const echoServer = net.createServer((socket) => {console.log('客户端已连接');socket.on('data', (data) => {console.log('收到数据:', data.toString());socket.write(data); // 回显数据});socket.on('end', () => {console.log('客户端已断开连接');});
});echoServer.listen(3000, '127.0.0.1');// 2. 聊天服务器
const chatServer = net.createServer();
const clients = [];chatServer.on('connection', (socket) => {console.log('新客户端连接');clients.push(socket);socket.write('欢迎加入聊天室!\n');socket.on('data', (data) => {const message = data.toString().trim();console.log('收到消息:', message);// 广播消息给所有客户端clients.forEach(client => {if (client !== socket) {client.write(`客户端 ${socket.remotePort} 说: ${message}\n`);}});});socket.on('end', () => {console.log('客户端断开连接');const index = clients.indexOf(socket);if (index !== -1) {clients.splice(index, 1);}});
});chatServer.listen(3001, '127.0.0.1');// 3. 端口扫描器
function scanPort(host, port) {return new Promise((resolve) => {const socket = new net.Socket();socket.setTimeout(1000);socket.on('connect', () => {console.log(`端口 ${port} 开放`);socket.destroy();resolve(true);});socket.on('timeout', () => {socket.destroy();resolve(false);});socket.on('error', () => {socket.destroy();resolve(false);});socket.connect(port, host);});
}async function scanPorts(host, startPort, endPort) {console.log(`开始扫描主机 ${host} 的端口 ${startPort}-${endPort}`);for (let port = startPort; port <= endPort; port++) {const isOpen = await scanPort(host, port);if (isOpen) {console.log(`端口 ${port} 开放`);}}console.log('扫描完成');
}// scanPorts('127.0.0.1', 1, 1024);
9. 高级功能
// 1. 多路复用服务器
const multiplexServer = net.createServer();
const channels = {};multiplexServer.on('connection', (socket) => {console.log('新连接建立');socket.on('data', (data) => {const message = JSON.parse(data.toString());if (message.type === 'register') {// 注册通道channels[message.channel] = socket;socket.channel = message.channel;socket.write(JSON.stringify({ type: 'registered', channel: message.channel }) + '\n');} else if (message.type === 'message') {// 转发消息const targetChannel = channels[message.target];if (targetChannel) {targetChannel.write(JSON.stringify({type: 'message',from: socket.channel,data: message.data}) + '\n');}}});socket.on('end', () => {if (socket.channel) {delete channels[socket.channel];}});
});multiplexServer.listen(3002, '127.0.0.1');// 2. 负载均衡器
const backendServers = [{ host: '127.0.0.1', port: 3003 },{ host: '127.0.0.1', port: 3004 },{ host: '127.0.0.1', port: 3005 }
];let currentServer = 0;const loadBalancer = net.createServer((clientSocket) => {const server = backendServers[currentServer];currentServer = (currentServer + 1) % backendServers.length;console.log(`将客户端连接到后端服务器 ${server.host}:${server.port}`);const serverSocket = net.createConnection(server.port, server.host, () => {clientSocket.write('已连接到后端服务器\n');});clientSocket.pipe(serverSocket);serverSocket.pipe(clientSocket);clientSocket.on('error', (err) => {console.error('客户端错误:', err);});serverSocket.on('error', (err) => {console.error('服务器错误:', err);});clientSocket.on('end', () => {serverSocket.end();});serverSocket.on('end', () => {clientSocket.end();});
});loadBalancer.listen(3000, '127.0.0.1');
10. 性能优化
// 1. 使用连接池
class ConnectionPool {constructor(host, port, size) {this.host = host;this.port = port;this.size = size;this.pool = [];this.available = [];}async initialize() {for (let i = 0; i < this.size; i++) {const socket = await this.createConnection();this.pool.push(socket);this.available.push(socket);}}createConnection() {return new Promise((resolve, reject) => {const socket = new net.Socket();socket.connect(this.port, this.host, () => {resolve(socket);});socket.on('error', (err) => {reject(err);});});}acquire() {if (this.available.length === 0) {return null;}return this.available.pop();}release(socket) {if (this.pool.includes(socket)) {this.available.push(socket);}}
}// 2. 使用缓冲区
const bufferServer = net.createServer((socket) => {let buffer = Buffer.alloc(0);socket.on('data', (chunk) => {buffer = Buffer.concat([buffer, chunk]);// 处理完整消息while (buffer.length >= 4) {const messageLength = buffer.readUInt32BE(0);if (buffer.length >= messageLength + 4) {const message = buffer.slice(4, messageLength + 4);buffer = buffer.slice(messageLength + 4);// 处理消息console.log('收到消息:', message.toString());socket.write(Buffer.concat([Buffer.from([0, 0, 0, 4]), // 4 字节长度Buffer.from('OK\n')]));} else {break;}}});
});bufferServer.listen(3006, '127.0.0.1');
net 模块的主要特点:
- 提供 TCP 服务器和客户端功能
- 支持 IPv4 和 IPv6
- 支持 Unix 域套接字
- 提供事件驱动 API
- 支持流式处理
使用建议:
- 使用事件处理连接和数据
- 正确处理错误情况
- 设置适当的超时和保活
- 使用无延迟模式提高性能
- 考虑使用更高级的框架(如 Socket.io)简化开发
相关文章:
Node.js中net模块详解
Node.js 中 net 模块 API 详解 Node.js 的 net 模块提供了基于 TCP/IP 的网络功能,用于创建 TCP 服务器和客户端。以下是 net 模块的所有 API 详解: 1. 创建 TCP 服务器 const net require(net);// 1. 基本服务器 const server net.createServer((s…...
【从零开始学习JVM | 第三篇】虚拟机的垃圾回收学习(一)
堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap&am…...
intellj idea 2024.1
参考资料 激活 https://www.microcharon.com/tech/5.htmlja-netfilter-all下载地址:https://drive.microcharon.com/OneDrive/Software/JetBrains%20ja-netfilter-all%20Build%202024.1.11.zip 步骤及问题 下载后:安全前确保旧版本的idea已经卸载。安…...
redis之缓存击穿
一、前言 本期我们聊一下缓存击穿,其实缓存击穿和缓存穿透很相似,区别就是,缓存穿透是一些黑客故意请求压根不存在的数据从而达到拖垮系统的目的,是恶意的,有针对性的。缓存击穿的情况是,数据确实存在&…...
Node.js中path模块详解
Node.js path 模块全部 API 详解 Node.js 的 path 模块提供了处理文件路径的工具函数,支持跨平台路径操作。以下是 path 模块的所有 API 详解: 1. 路径解析与操作 const path require(path);// 1. 路径连接 const fullPath path.join(__dirname, fi…...
重构艺术 | 内联与查询替代临时变量
重构艺术 | 内联与查询替代临时变量 在代码重构的殿堂里,临时变量常常扮演着双面角色:既是代码清晰的助力器,也可能成为代码腐败的温床。本文将深入探讨两种处理临时变量的重要手法:内联临时变量(Inline Temp…...
数据分析-数据预处理
数据分析-数据预处理 处理重复值 duplicated( )查找重复值 import pandas as pd apd.DataFrame(data[[A,19],[B,19],[C,20],[A,19],[C,20]],columns[name,age]) print(a) print(--------------------------) aa.duplicated() print(a)只判断全局不判断每个 any() import p…...
Java基础 4.12
1.方法的重载(OverLoad) 基本介绍 Java中允许同一个类,多个同名方法的存在,但要求形参列表不一致! 如 System.out.println(); out是PrintStream类型 重载的好处 减轻了起名的麻烦减轻了记名的麻烦 2.重载的快速入…...
PostgreSQL有类似oracle的move表吗
PostgreSQL有类似oracle的move表吗 PostgreSQL 提供了类似 Oracle MOVE 表功能的重组操作,但实现方式和具体命令有所不同。以下是详细对比和 PostgreSQL 中的实现方案: 一 Oracle MOVE 与 PostgreSQL 对比 特性Oracle MOVEPostgreSQL 等效操作主要用途…...
AUTO-RAG: AUTONOMOUS RETRIEVAL-AUGMENTED GENERATION FOR LARGE LANGUAGE MODELS
Auto-RAG:用于大型语言模型的自主检索增强生成 单位:中科院计算所 代码: https://github.com/ictnlp/Auto-RAG 拟解决问题:通过手动构建规则或者few-shot prompting产生的额外推理开销。 贡献:提出一种以LLM决策为中…...
ABC-CNN-GRU-Attention、CNN-GRU-Attention、ABC-CNN-GRU和CNN-GRU四类对比模型多变量时序预测
人工蜂群算法四模型对比!ABC-CNN-GRU-Attention系列四模型多变量时序预测 目录 人工蜂群算法四模型对比!ABC-CNN-GRU-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 本研究针对多变量时间序列预测任务…...
ssh 免密登录服务器(vscode +ssh 免密登录)
每次打开vscode连接服务器都需要输入密码,特别繁琐。 然后自己在网上翻阅了一下教程,发现说的内容比较啰嗦,而且个人感觉非常有误导性倾向。 因此自己直接干脆写一个简便易懂的教程算了。 (以经过本人亲测,真实可靠&am…...
Elasticsearch 系列专题 - 第七篇:实战项目
理论学习固然重要,但实战才能真正巩固知识。本篇将通过两个项目,带你从需求分析到实现,体验 Elasticsearch 在真实场景中的应用。 1. 项目一:日志分析系统 1.1 需求分析与架构设计 需求: 实时采集服务器日志。按时间和日志级别(INFO、ERROR)分析。可视化错误趋势。架构…...
C++初阶-类和对象(上)
本章内容相对于之后的类和对象中和下都比较简单,但是整体还是有些难度的。 目录 1.类的定义 1.1类定义格式 1.2访问限定符 1.3类域 2.实例化 2.1实例化概念 2.2对象大小 3.this指针 4.练习 4.1选择题1 4.2选择题2 5.总结 1.类的定义 1.1类定义格式 &am…...
(十九)安卓开发中的Application类的使用详解
在 Android 开发中,Application 类是一个全局的单例类,代表应用进程本身。它常用于初始化全局资源、维护应用级别的状态和注册全局生命周期回调。以下是详细讲解和代码示例: 一、自定义 Application 类 1. 创建子类 public class MyApplica…...
算法思想之位运算(一)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之位运算(一) 发布时间:2025.4.12 隶属专栏:算法 目录 滑动窗口算法介绍六大基础位运算符常用模板总结 例题位1的个数题目链接题目描述算法思路代码实现 比特位计数题目链接题目描述…...
十八、TCP多线程、多进程并发服务器
1、TCP多线程并发服务器 服务端: #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h>…...
『生成内容溯源系统』详解
生成内容溯源系统详解 1. 定义与核心目标 生成内容溯源系统(Generative Content Provenance System)是指能够追踪AI生成内容的来源、生成过程、版权归属及修改历史的技术体系。其核心目标是: 验证真实性:证明内容由特定AI模型生…...
mac 解压 nsz 文件
nsz 地址 下载 nsz PIP 套餐 使用以下命令安装仅限 Console 的版本: pip3 install --upgrade nsz使用以下命令安装 GUI 版本: pip3 install --upgrade nsz[gui]解压 nsz 文件 nsz -D 文件路径...
Python进阶(3):函数(接上篇)
上一篇我们初步介绍python中函数的定义与调用 Python进阶(2):函数-CSDN博客 这里继续: 关键字参数: 形参1实参1,形参2实参2,...... 关键字参数是指使用形式参数的名字来确定输入的参数值。通过该方式指定实际参数时,不再需要与形式参数的位置完全一致。只要将参数名写正确…...
卒/兵过河前的判断和走法触发器优化
兵(卒):兵(卒)在未过河前,只能向前一步步走,过河以后,除不能后退外,允许左右移动,但也只能一次一步。 迷你世界地图已上传 优化...
生物信息Rust-01
前言-为什么想学Rust? 一直想多学一门编译语言,主要有几个原因吧(1. 看到一位老师实验室要求需要掌握一门编译语言;2. 自己享想试着开发一些实用的生信工具,感觉自己现在相比于数据分析,探索生物学层面的意…...
基于HTML + jQuery + Bootstrap 4实现(Web)地铁票价信息生成系统
地铁票价信息表生成系统 1. 需求分析 1.1 背景 地铁已经成为大多数人出行的首选,北京地铁有多条运营线路, 截至 2019 年 12 月,北京市轨道交通路网运营线路达 23 条、总里程 699.3 公里、车站 405 座。2019 年,北京地铁年乘客量达到 45.3 亿人次,日均客流为 1241.1 万人次…...
智慧水务项目(八)基于Django 5.1 版本PyScada详细安装实战
一、说明 PyScada,一个基于Python和Django框架的开源SCADA(数据采集与监视控制系统)系统,采用HTML5技术打造人机界面(HMI)。它兼容多种工业协议,如Modbus TCP/IP、RTU、ASCII等,并具…...
DeepSeek在消防救援领域的应用解决方案
DeepSeek在消防救援领域的应用解决方案 一、火灾风险动态感知与早期预警 火灾风险动态感知与早期预警是智慧消防的关键环节,DeepSeek通过多模态数据分析,融合烟雾传感器、热成像摄像头和气体浓度检测等数据,能够识别传统阈值法难以捕捉的火…...
VSCode CMake调试CPP程序
文章目录 1 安装C与CMake插件2 配置CMakeLists.txt3 使用CMake编译调试3.1 编译3.2 调试 4 自定义构建调试参考 1 安装C与CMake插件 C插件 CMake插件 2 配置CMakeLists.txt 编写测试程序 #include<iostream>int main(int argc, char const *argv[]) {int a 1, b 2;i…...
AI Agent工程师认证-学习笔记(3)——【多Agent】MetaGPT
学习链接:【多Agent】MetaGPT学习教程 源代码链接(觉得很好,star一下):GitHub - 基于MetaGPT的多智能体入门与开发教程 MetaGPT链接:GitHub - MetaGPT 前期准备 1、获取MetaGPT (1ÿ…...
Spring AI 结构化输出详解
一、Spring AI 结构化输出的定义与核心概念 Spring AI 提供了一种强大的功能,允许开发者将大型语言模型(LLM)的输出从字符串转换为结构化格式,如 JSON、XML 或 Java 对象。这种结构化输出能力对于依赖可靠解析输出值的下游应用程…...
AMGCL库使用示例
AMGCL库使用示例 AMGCL是一个用于解决大规模稀疏线性方程组的C库,它实现了代数多重网格(AMG)预处理器和Krylov子空间迭代求解器。下面是一些AMGCL的使用示例。 基本示例:求解稀疏线性系统 #include <iostream> #include <vector> #includ…...
关于 Java 预先编译(AOT)技术的详细说明,涵盖 GraalVM 的配置、Spring Boot 3.x 的集成、使用示例及优缺点对比
以下是关于 Java 预先编译(AOT)技术的详细说明,涵盖 GraalVM 的配置、Spring Boot 3.x 的集成、使用示例及优缺点对比: 1. 预先编译(AOT)技术详解 1.1 核心概念 AOT(Ahead-of-Time)…...
Video Encoder:多模态大模型如何看懂视频
写在前面 大型语言模型(LLM)已经掌握了理解文本的超能力,而多模态大模型(MLLM)则更进一步,让 AI 拥有了“看懂”图像的眼睛。但这还不够!真实世界是动态的、流动的,充满了运动、变化和声音。视频,正是承载这一切动态信息的关键媒介。 让 LLM 看懂视频,意味着 AI 需…...
leetcode0622. 设计循环队列-medium
1 题目:设计循环队列 官方标定难度:中 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一…...
专题十四:动态路由——OSPF
一、OSPF简介 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol),采用DIjkstra算法,协议号是89。用于自治系统(A…...
【蓝桥杯】第十六届蓝桥杯 JAVA B组记录
试题 A: 逃离高塔 很简单,签到题,但是需要注意精度,用int会有溢出风险 答案:202 package lanqiao.t1;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…...
一个项目的架构演进
1,单体架构 垂直升级:4核16GB -> 8核64G 水平扩展:一台服务器扩展成多台 存在以下几个问题 1,提升的性能是有限的 2,更新,维护成本非常高,对于系统中要修改或增加的功能,整个发…...
创建虚拟环境无法加载到pycharm当conda环境,只能为python环境
conda create -n myenv python3.8 然后,在pycharm中,点击 ..." 按钮并浏览到您的 Conda 环境路径。通常,Conda 环境路径位于 ~/.conda/envs/<Your Environment Name> 或 ~/miniconda3/envs/<Your Environment Name> 或 ~/an…...
暴雨打造智能化时代源动力
当清晨的智能管家为您调节室温、日间数字员工自动生成会议纪要、深夜AI外教仍在纠正发音……这不是科幻片,2025年的世界正被智能体悄然重塑。这些能听会想的数智化助理,正在医疗会诊、工业质检、金融风控等多个领域创造着价值。 那么,智能体…...
【ROS2】行为树:BehaviorTree
1、简介 与状态机不同,行为树强调执行动作,而不是状态之间的转换。 行为树是可组合的。可以重复使用简单的行为来构建复杂的行为。 在游戏领域,行为树已经比较流行了。主要用于维护游戏角色的各种动作和状态。 ROS2的导航框架Navigation2中引入了行为树来组织机器人的工作流…...
【HTTP】:应用层协议HTTP(1)
1.HTTP协议 虽然我们说,应用层协议是我们程序猿自己定的.但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用.HTTP(超文本传输协议)就是其中之一。 在互联网世界中,HTTP(HyperTextTransfer Protocol,超文本…...
Boost Graph Library (BGL) 介绍与使用示例
Boost Graph Library (BGL) 介绍与使用示例 Boost Graph Library (BGL) 是 Boost 库中用于图论计算的模块,提供了处理图数据结构的通用接口和多种图算法实现。 BGL 主要特性 提供多种图表示方式:邻接表、邻接矩阵等包含常用图算法:DFS、BF…...
数据结构--线性表
单链表的基本操作 1.清空单链表 链表仍然存在,但链表中无元素,成为空链表(头指针和头链表仍存在)算法思路:依次释放所有结点,并将头结点指针设置为空 2.返回表长 3.取值–取单链表中第i个元素 因为存储…...
电商用户购物行为分析:基于K-Means聚类与分类验证的完整流程
随着电商行业的快速发展,用户行为分析成为企业优化营销策略、提升用户体验的重要手段。通过分析用户的购物行为数据,企业可以挖掘出用户群体的消费特征和行为模式,从而制定更加精准的营销策略。本文将详细介绍一个基于Python实现的电商用户购物行为分析系统,涵盖数据预处理…...
《车辆人机工程-汽车驾驶显示装置》实验报告
汽思考题 汽车显示装置有哪些? 汽车显示装置是车辆与驾驶员、乘客交互的重要界面,主要用于信息展示、功能控制和安全辅助。以下是常见的汽车显示装置分类及具体类型: 一、驾驶舱核心显示装置 1. 仪表盘(Instrument Cluster&am…...
三维点云投影二维图像的原理及实现
转自个人博客:三维点云投影二维图像的原理及实现 1. 概述 1.1 原理概述 三维点云模型是由深度相机采集深度信息和RGB信息进行生成的,深度相机能直接获取到深度图和二维RGB图像,也就是说利用相机原本的关系就可以把深度信息投影回二维图像&a…...
使用Golang打包jar应用
文章目录 背景Go 的 go:embed 功能介绍与打包 JAR 文件示例1. go:embed 基础介绍基本特性基本语法 2. 嵌入 JAR 文件示例项目结构代码实现 3. 高级用法:嵌入多个文件或目录4. 使用注意事项5. 实际应用场景6. 完整示例:运行嵌入的JAR 背景 想把自己的一个…...
MySQL数据过滤、转换与标准化
数据处理是数据库操作的重要组成部分,尤其是在大量数据中查找、转换和规范化目标信息的过程中。为了确保数据的有效性与一致性,MySQL提供了一系列数据过滤、转换与标准化的功能。 本教程将深入探讨数据过滤和转换的基本方法及应用,内容涵盖数…...
Linux中安装sentinel
拉取镜像 #我默认拉取最新的 sentinel 镜像 docker pull bladex/sentinel-dashboard 创建容器 docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard 检查是否成功 docker ps 浏览器访问 默认账号密码是 sentinel/sentinel 成功了 开放sentinel端口或者关…...
大模型压缩训练(知识蒸馏)
AI的计算结果不是一个数值,而是一个趋势 一、模型压缩简介 1、深度学习(Deep Learning)因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、优化加速、异构计算等方法突破瓶颈。 …...
Matlab绘制函数方程图形
Matlab绘制函数方程图形: 多项式计算: polyval 函数 Values of Polynomials: polyval ( ) 绘制方程式图形: 代码如下: >> a[9,-5,3,7]; x-2:0.01:5; fpolyval(a,x); plot(x,f,LineWidth,2); xlabel(x); ylabel(f(x))…...
dify windos,linux下载安装部署,提供百度云盘地址
dify下载安装 dify1.0.1 windos安装包百度云盘地址 通过网盘分享的文件:dify-1.0.1.zip 链接: 百度网盘 请输入提取码 提取码: 1234 dify安装包 linux安装包百度云盘地址 通过网盘分享的文件:dify-1.0.1.tar.gz 链接: 百度网盘 请输入提取码 提取码…...