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

详解与FTP服务器相关操作

目录

什么是FTP服务器

搭建FTP服务器相关

​编辑

Unity中与FTP相关的类

上传文件到FTP服务器

使用FTP服务器上传文件的关键点

开始上传

从FTP服务器下载文件到客户端

使用FTP下载文件的关键点

开始下载

关于FTP服务器的其他操作

将文件的上传,下载,删除等其他操作使用面向对象的思想用单例模式进行封装

测试FTPMgr模块的功能

什么是FTP服务器

  • 基本概念:FTP 是文件传输协议(File Transfer Protocol)的缩写,FTP 服务器就是遵循该协议,专门用来存储和管理文件,并为用户提供文件上传和下载服务的服务器。用户可以通过 FTP 客户端软件连接到 FTP 服务器,进行文件的传输操作。
  • 功能特点
    • 文件传输:支持文件的上传和下载,用户可以将本地计算机上的文件上传到 FTP 服务器,也可以从 FTP 服务器下载所需的文件到本地。
    • 用户管理:可以设置不同的用户账户,并为每个用户分配不同的权限,如读取、写入、删除等权限,从而实现对文件访问的精细控制。
    • 目录管理:允许创建、删除、重命名目录,以及在目录之间移动文件等操作,方便对文件进行组织和管理。

搭建FTP服务器相关

 #region 知识点一 搭建FTP服务器的几种方式//1.使用别人做好的FTP服务器软件 (学习阶段建议使用)//2.自己编写FTP服务器应用程序,基于FTP的工作原理,用Socket中TCP通信来进行编程(工作后由后端程序员来做) //3.将电脑搭建为FTP文件共享服务器 (工作后由后端程序员来做)//第2,3点我们前端程序主要做了解  //一般在工作中不会由我们来完成这部分工作#endregion   #region 知识点二 使用别人做好的FTP服务器软件来搭建FTP服务器//下载Serv-U等FTP服务器软件   //在想要作为FTP服务器的电脑上运行之  //1.创建域 直接不停下一步即可   //2.使用单向加密  //3.创建用于上传下载的FTP 账号和密码#endregion  #region 总结  //在实际商业项目开发当中,如果需要用FTP来进行文件传输      //那么FTP服务器的解决方案都是由后端程序员来完成的    //不管它使用哪种方式来搭建FTP服务器  //只要能正常上传下载内容并且保证安全性即可#endregion

我们使用Serv-U服务器作为我们的FTP服务器

Unity中与FTP相关的类

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using UnityEngine;public class Lesson18 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){#region 知识点一 NetWorkCredential类//命名空间:System.Net//NetWorkCredential通信凭证类//用于在FTP文件传输时,设置账号密码NetworkCredential n = new NetworkCredential("DamnF", "DamnF123");#endregion#region 知识点二 FtpWebRequest类//命名空间:System.Net//Ftp文件传输协议客户端操作类//主要用于:上传,下载,删除服务器上的文件//重要方法//1.Create 创建新的WebRequest,用于进行相关的Ftp相关操作FtpWebRequest req =FtpWebRequest.Create(new Uri("ftp://127.0.0.1/Test.txt"))as FtpWebRequest;//2.Abort 如果正在进行文件传输,用此方法可以终止文件传输req.Abort();//3.GetRequestStream 获取用于上传的流Stream s= req.GetRequestStream();//4.GetResponse 返回Ftp服务器响应//FtpWebResponse res= req.GetResponse()as FtpWebResponse;//重要成员//1.Credentials 通信凭证,设置为NetWorkCredential对象req.Credentials = n;//2.KeepAlive bool值,当完成请求时是否关闭到Ftp服务器的控制连接(默认为true,不关闭);req.KeepAlive = false;//3.Method 操作命令设置// WebRequestMethods.Ftp类中的操作命令属性// DeleteFile  删除文件// DownloadFile  下载文件// ListDirectory  获取文件简短列表// ListDirectoryDetails  获取文件详细列表// MakeDirectory  创建目录// RemoveDirectory  删除目录// UploadFile  上传文件req.Method = WebRequestMethods.Ftp.DownloadFile;//4.UseBinary 是否使用2进制传输req.UseBinary = true;//5.RenameTo  重命名req.RenameTo = "myTest.txt";#endregion#region 知识点三 FtpWebResponse类//命名空间:System.Net//它是用于封装Ftp服务器对请求的响应//它提供操作状态和从服务器下载数据//我们可以通过FtpWebRequest对象中的GetResponse()方法获取//当使用完毕时,要使用Close释放//通过它真正获取服务器的内容FtpWebResponse res = req.GetResponse() as FtpWebResponse;//重要方法//1.Close:释放所有资源res.Close();//2.GetResponseStream:返回从Ftp下载数据的流Stream stream= res.GetResponseStream();//重要成员//1.ContentLength:接收到数据的长度print(res.ContentLength);//2.ContentType:接收到数据的类型print(res.ContentType);//3.StatusCode:Ftp服务器下发的最新状态码print(res.StatusCode);//4.StatusDescription:Ftp服务器下发的状态代码的文本print(res.StatusDescription);//5.BannerMessage:登录前建立连接时Ftp服务器下发的消息print(res.BannerMessage);//6.ExitMessage:Ftp会话结束时服务器发送的消息print(res.ExitMessage);//7.LastModified:Ftp服务器上的文件的上次修改日期和时间print(res.LastModified);#endregion#region 总结//通过C#提供的3个类//我们就可以完成客户端向Ftp服务器//操作文件的需求,比如//上传,下载,删除文件#endregion }// Update is called once per framevoid Update(){}
}

上传文件到FTP服务器

使用FTP服务器上传文件的关键点

        //1.通信凭证
        //  进行FTP连接时操作时的账号和密码
        //2.操作命令WebRequestMethod.Ftp
        // 设置你想要进行的Ftp操作
        //3.文件流相关FileStream和Stream
        //  上传和下载时都会使用到文件流
        //4.保证ftp服务器已经开启
        // 并且能够正确访问

开始上传

 try{//1.创建一个Ftp连接FtpWebRequest req = FtpWebRequest.Create(new Uri("ftp://127.0.0.1/pic.png")) as FtpWebRequest;//2.设置通信凭证(如果不支持匿名,就必须设置这一步)//将代理相关设置置空 避免服务器同时有http相关服务冲突req.Proxy = null;NetworkCredential n = new NetworkCredential("DamnF", "DamnF123");req.Credentials = n;//请求完毕后,是否关闭控制连接,如果想要关闭,需要设置falsereq.KeepAlive = false;//3.设置操作命令req.Method = WebRequestMethods.Ftp.UploadFile;//设置操作命令为上传文件//4.指定传输类型req.UseBinary = true;//5.得到用于上传的流对象Stream upLoadStream = req.GetRequestStream();//6.开始上传using (FileStream file = File.OpenRead(Application.streamingAssetsPath + "/test.png")){//我们可以一点一点的把这个文件中的字节数组读取出来 然后存到上传流中byte[] bytes = new byte[1024];//返回值是真正从文件中读了多少个字节int contentLength = file.Read(bytes, 0, bytes.Length);//不停的去读取文件中的字节流 除非读完了 不然一直读 并且写入到上传流中while (contentLength != 0){//写入上传流中upLoadStream.Write(bytes, 0, contentLength);//写完了继续读取contentLength = file.Read(bytes, 0, bytes.Length);}//出了循环就证明写完了file.Close();upLoadStream.Close();//上传完毕print("上传完毕");}}catch (Exception e){print("上传失败 出错了" + e.Message);}

从FTP服务器下载文件到客户端

使用FTP下载文件的关键点

        //1.通信凭证
        // 进行FTP文件操作时需要的账号和密码
        //2.操作命令WebRequestMethods.Ftp
        // 设置你想要进行的Ftp操作
        //3.文件流相关的FileStream和Stream
        // 上传和下载时都需要使用的文件流
        // 下载文件流使用FtpWebResponse类获取
        //4.保证Ftp服务器已开启
        // 并且能够正常访问

开始下载

try{//1.创建一个Ftp连接//这里和上传不同,上传的文件名是自己定的 下载的文件名必须是资源服务器里有的FtpWebRequest req = FtpWebRequest.Create(new Uri("ftp://127.0.0.1/文本格式.jpg")) as FtpWebRequest;//2.设置一个通信凭证(如果不支持匿名,就必须设置这一步)//请求完毕后 是否关闭控制连接,如果要进行多次操作 可以设置falseNetworkCredential n = new NetworkCredential("DamnF", "DamnF123");req.Credentials = n;req.KeepAlive = false;//3.设置操作命令req.Method = WebRequestMethods.Ftp.DownloadFile;//4.指定传输类型req.UseBinary = true;req.Proxy = null;//5.得到用于上传的流对象//相当于把请求发送给ftp服务器,就会携带我们想要的信息返回FtpWebResponse res = req.GetResponse()as FtpWebResponse;//这就是下载流Stream DownLoadStream = res.GetResponseStream ();//6.开始上传print(Application.persistentDataPath);using (FileStream file = File.Create(Application.persistentDataPath + "/DamnF112233.jpg")){byte[] bytes = new byte[1024];int contentLength = file.Read(bytes, 0, bytes.Length);while (contentLength != 0){file.Write(bytes, 0, contentLength);contentLength = file.Read(bytes, 0, bytes.Length);}file.Close();DownLoadStream.Close();print("下载完毕");}}catch (Exception e){print("下载出错了" + e.Message);}

关于FTP服务器的其他操作

 //除了上传和下载,还有其他操作
        //比如:
        //1.删除文件
        //2.获取文件大小
        //3.创建文件夹
        //4.获取文件列表
        //等等

将文件的上传,下载,删除等其他操作使用面向对象的思想用单例模式进行封装

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Events;public class FtpMgr
{private static FtpMgr instance=new FtpMgr();public static FtpMgr Instance => instance;//ftp服务器地址private string FTP_PATH = "ftp://127.0.0.1";//用户名密码private string USER_NAME = "DamnF";private string PASSWORD = "DamnF123";public async void UpLoadFile(string fileName,string localPath,UnityAction action=null){await Task.Run(() =>{try{//通过一个线程执行这里边的逻辑,不会影响主线程//1.创建ftp连接FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH+fileName)) as FtpWebRequest;//2.设置通信凭证(如果不支持匿名,就必须设置这一步)//将代理相关设置置空 避免服务器同时有http相关服务冲突req.Proxy = null;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;//请求完毕后,是否关闭控制连接,如果想要关闭,需要设置falsereq.KeepAlive = false;//3.设置操作命令req.Method = WebRequestMethods.Ftp.UploadFile;//4.指定传输类型req.UseBinary = true;//5.得到用于上传的流对象Stream upLoadStream = req.GetRequestStream();//6.开始上传using (FileStream file = File.OpenRead(localPath)){//我们可以一点一点的把这个文件中的字节数组读取出来 然后存到上传流中byte[] bytes = new byte[1024];//返回值是真正从文件中读了多少个字节int contentLength = file.Read(bytes, 0, bytes.Length);//不停的去读取文件中的字节流 除非读完了 不然一直读 并且写入到上传流中while (contentLength != 0){//写入上传流中upLoadStream.Write(bytes, 0, contentLength);//写完了继续读取contentLength = file.Read(bytes, 0, bytes.Length);}//出了循环就证明写完了file.Close();upLoadStream.Close();}//上传完毕Debug.Log("上传完毕");}catch (Exception e){Debug.Log("上传出错了" + e.Message);}});//上传结束后,你想在外部做的事情action?.Invoke();}public async void DownLoadFile(string fileName,string localName,UnityAction action=null){await Task.Run(() =>{try{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.KeepAlive = false;req.Proxy = null;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.DownloadFile;FtpWebResponse res = req.GetResponse() as FtpWebResponse;Stream DownLoadStream = res.GetResponseStream();using (FileStream file = File.Create(localName)){byte[] bytes = new byte[1024];int contentLength = file.Read(bytes, 0, bytes.Length);while (contentLength != 0){file.Write(bytes, 0, contentLength);contentLength = file.Read(bytes, 0, bytes.Length);}file.Close();DownLoadStream.Close();Debug.Log("下载完毕");}res.Close();}catch (Exception e){Debug.Log("下载出错了" + e.Message);}});action?.Invoke();}public async void DeleteFile(string fileName,UnityAction<bool> action=null){await Task.Run(() =>{try{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.Proxy = null;req.KeepAlive = false;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.DeleteFile;FtpWebResponse res = req.GetResponse() as FtpWebResponse;res.Close();action?.Invoke(true);}catch (Exception e){Debug.Log("删除文件出错"+e.Message);action?.Invoke(false);}});}public async void GetFileSize(string fileName,UnityAction<long>action=null){try{await Task.Run(() =>{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.KeepAlive = false;req.Proxy = null;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.GetFileSize;FtpWebResponse res = req.GetResponse() as FtpWebResponse;action?.Invoke(res.ContentLength);res.Close();});}catch (Exception e){Debug.Log("得到文件大小出错" + e.Message);}}public async void CreateDirectory(string DirectoryName,UnityAction<bool>action=null){try{await Task.Run(() =>{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + DirectoryName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.Proxy = null;req.KeepAlive = false;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.MakeDirectory;FtpWebResponse res = req.GetResponse() as FtpWebResponse;res.Close();action?.Invoke(true);});}catch (Exception e){Debug.Log("文件夹创建失败" + e.Message);action?.Invoke(false);}}public async void GetFileList(string directoryName,UnityAction<List <string>>action=null){try{await Task.Run(() =>{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + directoryName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.Proxy = null;req.KeepAlive = false;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.ListDirectory;FtpWebResponse res = req.GetResponse() as FtpWebResponse;//把下载的信息流转化为StreamReader对象,方便我们一行一行的读取信息StreamReader streamReader = new StreamReader(res.GetResponseStream());//用于存储文件名的列表List<string> nameStrs = new List<string>();//一行一行的读取信息string line= streamReader.ReadLine();while(line!=null){nameStrs.Add(line);line = streamReader.ReadLine();}action?.Invoke(nameStrs);res.Close();});}catch (Exception e){Debug.Log("文件列表返回失败" + e.Message);action?.Invoke(null);}}
}

测试FTPMgr模块的功能

   FtpMgr.Instance.UpLoadFile("/DamnFPic.png", Application.streamingAssetsPath + "/test.png", () =>{print("上传成功,调用委托函数");});print("测试测试");print(Application.persistentDataPath);FtpMgr.Instance.DownLoadFile("/文本格式.jpg", Application .persistentDataPath +"/zhangdeshuai1234.jpg", () => {print("下载成功,调用委托函数");});print("测试测试");
 //1.删除文件FtpMgr.Instance.DeleteFile("/Pic.png", (result) =>{print(result ? "删除完毕" : "删除失败");});//2.获取文件大小FtpMgr.Instance.GetFileSize("/文本格式.jpg", (result) => {print("文件大小是:" + result);});//3.创建文件夹FtpMgr.Instance.CreateDirectory("/DamnF", (result) => {print(result ? "创建成功" : "创建失败");});//4.获取文件列表FtpMgr.Instance.GetFileList("", (list) => {if(list==null){print("返回文件列表失败");return;}else{for (int i = 0; i < list.Count ; i++){print(list[i]);}}});

相关文章:

详解与FTP服务器相关操作

目录 什么是FTP服务器 搭建FTP服务器相关 ​编辑 Unity中与FTP相关的类 上传文件到FTP服务器 使用FTP服务器上传文件的关键点 开始上传 从FTP服务器下载文件到客户端 使用FTP下载文件的关键点 开始下载 关于FTP服务器的其他操作 将文件的上传&#xff0c;下载&…...

制作一款打飞机游戏教程8:抖动

我们讨论了爆炸效果&#xff0c;这是非常重要的内容。我们制作了一个可以改变大小的小圆点&#xff0c;并展示了一些微调&#xff0c;比如绘制的圆圈数量和颜色调整等。但我们也提到将要做一些重大改变&#xff0c;这些改变将涉及到颜色的使用方式。 颜色使用方式的改变 目前…...

Linux搭建环境:从零开始掌握基础操作(四)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 软件测试第一步就是搭建测试环境&#xff0c;如何搭建好测试环境&#xff0c;需要具备两项的基础知识&#xff1a; 1、Linux 命令: 软件测试第一个任务, 一般都需要进行环境搭建, 一部分&#xff0c;环境搭建内容是在服…...

第2.4节:学会像AWK一样思考

1 第2.4节&#xff1a;学会像AWK一样思考 AWK的工作方式类似于工厂的流水线。文本数据就像流水线上的产品&#xff0c;AWK逐行读取这些文本&#xff0c;对每行文本进行分割处理&#xff0c;然后通过一系列的模式匹配和动作执行来完成特定的任务。下面我们详细介绍AWK的工作流程…...

内网穿透原理解析、使用网络场景、及如何实现公网访问步骤教程

​不多废话&#xff0c;一文了解内网穿透原理解析、使用网络场景、及如何实现公网访问步骤教程。 一&#xff0c;内网穿透原理解析 内网穿透的核心原理是通过中间服务器端口数据转发或点到点技术建立端对端的直连通信通道&#xff0c;使外网设备能够访问内网设备和服务。 1&…...

购买电脑时,主要需要关注以下核心配置,它们直接影响性能、使用体验和价格。根据需求(办公、游戏、设计、编程等),侧重点会有所不同。看看Deepseek的建议

1. 处理器&#xff08;CPU&#xff09; 作用&#xff1a;电脑的“大脑”&#xff0c;影响整体运算速度和多任务处理能力。关键参数&#xff1a; 品牌与型号&#xff1a;Intel&#xff08;酷睿i3/i5/i7/i9&#xff09;或 AMD&#xff08;锐龙R3/R5/R7/R9&#xff09;。核心/线程…...

数据结构与算法[零基础]---4.树和二叉树

四、树和二叉树 &#xff08;一&#xff09;树 1.相关定义 树是由一个或多个结点组成的有限集T&#xff0c;它满足以下两个条件&#xff1a;第一个是有一个特定的结点&#xff0c;作为根结点&#xff1b;第二个其余的结点分成m(m>0)个互不相交的有限集T0&#xff0c;T1,.…...

Sklearn入门之数据预处理preprocessing

、 Sklearn全称:Scipy-toolkit Learn是 一个基于scipy实现的的开源机器学习库。它提供了大量的算法和工具&#xff0c;用于数据挖掘和数据分析&#xff0c;包括分类、回归、聚类等多种任务。本文我将带你了解并入门Sklearn下的preprocessing在机器学习中的基本用法。 获取方式…...

4.16学习总结 IO流综合练习

爬虫获取网站内的数据&#xff0c;获得完整姓名 网站一&#xff1a;姓氏 网站二&#xff1a;男生名字 网站三&#xff1a;女生名字 进行拼接&#xff0c;获取完整的男生女生姓名。 //导包 import org.apache.commons.io.FileUtils; import java.io.*; import java.io.IOEx…...

大模型全景解析:从技术突破到行业变革

目录 一、引言&#xff1a;人工智能的新纪元 二、大模型发展历史与技术演进 1. 早期探索期&#xff08;2015-2017&#xff09;&#xff1a;从"人工智障"到初具规模 RNN/LSTM架构时代&#xff08;2013-2017&#xff09; Transformer革命&#xff08;2017&#xf…...

充电宝项目中的MQTT(轻量高效的物联网通信协议)

文章目录 补充&#xff1a;HTTP协议MQTT协议MQTT的核心特性MQTT vs HTTP&#xff1a;关键对比 EMQX项目集成EMQX集成配置客户端和回调方法具体接口和方法处理处理类 补充&#xff1a;HTTP协议 HTTP是一种应用层协议&#xff0c;使用TCP作为传输层协议&#xff0c;默认端口是80…...

AgentOps - 帮助开发者构建、评估和监控 AI Agent

文章目录 一、关于 AgentOps二、关键集成 &#x1f50c;三、快速开始 ⌨️2行代码中的Session replays 首类开发者体验 四、集成 &#x1f9be;OpenAI Agents SDK &#x1f587;️CrewAI &#x1f6f6;AG2 &#x1f916;Camel AI &#x1f42a;Langchain &#x1f99c;&#x1…...

n8n 为技术团队打造的安全工作流自动化平台

AI MCP 系列 AgentGPT-01-入门介绍 Browser-use 是连接你的AI代理与浏览器的最简单方式 AI MCP(大模型上下文)-01-入门介绍 AI MCP(大模型上下文)-02-awesome-mcp-servers 精选的 MCP 服务器 AI MCP(大模型上下文)-03-open webui 介绍 是一个可扩展、功能丰富且用户友好的…...

MyBatis:SpringBoot结合MyBatis、MyBatis插件机制的原理分析与实战

&#x1fa81;&#x1f341; 希望本文能给您带来帮助&#xff0c;如果有任何问题&#xff0c;欢迎批评指正&#xff01;&#x1f405;&#x1f43e;&#x1f341;&#x1f425; 文章目录 一、背景二、Spring Boot项目中结合MyBatis2.1 数据准备2.2 pom.xml依赖增加2.3 applicat…...

【数据结构】3.单链表专题

文章目录 单链表的实现0、准备工作1、链表的打印2、尾插3、头插4、尾删5、头删6、查找指定数据的位置7、在指定位置之前插入数据8、在指定位置之后插入数据9、删除指定位置的数据10、删除指定位置之后的数据11、单链表的销毁 单链表的实现 什么是单链表呢&#xff1f;单链表可…...

**Microsoft Certified Professional(MCP)** 认证考试

1. MCP 认证考试概述 MCP&#xff08;Microsoft Certified Professional&#xff09;是微软认证体系中的一项入门级认证&#xff0c;旨在验证考生在微软产品和技术&#xff08;如 Windows Server、Azure、SQL Server、Microsoft 365&#xff09;方面的技能。2020 年&#xff0…...

C++学习之游戏服务器开发git命令

目录 1.服务器需求分析 2.面向框架编程简介 3.ZINX框架初始 4.回显标准输入 5.VS结合GIT 6.完善readme范例 7.添加退出功能 8.添加命令处理类 9.添加日期前缀思路 10.添加日期前缀功能 1.服务器需求分析 zinx 描述 zinx 框架是一个处理多路 IO 的框架。在这个框架中提…...

Maven 多仓库与镜像配置全攻略:从原理到企业级实践

Maven 多仓库与镜像配置全攻略&#xff1a;从原理到企业级实践 一、核心概念&#xff1a;Repository 与 Mirror 的本质差异 在 Maven 依赖管理体系中&#xff0c;repository与mirror是构建可靠依赖解析链的两大核心组件&#xff0c;其核心区别如下&#xff1a; 1. Repositor…...

无锁队列--知识分享

目录 无锁队列 无锁队列是什么 为什么需要无锁队列 队列的类型 无锁队列的分类 ringbuffer&#xff08;SPSC&#xff09; ret_ring&#xff08;MPMC&#xff09; 无锁队列 无锁队列是什么 无锁队列通过原子操作来实现线程安全的队列&#xff0c;属于非阻塞队列 …...

Flask快速入门

1.安装 Flask 要使用 Flask&#xff0c;你需要先安装它。打开终端&#xff0c;运行以下命令&#xff1a; pip install flask 2.创建文件结构 3.app.py from flask import Flask&#xff1a;从 flask 库中导入 Flask 类。app Flask(__name__)&#xff1a;创建一个 Flask 应…...

LeetCode -- Flora -- edit 2025-04-16

1.两数之和 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按…...

【Unity笔记】实现可视化配置的Unity按键输入管理器(按下/长按/松开事件 + UnityEvent绑定)

【Unity笔记】实现可视化配置的Unity按键输入管理器 适用于角色控制、技能触发的Unity按键输入系统&#xff0c;支持UnityEvent事件绑定、长按/松开监听与启用开关 一、引言 在 Unity 游戏开发中&#xff0c;处理键盘输入是最常见的交互方式之一。尤其是角色控制、技能释放、菜…...

SpringMVC学习(请求与响应。常见参数类型接收与响应。@RequestParam、@RequestBody的使用)(详细示例)

目录 一、请求与响应。(RequestMapping) &#xff08;1&#xff09;使用注解RequestMapping对业务模块区分。 StudentController。 TeacherController。 &#xff08;2&#xff09;Apifox请求与响应。 "/student/login"。 "/teacher/login"。 二、常见参数…...

springboot 切面拦截自定义注解

使用切面来拦截被该注解标记的方法 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>1. 定义自定义注解 import java.lang.annotation.ElementType; imp…...

QT —— 信号和槽(自定义信号和槽函数)

QT —— 信号和槽&#xff08;自定义信号和槽函数&#xff09; 自定义信号和槽函数一、自定义信号函数规范1. 声明位置2. 返回值与实现3. 参数与重载 二、自定义槽函数规范1. 声明位置&#xff08;不同版本差异&#xff09;2. 返回值与实现3. 参数与重载 三、信号发射规范1. 基…...

朋克编码以潮玩语言讲述中国文化|益民艺术馆展演东方潮力

朋克编码于广州益民艺术馆推出“艺术家潮玩”系列主题展&#xff0c;将传统文化元素融入 潮玩设计&#xff0c;并通过数字科技与空间场景创新&#xff0c;讲述中国故事、传递东方美学。 展览作品结合太空猿等原创 IP 与“中式元素”视觉符号&#xff0c;引发观众情感共鸣。“我…...

TA学习之路——2.2 模型与材质基础

1.模型基础 1.1 图形渲染管线 1.2 模型实现的原理 点连成线,线构成面,面构成模型。 1.2 UV UV例如一个正方体的纸盒展开,平铺在一个二维的坐标系中。 模型的每一个顶点在三维空间和二维空间中都能一 一对应。在二维坐标系中的顶点对应的位置就是顶点的纹理坐标。 因此…...

helm的go模板语法学习

1、helm chart 1.0、什么是helm&#xff1f; 介绍&#xff1a;就是个包管理器。理解为java的maven、linux的yum就好。 安装方法也可参见官网&#xff1a; https://helm.sh/docs/intro/install 通过前面的演示我们知道&#xff0c;有了helm之后应用的安装、升级、查看、停止都…...

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(一)

Windows 8包括 Microsoft DirectX 功能改进&#xff0c;使开发人员、最终用户和系统制造商受益。 功能改进在以下几个方面&#xff1a; 像素格式 (5551、565、4444) &#xff1a;在低功耗硬件配置下&#xff0c;DirectX 应用程序的性能更高。双精度着色器功能&#xff1a;高级…...

软件测试|App测试面试相关问题(2)

一、App 稳定怎么做的?Monkey 怎么用(App 稳定测试)? 稳定性这块&#xff0c;我们当时用的是SDK 自动的一个Monkey 工具进行测试的&#xff0c;其实Monkey工具主要通过模拟用户发送伪随机时间去操作软件&#xff0c;通过执行Monkey 命令&#xff0c;它会自动出报告&#xff…...

模拟电路需要了解的一些基础知识(部分)

基本的单路元件 1. 电阻&#xff1b;特性&#xff1a;阻碍电流流动&#xff0c;消耗电能并转化为热能&#xff08;遵循欧姆定律&#xff09;。是无源元件&#xff0c;应用&#xff1a;限流、分压、发热等&#xff1b; 2. 电容&#xff1b;特性&#xff1a;存储电荷和电场能&am…...

[特殊字符] MySQL MCP 开发实战:打造智能数据库操作助手

&#x1f4a1; 简介&#xff1a;本文详细介绍如何利用MCP&#xff08;Model-Control-Panel&#xff09;框架开发MySQL数据库操作工具&#xff0c;使AI助手能够直接执行数据库操作。 &#x1f4da; 目录 引言MCP框架简介项目架构设计开发环境搭建核心代码实现错误处理策略运行和…...

软考备考(一)学习笔记

一、软考介绍 计算机软考,计算机技术与软件专业技术资格(水平)考试 一年考试两次: 一次上旬(5月底),下旬一次(11月初) 初级资格:程序员 中级资格: 软件设计师 高级资格: 系统架构设计师 初级: 科目一:计算机硬软件基础知识 150min 笔试、选择 科目二:程序设…...

Linux环境变量

目录 环境变量 基本概念 常见环境变量 查看环境变量方法 测试PATH 测试HOME 和环境变量相关的命令 环境变量的组织方式 通过代码如何获取环境变量 通过系统调用获取或设置环境变量 ​编辑 环境变量通常是具有全局属性的 实验 环境变量 基本概念 环境变量(environment variables…...

跨浏览器书签同步方案:WebDAV + Floccus插件实操指南

FloccusWebDAV能够帮助把多个不同浏览器书签统一私有化管理&#xff0c;以下是介绍&#xff1a; Floccus 是一个允许用户在不同浏览器和设备之间私密同步书签的扩展&#xff0c;开源地址&#xff1a;https://github.com/floccusaddon/floccusWebDAV是一种基于HTTP的协议&#…...

银河麒麟系统 达梦8 安装 dlask 框架后端环境

适配的一套环境为 dmPython2.5.8 dmSQLAlchemy1.4.39 Flask2.0.3 Flask-Cors3.0.10 Flask-SQLAlchemy2.5.1 SQLAlchemy1.4.54 Werkzeug2.2.2其中 # sqlalchemy-dm1.4.39 通过dmdbms目录内文件进行源码安装 (MindSpore) [ma-user python]$pwd /home/syl/dmdbms/drivers/python…...

代码随想录算法训练营Day31

力扣738.单调递增的数字【medium】 力扣968.监控二叉树【hard】 一、力扣738.单调递增的数字【medium】 题目链接&#xff1a;力扣738.单调递增的数字 视频链接&#xff1a;代码随想录 1、思路 先将整数转为字符串变成可迭代对象&#xff0c;再转为列表从后向前遍历&#xff…...

LeetCode Hot100 刷题笔记(10)—— ACM格式输入输出练习

目录 Trick: 1. 只有输出 2. 单组_AB 3. 多组_AB_EOF形式 4. 多组_AB_T组形式 5. 多组_AB_零尾形式 6. 单组_一维数组 7. 多组_二维数组_T组形式 8. 单组_二维数组 9. 多组_二维数组_T组形式 10. 单组_字符串 11. 多组_字符串_T组形式 12. 单组_二维字符数组 13. 多组_带空格的…...

iPaaS集成平台在制造业有哪些应用场景

在制造业迈向智能化的进程中&#xff0c;“数据不通”“系统割裂”“响应迟缓”等问题如同隐形的锁链&#xff0c;束缚着企业转型升级的步伐。面对设备、系统、供应链之间错综复杂的连接需求&#xff0c;传统定制化开发周期长、成本高&#xff0c;难以满足快速变化的业务需求。…...

【Docker项目实战】使用Docker部署Gitblit服务器

【Docker项目实战】使用Docker部署Gitblit服务器 一、Gitblit介绍1.1 Gitblit 介绍1.2 主要特点 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Gitblit镜像五、部署Gitbli…...

基于瑞芯微RK3562 四核 ARM Cortex-A53 + 单核 ARM Cortex-M0——Linux应用开发手册

前 言 本文主要介绍TL3562-MiniEVM评估板的AMP(Asymmetric Multi-processing)开发案例,适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit Linux开发环境:VMware16.2.5、Ubuntu20.04.6 64bit U-Boot:U-Boot-2017.09 Kernel:Linux-5.10.209 Lin…...

并查集(力扣1971)

并查集的功能&#xff1a;判断两个节点是否在同一个集合中/将两个节点加入同一集合中。模板如下&#xff1a; #include<iostream> #include<vector> using namespace std; const int n 1e6 5;//视题目具体节点数量而定&#xff0c;比节点数量稍大即可 vector<…...

Pinpoint - 大型分布式系统的 APM(应用性能管理)工具

文章目录 一、关于 Pinpoint最新版本&#xff08;2024/10/23&#xff09;-- v3.0.1PHP, PYTHON 二、概述支持的模块 一、关于 Pinpoint Pinpoint 是一个用于大型分布式系统的 APM&#xff08;应用性能管理&#xff09;工具&#xff0c;由 Java / PHP/PYTHON 编写。 受 Dapper …...

高级java每日一道面试题-2025年4月10日-微服务篇[Nacos篇]-Nacos的服务健康检查机制是如何工作的?

如果有遗漏,评论区告诉我进行补充 面试官: Nacos的服务健康检查机制是如何工作的&#xff1f; 我回答: Nacos 服务健康检查机制详解 Nacos 的服务健康检查机制是确保服务高可用性和可靠性的核心功能之一。它通过定期检测服务实例的状态来判断它们是否健康&#xff0c;并据此…...

JavaScript:表单及正则表达式验证

今天我要介绍的是在JavaScript中关于表单验证内容的知识点介绍&#xff1a; 关于表单验证&#xff0c;我接下来则直接将内容以及效果显示出来并作注解&#xff0c;这样可以清晰看见这个表达验证的妙用&#xff1a; <form id"ff" action"https://www.baidu.…...

Android 应用数据分布目录结构解析

在Android系统中&#xff0c;/data目录下的几个关键路径有不同的用途&#xff0c;主要涉及应用数据存储和用户媒体文件管理,具体如下&#xff1a; 1. /data/user/0/ 路径别名&#xff1a;等同于 /data/data/&#xff08;旧路径&#xff0c;仍兼容&#xff09;。 用途&#xff…...

Spring Boot 中的自动配置原理

2025/4/6 向全栈工程师迈进&#xff01; 一、自动配置 所谓的自动配置原理就是遵循约定大约配置的原则&#xff0c;在boot工程程序启动后&#xff0c;起步依赖中的一些bean对象会自动的注入到IOC容器中。 在讲解Spring Boot 中bean对象的管理的时候&#xff0c;我们注入bean对…...

Java内部类详解

在Java中&#xff0c;内部类是一种强大的特性&#xff0c;允许将一个类定义在另一个类的内部。内部类提供了更好的封装性&#xff0c;能够访问外部类的成员&#xff0c;并常用于实现事件监听、适配器模式等场景。本文将深入探讨四种内部类&#xff1a;成员内部类、静态内部类、…...

台账自动统计——餐饮物资管理台账——仙盟共创平台——未来之窗

分类表 自动统计 创作不易&#xff0c;使用地址&#xff1a;https://mp.weixin.qq.com/s/Ok3wuSYAPhd-6N8DrK7jwg 餐饮物资管理台账自动统计能够实时、精准地呈现库存数量。通过对采购入库、领用出库、盘点盈亏等数据的自动记录与计算&#xff0c;管理者随时可获取准确库存信息…...

Function Calling是什么?

Function Calling&#xff08;函数调用&#xff09;是大型语言模型&#xff08;如GPT、Claude等&#xff09;中的一项关键功能&#xff0c;允许模型根据用户输入的需求&#xff0c;智能识别并返回结构化函数调用请求&#xff0c;从而与外部工具、API或代码进行交互。以下是详细…...