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

来一个复古的技术FTP

背景

       10年前的老代码,需要升级springboot框架,在升级过程中,测试业务流程里,有FTP的下载业务,不管测试环境如何测试,都没有成功,最后只能自己搭建一个FTP服务器,写一个ftp-demo来测试。记录一下过程,防止后续使用的时候在来一次。

CentOS7安装FTP

步骤1:安装 vsftpd

# 更新系统软件包
sudo yum update -y# 安装 vsftpd
sudo yum install vsftpd -y

步骤2:启动服务并设置开机自启

# 启动 vsftpd 服务
sudo systemctl start vsftpd# 设置开机自启
sudo systemctl enable vsftpd# 检查服务状态
sudo systemctl status vsftpd# 停止服务
sudo systemctl stop vsftpd# 重启服务
sudo systemctl restart vsftpd

步骤3:配置防火墙

# 开放FTP端口(21和被动模式端口范围)
sudo firewall-cmd --zone=public --add-port=21/tcp --permanent
sudo firewall-cmd --zone=public --add-port=30000-31000/tcp --permanent
sudo firewall-cmd --zone=public --add-service=ftp --permanent# 重新加载防火墙规则
sudo firewall-cmd --reload

步骤4:配置 vsftpd

cd /etc/vsftpd/cp vsftpd.conf vsftpd.conf_default
修改下列参数的值
anonymous_enable=NO          #禁止匿名登录FTP服务器
local_enable=YES             #允许本地用户登录FTP服务器
listen=YES                   #监听IPv4 sockets
#listen_ipv6=YES             #关闭监听IPv6 sockets或者改为NO
chroot_local_user=YES        #全部用户被限制在主目录
chroot_list_enable=YES       #启用例外用户名单
chroot_list_file=/etc/vsftpd/chroot_list  #指定例外用户列表文件,列表中用户不被锁定在主目录
allow_writeable_chroot=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
以上配置可以直接用下面命令进行替换修改(一句一句执行)
sed -i 's/anonymous_enable=YES/anonymous_enable=NO/' /etc/vsftpd/vsftpd.conf
sed -i 's/listen=NO/listen=YES/' /etc/vsftpd/vsftpd.conf
sed -i 's/listen_ipv6=YES/listen_ipv6=NO/' /etc/vsftpd/vsftpd.conf
sed -i 's/#chroot_local_user=YES/chroot_local_user=YES/' /etc/vsftpd/vsftpd.conf
sed -i 's/#chroot_list_enable=YES/chroot_list_enable=YES/' /etc/vsftpd/vsftpd.conf
sed -i 's/#chroot_list_file=/chroot_list_file=/' /etc/vsftpd/vsftpd.conf
echo "allow_writeable_chroot=YES" >> /etc/vsftpd/vsftpd.conf
# 被动模式
echo "pasv_enable=YES">> /etc/vsftpd/vsftpd.conf
echo "pasv_min_port=30001">> /etc/vsftpd/vsftpd.conf
echo "pasv_max_port=30010">> /etc/vsftpd/vsftpd.conf

 步骤5:创建FTP用户

# 创建用户(例如用户名为 ftpuser,目录为 /home/ftpuser)
sudo useradd -m -d /home/ftpuser -s /sbin/nologin ftpuser# 设置用户密码
sudo passwd ftpuser# 确保用户目录权限正确
sudo chmod -R 750 /home/ftpuser
sudo chown -R ftpuser: /home/ftpuser例如:
sudo useradd -m -d /home/douzi -s /sbin/nologin douzi
sudo passwd 123456
sudo chmod -R 750 /home/douzi
sudo chown -R douzi: /home/douzi

步骤6:重启vsftpd服务

# 启动 vsftpd 服务
sudo systemctl restart vsftpd

步骤7:客户端登录测试

ftp localhost
问题1:ftp客户端未安装

解决办法:
sudo yum install ftp
问题2:登录失败

找的截图,不要纠结里边的命令,只看红框部分即可

 解决办法:
vi /etc/pam.d/vsftpd# 注释以下一行
#auth       required    pam_shells.so

重启vsftpd服务,再进行登录提示:

再手动在/etc/vsftpd/目录下创建一下chroot_list文件即可

cd /etc/vsftpd/touch /etc/vsftpd/chroot_list

 然后重启vsftpd服务,登录即可正常:

登陆后默认为二进制传输模式

扩展FTP客户端命令:

dir ls cd pwd lcd(切换工作目录)  mkdir rmdir get mget(下载多个文件) put mput(上传多个文件) rename delete mdelete(删除多个ftp文件) rmdir ascii,bin(切换传输模式) close(关闭链接) open(重连ftp) quit

扩展防火墙命令:

一、防火墙的开启、关闭、禁用命令
设置开机启用防火墙:systemctl enable firewalld
设置开机禁用防火墙:systemctl disable firewalld
启动防火墙:       systemctl start firewalld
关闭防火墙:       systemctl stop firewalld 或 systemctl stop firewalld.service
检查防火墙状态     systemctl status firewalld二、使用firewall-cmd配置端口
查看防火墙状态: firewall-cmd --state
重新加载配置:   firewall-cmd --reload
查看开放的端口: firewall-cmd --list-ports
开启防火墙端口: firewall-cmd --zone=public --add-port=9200/tcp --permanent

扩展FTP配置项说明:

1. 基础访问控制
配置项默认值说明
anonymous_enableNO是否允许匿名登录(YES/NO
local_enableYES是否允许本地用户登录(YES/NO
write_enableYES是否允许写入操作(上传/删除/重命名)
2. 权限与安全
配置项默认值说明
local_umask022本地用户创建文件的权限掩码(022表示文件权限为644,目录为755
chroot_local_userNO是否将本地用户限制在其主目录(需配合allow_writeable_chroot=YES使用)
allow_writeable_chrootNO允许被chroot的用户目录可写(需chroot_local_user=YES
3. 连接与日志
配置项默认值说明
dirmessage_enableYES显示目录欢迎消息(消息文件默认为.message
xferlog_enableYES启用传输日志(记录上传/下载)
xferlog_file/var/log/vsftpd.log指定日志文件路径
xferlog_std_formatYES使用标准FTP日志格式(兼容wu-ftp格式)
connect_from_port_20YES主动模式时,强制数据连接从端口20发起
4. 超时设置
配置项默认值说明
idle_session_timeout600空闲会话超时时间(秒)
data_connection_timeout120数据连接超时时间(秒)
5. 被动模式(PASV)配置
配置项默认值说明
pasv_enableYES启用被动模式
pasv_min_port-被动模式端口范围下限(如30000
pasv_max_port-被动模式端口范围上限(如31000
pasv_address-服务器公网IP(NAT环境下需指定)
6. 高级选项
配置项默认值说明
listenNO以独立模式运行(YES=IPv4,NO=通过xinetd启动)
listen_ipv6NO启用IPv6监听
tcp_wrappersYES使用TCP Wrappers进行主机访问控制
userlist_enableNO启用用户列表控制(userlist_file指定文件)
userlist_denyYES用户列表中的用户是否被拒绝(YES=黑名单,NO=白名单)

FTP-DEMO Springboot3代码

maven需要引用的包:

    ......<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.5</version><relativePath /> <!-- lookup parent from repository --></parent>    ......<properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.35</version></dependency><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.11.1</version></dependency><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>......

配置文件:

ftp:# 服务器地址host: 192.168.1.56# 端口号port: 21# 用户名userName: douzi# 密码password: 123456

代码部分:

package com.wd.ftp.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;/*** ftp配置*/
@Configuration
public class FtpConfig {/*** 服务器地址*/private static String host;/*** 端口*/private static Integer port;/*** 用户名*/private static String userName;/*** 密码*/private static String password;@Value("${ftp.host}")public void setHost(String host) {FtpConfig.host = host;}public static String getHost() {return host;}@Value("${ftp.port}")public void setPort(Integer port) {FtpConfig.port = port;}public static Integer getPort() {return port;}@Value("${ftp.userName}")public void setUserName(String userName) {FtpConfig.userName = userName;}public static String getUserName() {return userName;}@Value("${ftp.password}")public void setPassword(String password) {FtpConfig.password = password;}public static String getPassword() {return password;}
}
package com.wd.ftp.util;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.commons.net.ftp.FTPFile;import com.wd.ftp.config.FtpConfig;import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.ftp.Ftp;
import cn.hutool.extra.ftp.FtpMode;
import lombok.extern.slf4j.Slf4j;/*** FTP服务工具类*/
@Slf4j
public class FtpUtil {/*** 获取 FTPClient对象*/private static Ftp getFTPClient() {try {if(StrUtil.isBlank(FtpConfig.getHost()) || FtpConfig.getPort() == null|| StrUtil.isBlank(FtpConfig.getUserName()) || StrUtil.isBlank(FtpConfig.getPassword())) {throw new RuntimeException("ftp配置信息不能为空");}Ftp ftp = new Ftp(FtpConfig.getHost(),FtpConfig.getPort(),FtpConfig.getUserName(),FtpConfig.getPassword());//设置为被动模式,防止防火墙拦截ftp.setMode(FtpMode.Passive);return ftp;} catch (Exception e) {e.printStackTrace();log.error("获取ftp客户端异常",e);throw new RuntimeException("获取ftp客户端异常:"+e.getMessage());}}/*** 下载ftp服务器上的文件到本地* @param remoteFile    ftp上的文件路径* @param localFile     输出的目录,使用服务端的文件名*/public static void download(String remoteFile, String localPath) {if(StrUtil.isBlank(remoteFile) || StrUtil.isBlank(localPath)) {return;}Ftp ftp = getFTPClient();try {if(!FileUtil.exist(localPath)){FileUtil.mkdir(localPath);}    File lFile = FileUtil.file(localPath);ftp.download(remoteFile, lFile);} catch (Exception e) {e.printStackTrace();log.error("FTP文件下载异常",e);} finally {//关闭连接try {if(ftp != null)  ftp.close();} catch (IOException e) {throw new RuntimeException(e);}}}/*** 本地文件上传到ftp服务器上* @param remoteDir 上传的ftp目录* @param remoteFileName  保存到ftp服务器上的名称* @param localFile 本地文件全名称*/public static boolean upload(String remoteDir, String remoteFileName, String localFile) {if(StrUtil.isBlank(remoteDir) || StrUtil.isBlank(remoteFileName) || StrUtil.isBlank(localFile)) {return false;}Ftp ftp = getFTPClient();try {File lFile = FileUtil.file(localFile);if(!lFile.exists()) {log.error("本地文件不存在");return false;}if(StrUtil.isBlank(remoteFileName)) {return ftp.upload(remoteDir, lFile);} else {return ftp.upload(remoteDir, remoteFileName, lFile);}} catch (Exception e) {e.printStackTrace();log.error("文件上传FTP异常",e);return false;} finally {//关闭连接try {if(ftp != null)  ftp.close();} catch (IOException e) {throw new RuntimeException(e);}}}/*** 删除FTP服务器中的文件* @param remoteFile    ftp上的文件路径*/public static boolean delFile(String remoteFile) {if(StrUtil.isBlank(remoteFile)) {return false;}Ftp ftp = getFTPClient();try {return ftp.delFile(remoteFile);} catch (Exception e) {e.printStackTrace();log.error("删除FTP服务器中的文件异常",e);return false;} finally {//关闭连接try {if(ftp != null)  ftp.close();} catch (IOException e) {throw new RuntimeException(e);}}}/*** 遍历某个目录下所有文件,不会递归遍历* @param path    目录*/public static List<String> listFile(String path) {List<String> listFile = new ArrayList<>();Ftp ftp = getFTPClient();try {FTPFile[] ftpFiles = ftp.lsFiles(path);for (int i = 0; i < ftpFiles.length; i++) {FTPFile ftpFile = ftpFiles[i];if(ftpFile.isFile()){listFile.add(ftpFile.getName());}}return listFile;} catch (Exception e) {e.printStackTrace();log.error("遍历某个目录下所有文件异常",e);return null;} finally {//关闭连接try {if(ftp != null)  ftp.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}
package com.wd.ftp.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import com.wd.ftp.util.FtpUtil;
import com.wd.ftp.util.SftpUtil;import jakarta.servlet.http.HttpServletRequest;@RestController
public class FtpController {/*** 下载ftp服务器上的文件到本地* @param rf    ftp上的文件路径* @param lp     输出的目录,使用服务端的文件名*/@GetMapping("/download")public String download(@RequestParam(required = false, defaultValue = "1.xml") String rf, @RequestParam(required = false, defaultValue = "/ftp/download/") String lp) {FtpUtil.download(rf, lp);return "success";}}

可以根据FtpUtil扩展SftpUtil的代码,从而支持Sftp模式。

执行效果:

随便造一个1.xml上传ftp

cd /home/douzi 然后查看内容

 

浏览器执行

http://localhost:8080/download

windows下,代码在哪个盘执行,就会生成在哪个盘。

下载成功!其他上传,删除等功能自行试验。

打完收工。

相关文章:

来一个复古的技术FTP

背景 10年前的老代码&#xff0c;需要升级springboot框架&#xff0c;在升级过程中&#xff0c;测试业务流程里&#xff0c;有FTP的下载业务&#xff0c;不管测试环境如何测试&#xff0c;都没有成功&#xff0c;最后只能自己搭建一个FTP服务器&#xff0c;写一个ftp-demo来测试…...

ShardingSphere:查询报错:Actual table `数据源名称.表名` is not in table rule configuration

目录 简介异常信息排查原因解决 简介 1、使用ShardingSphere框架&#xff0c;版本为5.2.1 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.2.1</version>…...

内部检测实验室数字化转型新路径 质检LIMS系统如何实现合规、效率、资质三重突破?

在高质量发展成为主旋律的今天&#xff0c;内部检测实验室作为企业质量管控的 “心脏”&#xff0c;正面临着合规标准升级、检测任务激增、设备管理复杂等多重挑战。传统管理模式下&#xff0c;数据追溯难、人员效率低、资质评审周期长等问题&#xff0c;成为制约实验室发展的核…...

PyTorch 的 F.scaled_dot_product_attention 返回Nan

“为什么 PyTorch 的 scaled_dot_product_attention 会输出 NaN&#xff1f;如何正确构造 Attention Mask” 引言&#xff1a;看似正常的 mask&#xff0c;为什么会引发 NaN&#xff1f; 在使用 F.scaled_dot_product_attention 构建跨模态或多源注意力时&#xff0c;我们常通…...

MySQL的触发器

本章了解一下即可&#xff0c;并不是很难&#xff0c;大家加油&#xff01;&#xff01;&#xff01; 触发器实际上是多表关联的一个操作&#xff0c;无需调用&#xff0c;是一个自动的过程&#xff0c;当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行&#xff0…...

高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案

引言&#xff1a;消息队列的“不可替代性” 在微服务架构和分布式系统盛行的今天&#xff0c;消息队列&#xff08;Message Queue&#xff09; 已成为解决系统解耦、流量削峰、异步处理等难题的核心组件。然而&#xff0c;传统的自建消息队列&#xff08;如RabbitMQ、Kafka&am…...

内存泄漏系列专题分析之十六:高通相机CamX内存泄漏内存占用分析--chi-cdk部分ION内存拆解方法

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之十五:高通相机CamX架构chi-cdk部分ION内存管理机制CHI ImageBuffer原理 这一篇我们开始讲: 内存泄漏系列专题分析之十六:高通相机CamX内存泄漏&内存占用分析--chi-cdk部分…...

HANA数据库死锁

死锁是两个或多个事务相互交叉锁定的情况&#xff0c;因此任何事务都无法继续进行。 通常死锁是由应用程序设计缺陷引起的&#xff0c;但在主键约束的上下文中也可能存在更多的技术死锁&#xff08;这种情况请参考 SAP note 2429521&#xff09;。 当 HANA 数据库出现死锁时&am…...

Unity雷火UX工具插件中的本地化功能(Unity项目中文字图片多语言功能)

一、插件下载地址如下: 雷火UX工具插件下载 二、本地化功能,也就是多语言功能官方文档地址如下: 雷火UX工具本地化功能官方文档 三、UX Image组件需要注意的事项,也就是官方文档没有提到的地方。 1、UX Image组件所引用的Source Image资...

公路水运安全员B证主要考核内容有哪些

公路水运安全员B证&#xff08;交安B证&#xff09;是交通运输行业施工企业主要负责人和项目负责人必备的安全生产考核证书&#xff0c;主要考核以下内容&#xff1a; 一、安全生产法律法规&#xff08;30%&#xff09; 国家法律法规&#xff1a;重点考核《安全生产法》《建设…...

电缆故障常见故障及应对方法

一、常见故障类型及原因 1. 机械损伤 原因&#xff1a;安装时的过度牵引或弯曲、外力破坏&#xff08;如施工挖损、车辆振动&#xff09;、自然因素&#xff08;如土地沉降导致电缆拉伸&#xff09;等。 表现&#xff1a;绝缘层破损、金属护套裂损&#xff0c;可能发展为短…...

Rust 数据结构:String

Rust 数据结构&#xff1a;String Rust 数据结构&#xff1a;String什么是字符串&#xff1f;创建新字符串更新字符串将 push_str 和 push 附加到 String 对象后使用 运算符和 format! 宏 索引到字符串字符串在内存中的表示字节、标量值和字形簇 分割字符串遍历字符串的方法 R…...

算法基础 -- 小根堆构建的两种方式:上浮法与下沉法

小根堆构建的两种方式&#xff1a;上浮法与下沉法 在构建小根堆&#xff08;Min-Heap&#xff09;时&#xff0c;通常有两种常见的构建方式&#xff1a; 上浮建堆&#xff08;逐个插入&#xff0c;上浮调整&#xff09;下沉建堆&#xff08;Heapify 自底向上&#xff0c;下沉…...

Sprnig MVC 如何统一异常处理 (Exception Handling)?

主要有以下几种方式来实现统一异常处理&#xff0c;其中 ControllerAdvice (或 RestControllerAdvice) 结合 ExceptionHandler 是最常用的方式。 1. ExceptionHandler 注解 作用&#xff1a; 用于标记一个方法&#xff0c;该方法将处理在同一个 Controller 类中抛出的特定类型…...

03、基础入门-SpringBoot的大时代背景

03、基础入门-SpringBoot的大时代背景 # Spring Boot的大时代背景 Spring Boot的出现和发展&#xff0c;与以下时代背景密切相关&#xff1a; ## 1. 微服务架构的兴起 ### 背景 随着互联网应用的复杂度增加&#xff0c;传统的单体架构在扩展性、维护性和团队协作方面遇到瓶…...

【51单片机中断】

目录 配置流程 1.在IE寄存器中开启总中断通道和需要的某中断通道 2.在TCON寄存器开启所用中断的触发方式 3.使用中断函数完成中断 4.若需要中断嵌套则在IP寄存器中配置 5.若需要使用串口的中断&#xff0c;则配置SCON寄存器 6.代码示例 配置流程 1.在IE寄存器中开启总中…...

英飞凌tle9954 GPIO

9 通用输入输出(GPIO) 9.1 功能概述 通用输入 / 输出(GPIO)由输入 / 输出驱动级和端口控制逻辑组成。GPIO 具备以下功能: 输入 / 输出端口功能(PBx) 输出状态可编程,输入状态可读。输出驱动器可编程为推挽、开漏和三态模式。输出驱动器的驱动强度和转换速率(压摆率)可…...

Linux操作系统--进程间通信(system V共享内存)

目录 1.system V共享内存 2.共享内存数据结构 3.共享内存函数 4.实例代码&#xff1a; 1.system V共享内存 共享内存区是最快的IPC(进程间通信)形式。一旦这样的内存映射到共享它的进程地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再…...

力扣HOT100之二叉树:102. 二叉树的层序遍历

这道题太简单了&#xff0c;相当于基础的模板题&#xff0c;但凡涉及到层序遍历一定会用到队列来实现&#xff0c;其他的倒没啥好说的&#xff0c;用两层while循环来层序遍历&#xff0c;外层while循环用于控制访问二叉树的每一层&#xff0c;而内层while循环则负责收割每一层的…...

分布式锁: Redisson 实现分布式锁的原理与技术细节

在分布式系统中&#xff0c;分布式锁是协调多个节点对共享资源访问的核心机制之一。Redis 作为高性能内存数据库&#xff0c;常被用于实现分布式锁&#xff0c;而 Redisson 是 Java 生态中最成熟、功能最丰富的 Redis 客户端之一&#xff0c;其内置的分布式锁实现被广泛应用于生…...

day22-数据结构之 栈队列

一、栈 1.1 栈的基本概念 栈是限定仅在表尾进行插入和删除操作的线性表 栈的特性&#xff1a;先进后出、后进先出 栈顶:允许操作的一端栈底:不允许操作的一端 栈的使用分为入栈&#xff0c;出栈栈分为顺序栈和链式栈 1.2 栈的基本操作 链栈示意图&#xff1a;最好采取头插和头…...

Oracle 批量操作脚本解析:动态执行与分批次删除

一、脚本功能概述 本文分享两段 Oracle PL/SQL 脚本&#xff0c;分别实现动态 SQL 执行和大表分批次删除功能&#xff0c;适用于数据清洗、批量操作优化等场景。通过实际案例演示语法逻辑与使用场景。 二、脚本一&#xff1a;动态 SQL 执行与数据清理 1. 核心逻辑 从临时表t…...

我用 CodeBuddy 开发了一个颜色命名搜索器 —— ColorNameHub 的诞生记

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在一次整理设计稿配色时&#xff0c;我突然萌生了一个想法&#xff1a;“如果能输入一个颜色代码&#xff0c;就…...

强化学习算法实战:一个例子实现sarsa、dqn、ddqn、qac、a2c、trpo、ppo

简介 在学习强化学习算法&#xff1a;sarsa、dqn、ddqn、qac、a2c、trpo、ppo时&#xff0c;由于有大量数据公式的推导&#xff0c;觉得十分晦涩&#xff0c;且听过就忘记了。 但是当把算法应用于实战时&#xff0c;代码的实现要比数据推导要直观很多。 接下来通过不同的算法实…...

零基础玩转Apache Superset可视化部署

根据官方Quick Start Guide&#xff0c;你可以按照以下步骤进行部署&#xff1a; 1. 确认环境2. 获取代码3. 获取官方最新代码4. 启动服务5. 访问Superset Web界面6. 接入数据源 前提条件&#xff1a; dockerdocker compose 1. 确认环境 安装Docker和Docker Compose 确保你…...

单片机-STM32部分:18、WiFi模组

飞书文档https://x509p6c8to.feishu.cn/wiki/WFmqwImDViDUezkF7ercZuNDnve 一、WiFi模组应用 当设备需要连接网络&#xff0c;实现远程控制&#xff0c;状态监控时&#xff0c;就需要添加通信模组&#xff0c;常见的通信模组WiFi模组、2G模组、4G模组等&#xff1a; 我们的板卡…...

TLS 1.3黑魔法:从协议破解到极致性能调优

一、TLS协议逆向工程实验 1.1 密码学套件破解剧场 实验准备&#xff1a; 靶机&#xff1a;启用TLS 1.2的Nginx服务器 工具集&#xff1a;Wireshark OpenSSL s_client 定制Python脚本 实战攻击复现&#xff1a; # 强制使用弱加密套件连接 openssl s_client -connect exa…...

职业院校物联网安装调试员(工业数智技术)实训解决方案

一、物联网安装调试员 &#xff08;1&#xff09;职业定义&#xff1a; 利用检测仪器和专用工具&#xff0c;安装、配置、调试物联网产品与设备的人员。其工作任务就是要搭建数据互联的信息网络&#xff0c;并通过电子标签将真实的物体上网连接&#xff0c;并通过对各类设备的…...

mongodb用systemctl启动code=killed, signal=ABRT

参照在 Ubuntu 上安装 MongoDB Community Edition - 数据库手册 v8.0 - MongoDB Docs 安装后&#xff0c;sudo systemctl start mongod启动失败。 sudo systemctl status mongod 结果&#xff1a; mongod.service - MongoDB Database ServerLoaded: loaded (/lib/systemd/sys…...

基于51单片机和8X8点阵屏、矩阵按键的匹对消除类小游戏

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、矩阵按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板&#xff0c;用到板上的8X8LED点阵屏和矩阵按键。 【单片机】STC89C52RC 【频率】12T11.0592MHz 效果查看/操…...

智能呼叫系统中的NLP意图理解:核心技术解析与实战

引言&#xff1a;当AI拿起电话时 在智能客服、电话营销等场景中&#xff0c;智能呼叫系统正以每年23%的增长率重塑人机交互方式。而支撑这一变革的核心技术&#xff0c;正是自然语言处理&#xff08;NLP&#xff09;中的意图理解模块。本文将深入解析意图理解的技术原理&#…...

信号灯和旋钮在接地电阻柜内的作用主要包括以下几个方面

信号灯的作用‌&#xff1a; ‌指示状态‌&#xff1a;信号灯用于指示接地电阻柜的工作状态&#xff0c;如正常运行、故障报警等。通过不同颜色的灯光&#xff08;如红色表示故障&#xff0c;绿色表示正常&#xff09;来提醒操作人员柜子的当前状态&#xff0c;确保及时处理潜…...

MongoDB 应用实战

1. java 原生客户端 引入maven 1 <dependencies> 2 <dependency> 3 <groupId>org.mongodb</groupId> 4 <artifactId>mongodb‐driver‐sync</artifactId> 5 <version>4.1.1</version> 6 </dependency> 7 </depende…...

Java EE初阶——wait 和 notify

1. 线程饥饿 线程饥饿是指一个或多个线程因长期无法获取所需资源&#xff08;如锁&#xff0c;CPU时间等&#xff09;而持续处于等待状态&#xff0c;导致其任务无法推进的现象。 典型场景 优先级抢占&#xff1a; 在支持线程优先级的系统中&#xff0c;高优先级线程可能持续…...

SpringBoot--Bean管理详解

Bean管理 Bean扫描 回顾spring&#xff1a; 在XML配置文件中&#xff0c;可以借助 <context:component-scan base-package "com.lyc"> 或者注解 ComponentScan(basePackages"com.lyc") 再springboot项目中&#xff0c;既没有标签&#xff0c;也…...

python爬虫实战训练

前言&#xff1a;哇&#xff0c;今天终于能访问豆瓣了&#xff0c;前几天爬太多次了&#xff0c;网页都不让我访问了&#xff08;要登录&#xff09;。 先来个小练习试试手吧&#xff01; 爬取豆瓣第一页&#xff08;多页同上篇文章&#xff09;所有电影的排名、电影名称、星…...

探索大型语言模型(LLM)的开源学习路径:mlabonne/llm-course 深度解析

引言:为什么LLM学习需要系统化课程? 近年来,大型语言模型(Large Language Models, LLMs)彻底改变了自然语言处理领域。从GPT系列到Llama、Mistral等开源模型,掌握LLM的开发和应用能力已成为技术人员的核心竞争力。然而,LLM技术栈涵盖从理论基础到工程实践的复杂内容,如…...

IDEA怎么汉化idea中文改回英文版

第一步:点击左上角的File&#xff0c;然后选择Setting 第二步&#xff1a;Setting页面选择 Appearance & Behavior&#xff0c;然后展开System Settings&#xff0c;然后选择 Language and Region&#xff0c;进行修改 我操作的是2024年的版本 File->Settings -> Ap…...

Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件

目录 1. 创建Flutter项目 1.1使用Android Studio创建Flutter项目 1.2 使用命令行创建Flutter项目 2. Flutter项目介绍 2.1所有代码都在lib目录下编写 2.1 pubspec.yaml 依赖库/图片的引用 ​编辑 3. 运行项目 4. 编写mian.dart文件 4.1 使用MaterialApp 和 Scaffold两个组件…...

C++23 中的 ranges::fold_left:范围折叠算法

文章目录 1. **ranges::fold_left 的基本概念**2. **使用示例**示例 1&#xff1a;计算整数范围的和示例 2&#xff1a;计算字符串范围的连接示例 3&#xff1a;使用自定义函数 3. **与其他折叠算法的比较**4. **为什么需要 ranges::fold_left**5. **总结** 随着 C23 的到来&am…...

Vue2项目created不执行

Vue2项目created不执行 设置唯一值 name在 created 调用方法在 watch 中监听路由完整代码示例 设置唯一值 name 在 Vue 组件中&#xff0c;name 属性用于标识组件。确保每个组件的 name 属性是唯一的&#xff0c;这有助于在调试和开发过程中更好地识别组件。 export default …...

mysql的not exists走索引吗

在MySQL中&#xff0c;​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下是关键点总结&#xff1a; ​索引的作用​&#xff1a; 当子查询的关联字段&#xff08;例如B.a_id&#xff09;存在索引&#xff08;如普通B-tree索引&#xff09;时&…...

红黑树实现

1.红黑树的概念 红黑树是一棵二叉搜索树&#xff0c;他的每个节点增加一个存储位来表示节点的颜色&#xff0c;可以是红丝或者黑色。通过对任何一条从根到叶子的路径上各个节点的颜色进行约束&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;因而是接近平…...

将已打包好的aar文件,上传到 Coding 的 Maven 仓库

将已打包好的aar文件&#xff0c;上传到 Coding 的 Maven 仓库。 在android stuio项目的build.gradle 进行上传。 编写代码 plugins {id maven-publish }// 配置要上传的本地 AAR 文件 def aarFile file(D:\\mylibrary-1.0.0.aar)publishing {publications {mavenAar(MavenP…...

海康相机连接测试-极简版

文章目录 1、下载客户端 1、下载客户端 海康机器人官网下载软件 软件下载地址 先下载客户端测试连接 按照你的相机的类型选择客户端 安装完毕后&#xff0c;确保USB线插的是3.0的端口 软件会自动识别相机型号 在上方有播放按钮&#xff0c;可以采集图像信息显示...

深入探索:Core Web Vitals 进阶优化与新兴指标

一、INP&#xff08;Interaction to Next Paint&#xff09;深度解析 INP 与 FID 的核心差异 • 响应范围&#xff1a;FID仅测量首次输入延迟&#xff0c;而INP跟踪页面生命周期中所有关键交互 • 测量维度&#xff1a;INP综合考虑输入延迟、处理时间和下一帧渲染时间 • 评…...

AI与产品架构设计系列(2):Agent系统的应用架构与落地实

什么是AI Agent&#xff1f;其在架构中的独特定位 AI Agent&#xff08;人工智能代理&#xff09;是一种模拟人类智能行为的自主系统&#xff0c;通常以大型语言模型&#xff08;LLM&#xff09;作为核心引擎。简单来说&#xff0c;Agent能够像人一样感知环境信息、规划行动方…...

OpenAI与微软洽谈新融资及IPO,Instagram因TikTok流失四成用户

OpenAI与微软洽谈新融资及IPO 据悉&#xff0c;OpenAI 正与微软洽谈新融资及筹备 IPO&#xff0c;关键问题是微软在 OpenAI 重组后的股权比例。微软已投资超 130 亿美元&#xff0c;双方修订 2019 年合同&#xff0c;微软拟弃部分股权换新技术访问权。OpenAI 上周放弃了有争议转…...

架构篇、第五章_05Jenkins的部署与构建

Linux_架构篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;Jenkins的部署与构建 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.15 适用环境: Centos7 文档说明 本文档围绕 Jenkins 的部署与构建展开&a…...

`ParameterizedType` 和 `TypeVariable` 的区别

在 Java 的泛型系统中&#xff0c;ParameterizedType 和 TypeVariable 是两个不同的类型表示&#xff0c;它们都属于 java.lang.reflect.Type 接口的子接口。两者都在反射&#xff08;Reflection&#xff09;中用于描述泛型信息&#xff0c;但用途和含义不同。 &#x1f31f; 一…...