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

详解与HTTP服务器相关操作

HTTP 服务器是一种遵循超文本传输协议(HTTP)的服务器,用于在网络上传输和处理网页及其他相关资源。以下是关于它的详细介绍:

工作原理

  • HTTP 服务器监听指定端口(通常是 80 端口用于 HTTP,443 端口用于 HTTPS),等待客户端(如浏览器)发送请求。当客户端发送请求时,服务器解析请求,根据请求的 URL 和其他信息,找到对应的资源(如 HTML 文件、图片、脚本等),然后将这些资源封装在 HTTP 响应消息中,发送回客户端。

搭建HTTP服务器

这里我们使用别人做好的HTTP服务器:hfs

HTTP的关键类

利用Head类型请求资源的可用性

    在 C# 里,HTTP 的HEAD请求方法是一种特殊的 HTTP 请求类型。它和GET请求类似,区别在于HEAD请求仅要求服务器返回 HTTP 响应头信息,而不返回请求资源的具体内容。这种方法在很多场景中都很有用,比如检查资源是否存在、获取资源的元数据(像文件大小、修改时间),同时避免传输大量数据。

 #region 知识点一 检测资源的可用性try{//利用Head类型请求类型,获取信息//1.创建Http通讯用连接对象HttpWebRequest对象HttpWebRequest req = HttpWebRequest.Create("http://172.41.2.6/HTTP_Server/测试图片.png") as HttpWebRequest;//2.设置请求类型,或其他相关设置参数req.Method = WebRequestMethods.Http.Head;req.Timeout = 2000;//3.发送请求,获取响应结果HttpWebResponse对象HttpWebResponse res = req.GetResponse() as HttpWebResponse;if (res.StatusCode == HttpStatusCode.OK){print("文件存在且可用");print(res.ContentLength);print(res.ContentType);res.Close();}elseprint("文件不能用" + res.StatusCode);}catch (WebException w){print("获取出错"+w.Message +w.Status);}#endregion

利用Get类型下载服务器中的资源

在 C# 里,GET是 HTTP 协议里最常用的请求方法之一,其作用是从指定的服务器获取资源

  #region 下载资源try{//利用GET请求类型,下载资源//1.创建HTTP通讯用连接对象HttpWebRequest对象HttpWebRequest req = HttpWebRequest.Create(new Uri("http://172.41.2.6/HTTP_Server/测试图片.png")) as HttpWebRequest;//2.设置请求类型,或其他相关操作req.Method = WebRequestMethods.Http.Get;req.Timeout = 3000;//3.发送请求,获取响应结果HttpWebResponse对象HttpWebResponse res = req.GetResponse() as HttpWebResponse;//4.获取响应数据流,写入本地路径if (res.StatusCode == HttpStatusCode.OK){print(Application.persistentDataPath);using (FileStream file = File.Create(Application.persistentDataPath + "/httpDowmload.png")){Stream downLoadStream = res.GetResponseStream();byte[] bytes = new byte[2048];int contentLength = downLoadStream.Read(bytes, 0, bytes.Length);while (contentLength != 0){file.Write(bytes, 0, contentLength);contentLength = downLoadStream.Read(bytes, 0, bytes.Length);}file.Close();downLoadStream.Close();res.Close();}print("下载成功");}elseprint("下载失败");}catch (WebException w){print("下载出错了" + w.Message + w.Status);}#endregion 

利用Post类型给服务器上传资源

在 C# 里,POST请求方法用于向服务器提交数据,通常用于创建新资源,比如用户注册、表单提交等场景

Post的学前准备

Get和Post的区别是什么
语义和用途
  • GET:设计目的是从服务器获取资源。例如,当你在浏览器地址栏输入网址或者点击超链接时,浏览器通常会发送GET请求来获取对应的网页、图片、文件等资源。
  • POST:主要用于向服务器提交数据,通常用于创建、更新服务器上的资源。像用户注册、登录、提交表单数据等场景,往往会使用POST请求。
数据传输方式
  • GET:请求参数会附加在 URL 后面,以键值对的形式出现,多个参数之间用&符号分隔。例如:https://example.com/search?keyword=apple&category=fruits
  • POST:请求参数会放在 HTTP 请求体中进行传输,不会显示在 URL 里。这样可以传输大量数据,并且更适合传输敏感信息。
数据长度限制
  • GET:由于请求参数会附加在 URL 后面,而不同的浏览器和服务器对 URL 的长度有一定限制,因此GET请求所能携带的数据量有限。
  • POST:请求参数放在请求体中,理论上对数据长度没有限制,但服务器可能会对请求体的大小进行限制。
安全性
  • GET:请求参数会暴露在 URL 中,因此不适合传输敏感信息,如密码、信用卡号等。此外,GET请求还可能被缓存,存在一定的安全风险。
  • POST:请求参数在请求体中,不会暴露在 URL 里,相对更安全。不过,如果不使用 HTTPS 协议进行加密传输,请求体中的数据仍可能被截获。
缓存机制
  • GET:通常会被浏览器缓存,这意味着如果多次发送相同的GET请求,浏览器可能会直接从本地缓存中获取响应,而不会再次向服务器发送请求。
  • POST:默认情况下不会被缓存,每次发送POST请求都会向服务器发送新的请求。
幂等性
  • GET:是幂等的,即多次执行相同的GET请求,得到的结果是相同的,不会对服务器上的资源产生额外的影响。
  • POST:不是幂等的,多次执行相同的POST请求可能会在服务器上创建多个相同的资源,或者对资源进行多次更新。
Post如何携带额外参数
   #region 知识点二 Post如何携带额外参数//关键点:将Content-Type设置为 application/x-www-form-urlencoded键值对类型HttpWebRequest req = HttpWebRequest.Create("http://172.41.2.6/HTTP_Server") as HttpWebRequest;req.Method = WebRequestMethods.Http.Post;req.Timeout = 2000;//设置上传内容的类型req.ContentType = "application/x-www-form-urlencoded";//我们要上传的数据string str = "Name=DamnF&ID=2";byte[] bytes = Encoding.UTF8.GetBytes(str);//我们在上传之前一定要设置内容的长度req.ContentLength = bytes.Length;//上传数据Stream stream = req.GetRequestStream();stream.Write(bytes, 0, bytes.Length);stream.Close();//发送数据得到响应结果HttpWebResponse res= req.GetResponse()as HttpWebResponse;print(res.StatusCode);#endregion
Content-Type中重要的类型
 #region 知识点四 ContentType中对于我们重要的类型//1.通用的2进制类型//application/octet-stream//2.通用文本类型//text/plain//3.键值对参数//application/x-www-form-urlencoded//4.复合类型(传递的信息由多种信息组成,比如有键值对参数,文件信息等,上传资源服务器时需要用到该类型)//multipart//form-data#endregion

开始使用Post上传资源

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using UnityEngine;public class Lesson27 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){#region 知识点一 上传文件到HTTP资源服务器需要遵守的规则//上传文件内容必须遵守的规则//1:ContentType="multipart/form-data;boundary=边界字符串";//2:上传的格式必须按照格式写入流中// ---边界字符串//Content-Disposition:form-data;name="file";filename="传到服务器上使用的文件名";//Content-Type:application/octet-stream(由于我们上传2进制文件,所以这里使用2进制)//(这里直接写入传入的内容)//--边界字符串--//3:保证服务器允许上传//4:写入流之前需要先设置ContentLength内容长度#endregion#region 知识点二 上传文件//1.创建HttpWebRequest对象HttpWebRequest req = HttpWebRequest.Create("http://172.41.2.6/HTTP_Server/") as HttpWebRequest;//2.相关设置(请求类型,内容类型,超时,身份验证等)req.Method = WebRequestMethods.Http.Post;req.ContentType = "multipart/form-data;boundary=DamnF";req.Timeout = 500000;req.Credentials = new NetworkCredential("DamnF", "123");req.PreAuthenticate = true;//先验证身份,再上传数据//3.按格式拼接字符串并且转换为字节数组之后用于上传//3-1.文件数据前的头部信息//  --边界字符串--//Content-Disposition:form-data;name="字段名字,之后写入的文件2进制数据和该字段名对应";filename="传到服务器上使用的文件名";//Content-Type:application/octet-stream(由于我们上传2进制文件,所以这里使用2进制)//空一行string head = "--DamnF\r\n" +"Content-Disposition:form-data;name=\"file\";filename=\"http上传文件.png\"\r\n" +"Content-Type:application/octet-stream\r\n\r\n";//头部拼接字符串规则信息的字节数组byte[] headBytes = Encoding.UTF8.GetBytes(head);//3-2结束的边界信息// --边界字符串--byte[] endBytes = Encoding.UTF8.GetBytes("\r\n--DamnF--\r\n");//4.写入上传流using (FileStream localFileStream=File .OpenRead(Application .streamingAssetsPath +"/test.png")){//4-1设置上传长度//总长度=前部分字符串长度+文件本身长度+后部分边界字符串req.ContentLength = headBytes.Length + localFileStream.Length + endBytes.Length;//用于上传的流Stream upLoadStream = req.GetRequestStream();//4-2先写入前部分头部信息upLoadStream.Write(headBytes, 0, headBytes.Length);//4-3再写入文件数据byte[] bytes = new byte[2048];int contentLength = localFileStream.Read(bytes, 0, bytes.Length);while (contentLength !=0){upLoadStream.Write(bytes, 0, contentLength);contentLength = localFileStream.Read(bytes, 0, bytes.Length);}//4-4再写入结束的边界信息upLoadStream.Write(endBytes, 0, endBytes.Length);upLoadStream.Close();localFileStream.Close();}//上传数据,获取响应HttpWebResponse res = req.GetResponse() as HttpWebResponse;if (res.StatusCode == HttpStatusCode.OK)print("上传成功");elseprint("上传失败"+res.StatusCode);#endregion}// Update is called once per framevoid Update(){}
}

将Get和Post用单例模式封装到一个HTTPMgr模块中(异步)

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Events;public class HttpMgr
{private static HttpMgr instance=new HttpMgr ();public static HttpMgr Instance => instance;//http服务器地址private string HTTP_PATH = "http://172.41.2.6/HTTP_Server/";//Http服务器账号和密码private string HTTP_ID = "DamnF";private string HTTP_PASSWORD = "123";public async void DownLoadFile(string fileName,string localPath,UnityAction<bool>action=null){await Task.Run(()=>{try{HttpWebRequest req = HttpWebRequest.Create(new Uri(HTTP_PATH + fileName)) as HttpWebRequest;req.Method = WebRequestMethods.Http.Get;req.Timeout = 3000;HttpWebResponse res= req.GetResponse()as HttpWebResponse;if (res.StatusCode == HttpStatusCode.OK){using (FileStream fileStream = File.Create(localPath)){Stream downLoadStream = res.GetResponseStream();byte[] bytes = new byte[2048];int contentLength = downLoadStream.Read(bytes, 0, bytes.Length);while (contentLength != 0){fileStream.Write(bytes, 0, contentLength);contentLength = downLoadStream.Read(bytes, 0, bytes.Length);}Debug.Log("下载文件成功");action?.Invoke(true);fileStream.Close();downLoadStream.Close();}res.Close();}elseDebug.Log("下载文件失败");}catch (WebException w){Debug.Log("下载文件出错" + w.Message + w.Status);action?.Invoke(false);}});}public async void UpLoadFile(string fileName, string localFileName,UnityAction <bool>action=null){await Task.Run(() =>{try{HttpWebRequest req = HttpWebRequest.Create(HTTP_PATH) as HttpWebRequest;req.Method = WebRequestMethods.Http.Post;req.ContentType = "multipart/form-data;boundary=DamnF";req.Timeout = 500000;req.Credentials = new NetworkCredential(HTTP_ID, HTTP_PASSWORD);req.PreAuthenticate = true;string head = "--DamnF\r\n" +"Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\n" +"Content-Type:application/octet-stream\r\n\r\n";head = string.Format(head, fileName);byte[] headBytes = Encoding.UTF8.GetBytes(head);byte[] endBytes = Encoding.UTF8.GetBytes("\r\n--DamnF--\r\n");using (FileStream localFileStream=File .OpenRead (localFileName)){req.ContentLength = headBytes.Length + localFileStream.Length + endBytes.Length;Stream upLoadStream = req.GetRequestStream();upLoadStream.Write(headBytes, 0, headBytes.Length);byte[] bytes = new byte[2048];int contentLength= localFileStream.Read(bytes, 0, bytes.Length);while (contentLength !=0){upLoadStream.Write(bytes, 0, contentLength);contentLength = localFileStream.Read(bytes, 0, bytes.Length);}upLoadStream.Write(endBytes, 0, endBytes.Length);upLoadStream.Close();localFileStream.Close();}HttpWebResponse res= req.GetResponse()as HttpWebResponse;if(res.StatusCode ==HttpStatusCode.OK ){action?.Invoke(true);}else{action?.Invoke(false);}}catch (WebException e){Debug.Log("上传出错了" + e.Message + e.Status);}});}
}

测试HTTPMgr模块

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Lesson25_Test : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){print(Application.persistentDataPath);HttpMgr.Instance.DownLoadFile("/测试图片.png", Application.persistentDataPath + "/downTest.png", (result) =>{print(result ? "下载成功调用委托函数" : "下载失败调用委托函数");});HttpMgr.Instance.UpLoadFile("http上传测试文件.png",Application.streamingAssetsPath + "/test.png", (result) =>{print(result ? "文件上传成功" : "文件上传失败");});}// Update is called once per framevoid Update(){}
}

这样就实现了对Http服务器的操作了

相关文章:

详解与HTTP服务器相关操作

HTTP 服务器是一种遵循超文本传输协议&#xff08;HTTP&#xff09;的服务器&#xff0c;用于在网络上传输和处理网页及其他相关资源。以下是关于它的详细介绍&#xff1a; 工作原理 HTTP 服务器监听指定端口&#xff08;通常是 80 端口用于 HTTP&#xff0c;443 端口用于 HT…...

LeetCode 2563.统计公平数对的数目:排序 + 二分查找

【LetMeFly】2563.统计公平数对的数目&#xff1a;排序 二分查找 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-the-number-of-fair-pairs/ 给你一个下标从 0 开始、长度为 n 的整数数组 nums &#xff0c;和两个整数 lower 和 upper &#xff0c;返回 公平…...

Manus技术架构、实现内幕及分布式智能体项目实战

Manus技术架构、实现内幕及分布式智能体项目实战 模块一&#xff1a; 剖析Manus分布式多智能体全生命周期、九大核心模块及MCP协议&#xff0c;构建低幻觉、高效且具备动态失败处理能力的Manus系统。 模块二&#xff1a; 解析Manus大模型Agent操作电脑的原理与关键API&#xf…...

基于springboot的个人财务管理系统的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…...

新能源汽车动力电池热管理方案全解析:开启电车续航与安全的密码

热管理&#xff1a;新能源汽车的隐形守护者 在新能源汽车飞速发展的今天&#xff0c;热管理系统作为保障车辆核心部件稳定运行的关键&#xff0c;正逐渐成为行业关注的焦点。据市场研究机构的数据显示&#xff0c;近年来新能源汽车的销量持续攀升&#xff0c;而与之相伴的是热…...

Ubuntu开启自启动PostgreSQL读取HDD失败处理思路

前置文章&#xff1a; windows通用网线连接ubuntu实现ssh登录、桌面控制、文件共享Ubuntu挂载HDD迁移存储PostgreSQL数据 背景&#xff1a; 启动实体Ubuntu机器后后很大的概率PostgreSQL不会成功启动&#xff0c;查看日志&#xff1a; Ubuntu启动时间&#xff1a; rootPine…...

损失函数总结

目录 回归问题L1损失 平均绝对值误差&#xff08;MAE&#xff09;Smooth L1 LossL2损失 均方误差损失MSE 分类问题交叉熵损失KL 散度损失 KLDivLoss负对数似然损失 NLLLoss 排序MarginRankingLoss 回归问题 L1损失 平均绝对值误差&#xff08;MAE&#xff09; 指模型预测值f(x…...

LeetCode 热题 100:回溯

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff…...

Jetson Orin NX 部署YOLOv12笔记

步骤一.创建虚拟环境 conda create -n yolov12 python3.8.20 注意&#xff1a;YOLOv12/YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7a/YOLOv5 环境通用 步骤二.激活虚拟环境 conda activate yolov12 #激活环境 步骤三.查询Jetpack出厂版本 Jetson系列平台各型号支持的最高Jetp…...

『Linux_网络』 第二章 UDP_Socket编程

学习了网络的概念了&#xff0c;接下来我们开始实践&#xff0c;本次我们会通过UDP来模拟实现UDP客户端和UDP服务器之间的通信&#xff0c;以及在此基础上扩展几个应用。 下面&#xff0c;我们将使用socket&#xff0c;bind&#xff0c;htons等接口实现UDP网络通信。 v1 版本 …...

【leetcode刷题日记】lc.322-零钱兑换

目录 1.题目 2.代码 1.题目 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认…...

从GET到POST:HTTP请求的攻防实战与CTF挑战解析

初探HTTP请求:当浏览器遇见服务器 基础协议差异可视化 # 典型GET请求 GET /login.php?username=admin&password=p@ssw0rd HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0# 典型POST请求 POST /login.php HTTP/1.1 Host: example.com Content-Type: application/x…...

实现Azure Data Factory安全地请求企业内部API返回数据

需要配置一个Web Activity组件在Azure云上的Azure Data Factory运行&#xff0c;它需要访问企业内部的API获取JSON格式的数据&#xff0c;企业有网关和防火墙&#xff0c;API有公司的okta身份认证&#xff0c;通过公司的域账号来授权访问&#xff0c;现在需要创建一个专用的域账…...

JDOM处理XML:Java程序员的“乐高积木2.0版“

各位代码建筑师们&#xff01;今天我们要玩一款比原生DOM更"Java友好"的XML积木套装——JDOM&#xff01;它像乐高得宝系列&#xff08;Duplo&#xff09;一样简单易用&#xff0c;却能让你的XML工程稳如霍格沃茨城堡&#xff01;&#xff08;温馨提示&#xff1a;别…...

Grouped Query Attention (GQA) PyTorch实现

个人在网上看到的实现好像都长得奇奇怪怪的&#xff0c;没有简洁的感觉&#xff0c;因此在这里给出一种易读的GQA实现方法&#xff1a; import torch import torch.nn as nn import torch.nn.functional as Fclass GroupedQueryAttention(nn.Module):def __init__(self, embed…...

《AI大模型应知应会100篇》第27篇:模型温度参数调节:控制创造性与确定性

第27篇&#xff1a;模型温度参数调节&#xff1a;控制创造性与确定性 摘要 在大语言模型的使用中&#xff0c;“温度”&#xff08;Temperature&#xff09;是一个关键参数&#xff0c;它决定了模型输出的创造性和确定性之间的平衡。通过调整温度参数&#xff0c;您可以根据任…...

演讲比赛流程管理项目c++

对于一个基本项目&#xff0c;先分析基本的东西有哪些 1.类 演讲管理类:用于编写比赛流程用的功能 演讲者类&#xff1a;包含姓名&#xff0c;分数 创建比赛流程&#xff1a;创建选手12个人&#xff0c;分为两组&#xff0c;6人一组&#xff0c;每组进行两轮比赛&#xff0…...

在小米AX6000中通过米家控制tailscale

由于tailscale占用内存较大&#xff0c;AX6000中的可用内存非常有限&#xff0c;所以需要对AX6000的内存使用进行优化&#xff1a; 1.减小tmpfs内存占用的大小&#xff1a; #从150M -> 90M&#xff0c;由于tailscale下载安装包是27M作用&#xff0c; 解压后50M左右&#xf…...

REC: 引爆全球万亿级市场!Web3+消费革命重塑全球-东南亚-跨境商业未来

在全球数字经济浪潮下&#xff0c;东南亚已成为增长最快的互联网市场之一&#xff0c;其与全球之间蓬勃发展的跨境贸易更是蕴藏着巨大潜力。然而&#xff0c;传统模式下的效率瓶颈、信任壁垒和用户激励难题日益凸显。在此背景下&#xff0c;基于去中心化与消费相结合的 REC 颠覆…...

微服务与事件驱动架构(EDA)

微服务架构 微服务架构核心特征 服务自治&#xff1a;每个服务拥有独立的代码库、数据库和运维流程。轻量级通信&#xff1a;服务间通过API&#xff08;REST/gRPC&#xff09;或消息队列&#xff08;如Kafka&#xff09;交互。去中心化治理&#xff1a;允许技术栈多样化&…...

单片机如何通过串口与上位机进行数据交换

单片机通过串口与上位机进行数据交换是一种常见的方式&#xff0c;广泛应用于嵌入式系统中。以下是实现这一功能的具体步骤和注意事项&#xff1a; 1. 硬件连接 在硬件层面&#xff0c;需要确保单片机和上位机之间的串口连接正确&#xff1a; 信号线连接&#xff1a;通常使用…...

AI速读 Seed-Thinking-v1.5:大模型推理的新飞跃

在大语言模型&#xff08;LLM&#xff09;蓬勃发展的今天&#xff0c;推理模型的性能提升成为了AI领域的关键议题。今天为大家解读的论文&#xff0c;带来了名为Seed-Thinking-v1.5的推理模型&#xff0c;它在多个任务上表现惊艳&#xff0c;还创新性地解决了不少难题&#xff…...

Mysql从入门到上手(二)-全面了解增删改查(CRUD).

一、检索数据 MySQL 中的检索数据操作是数据库操作中最常见的任务之一。使用 SQL 查询语言中的 SELECT 语句&#xff0c;可以从数据库中的一个或多个表中检索数据。以下是 MySQL 中与数据检索相关的各种技术和用法的详细讲解。 1.1、基本查询 最基本的查询是使用 SELECT 语句来…...

220V转5V转12V电机驱动供电WT5105

220V转5V转12V电机驱动供电WT5105 WT5105 芯片概述 WT5105 是一款集成非隔离式电源控制器&#xff0c;内部集成了 650V 高雪崩能力功率 MOSFET 以及高压启动与自供电电路。该芯片具有多模式输出的特点&#xff0c;输出电压可通过 FB 电阻灵活调整&#xff0c;能够实现 3.3V 以…...

基于Python Django 的全国房价大数据可视化系统(附源码,部署)

博主介绍&#xff1a;✌程序员徐师兄&#xff0c;7年大厂开发经验。全网粉丝12w&#xff0c;CSDN博客专家&#xff0c;同时活跃在掘金、华为云、阿里云、InfoQ等平台&#xff0c;专注Java技术和毕业项目实战分享✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&a…...

leetcode0113. 路径总和 II - medium

1 题目&#xff1a;路径总和 II 官方标定难度&#xff1a;中 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root …...

day46——两数之和-输入有序数组(LeetCode-167)

题目描述 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 &l…...

数据结构:以一个例题演示弗洛伊德算法

例 8.5.2 利用弗洛伊德算法&#xff0c;对图 8.5.5 中左侧的带权有向图求最短路径&#xff0c;给出每一对顶点之间的最短路径及其路径长度在求解过程中的变化。 图 8.5.5 带权图和邻接矩阵 【解】 根据图 8.5.5 中的带权有向图&#xff0c;可得所对应的邻接矩阵 g g g &#…...

Nginx 报错403 排查与解决

目录 前言-环境基础问题出现&#xff1a;403 Forbidden问题排查问题解决 前言 今天领导让我部署一个前端项目,一顿操作报错访问报错403,让我们一起搞定他。 环境 CentOS 7 x86 的服务器上部署了 Nginx 服务器。 配置文件 我把前端项目打包后的 dist 文件夹放在了 /root/…...

React-useImperativeHandle (forwardRef)

我们会遇到这样的场景&#xff1a;某个组件想要暴露一些方法&#xff0c;来供外部组件来调用。例如我们在开发form表单的时候&#xff0c;就需要把设置表单值、重置值、提交等方法暴露给外部使用。会有如下代码&#xff1a; import { forwardRef } from react;const Form for…...

研一自救指南 - 07. CSS面向面试学习

最近的前端面试多多少少都会遇到css的提问&#xff0c;感觉还是要把重点内容记记背背。这里基于b站和我自己面试的情况整理。 20250418更新&#xff1a; 1. BFC Block Formatting Context&#xff0c;一个块级的盒子&#xff0c;可以创建多个。里面有很多个块&#xff0c;他们…...

生成式人工智能驱动下的个性化学习资源开发研究——以K12学科知识图谱构建为例

一、引言 1.1 研究背景与意义 在当今数字化时代&#xff0c;教育领域正经历着深刻的变革&#xff0c;生成式 AI 技术的迅猛发展为 K12 教育带来了新的契机与挑战。长期以来&#xff0c;K12 教育主要采用标准化教学模式&#xff0c;这种 “一刀切” 的方式难以满足学生多样化的…...

A股周度复盘与下周策略 的deepseek提示词模板

以下是反向整理的股票大盘分析提示词模板&#xff0c;采用结构化框架数据占位符设计&#xff0c;可直接套用每周市场数据&#xff1a; 请根据一下markdown格式的模板&#xff0c;帮我检索整理并输出本周股市复盘和下周投资策略 【A股周度复盘与下周策略提示词模板】 一、市场…...

性能比拼: Deno vs. Node.js vs. Bun (2025版)

本内容是对知名性能评测博主 Anton Putra Deno vs. Node.js vs. Bun: Performance Comparison 2025 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中&#xff0c;我们将使用当前可用的最新版本对 Node.js、Bun 和 Deno 进行比较。我决定更新本视频&#x…...

猫咪如厕检测与分类识别系统系列【十二】猫咪进出事件逻辑及日志优化

前情提要 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠的如…...

stm32| 中断标志位和中断挂起位 | TIM_ClearFlag 函数和TIM_ClearITPendingBit 函数

1. 中断标志位&#xff08;Interrupt Flag&#xff09; 作用&#xff1a; 中断标志位位于外设寄存器中&#xff08;如定时器的TIMx_SR、GPIO的EXTI_PR等&#xff09;&#xff0c;用于指示某个特定事件是否发生&#xff08;例如定时器溢出、GPIO引脚电平变化&#xff09;。该标志…...

QML Rectangle 组件

基本属性 属性类型默认值描述colorcolor"white"矩形填充颜色border.colorcolor"transparent"边框颜色border.widthint0边框宽度radiusreal0圆角半径gradientGradientnull渐变填充antialiasingbooltrue是否抗锯齿 几何属性 (继承自Item) 属性类型默认值描…...

Spring 学习笔记之 @Transactional详解

一、数据库事务基础 数据库事务&#xff08;Transaction&#xff09;是数据库管理系统中用于确保数据一致性和完整性的一种机制。它是一组操作的集合&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败&#xff0c;从而保证数据库状态的正确性。 1.1 事务的基本概念 定…...

绕过UI的cooke和token的验证

很多的网站都在登录页面加入了识别文字&#xff0c;识别图片&#xff0c;拖动拼图的验证码方式来防止爬虫、恶意注册等&#xff0c;如果是做自动化&#xff0c;需要绕过 验证码才能进入下一步操作。 方案一、测试环境去除验证码 &#xff1a;最轻松的方法&#xff0c;找开发帮忙…...

2024-04-19| Java: Documented注解学习 JavaDoc

在 Java 中&#xff0c;Documented 是一个元注解&#xff08;meta-annotation&#xff09;&#xff0c;用于标记其他注解&#xff0c;表明这些注解应该被包含在 JavaDoc 文档中。以下是关于 Documented 注解的作用的简要说明&#xff1a; 作用 记录注解信息到 JavaDoc&#x…...

09-DevOps-Jenkins实现CI持续集成

前面已经把harbor搭建好了&#xff0c;也可以向harbor中推送自定义镜像。 原计划是在Jenkins这台服务器上&#xff0c;完成镜像构建&#xff0c;然后把镜像推送的harbor仓库中。现在改变计划了&#xff0c;Jenkins所在的服务器&#xff08;192.168.1.10&#xff09;不负责镜像…...

Java中包装类和泛型

包装类和泛型 包装类装箱和拆箱 泛型泛型的概念泛型的使用泛型的上界 通配符通配符概念通配符上界通配符下界 前言 在Java中&#xff0c;由于基本类型不是继承⾃Object&#xff0c;为了在泛型中可以⽀持基本类型&#xff0c;Java给每个基本类型都对应了⼀个包装类型&#xff0c…...

小程序 GET 接口两种传值方式

前言 一般 GET 接口只有两种URL 参数和路径参数 一&#xff1a;URL 参数&#xff08;推荐方式&#xff09; 你希望请求&#xff1a; https://serve.zimeinew.com/wx/products/info?id5124接口应该写成这样&#xff0c;用 req.query.id 取 ?id5124&#xff1a; app.get(&…...

8、表单控制:预言水晶球——React 19 复杂表单处理

一、水晶球的预言本质 "每个表单都是时空裂缝中的预言容器&#xff0c;"占卜课教授特里劳妮凝视着水晶球&#xff0c;"React-Hook-Form与Formik的融合&#xff0c;让数据捕获如同捕捉未来碎片&#xff01;" ——以魔法部神秘事务司的预言厅为隐喻&#xf…...

Android studio开发——room功能实现用户之间消息的发送

文章目录 1. Flask-SocketIO 后端代码后端代码 2. Android Studio Java 客户端代码客户端代码 3. 代码说明 SocketIO基础 1. Flask-SocketIO 后端代码 后端代码 from flask import Flask, request from flask_socketio import SocketIO, emit import uuidapp Flask(__name_…...

【测试文档】项目测试文档,测试管理规程,测试计划,测试文档模版,软件测试报告书(Word)

原件获取列表&#xff1a; 系统测试方案-2.docx B-Web安全服务渗透测试模板.docx 压力测试报告.docx安全测试用例及解析.docx 测试计划.doc 测试需求规范.doc 测试需求指南.docx 测试用例设计白皮.doc 单元测试报告模板.doc 单元测试计划模板.doc 回归测试指南.doc 集成测试报…...

将 DeepSeek 集成到 Spring Boot 项目实现通过 AI 对话方式操作后台数据

文章目录 项目简介GiteeMCP 简介环境要求项目代码核心实现代码MCP 服务端&#xff08;批量注册 Tool&#xff09;MCP 客户端&#xff08;调用 DeepSeek&#xff09; DeepSeek APIDockersse 连接http 连接 Cherry Studio配置模型配置 MCP调用 MCP 项目简介 在本项目中&#xff…...

接口自动化 ——fixture allure

一.参数化实现数据驱动 上一篇介绍了参数化&#xff0c;这篇 说说用参数化实现数据驱动。在有很多测试用例的时候&#xff0c;可以将测试用例都存储在文件里&#xff0c;进行读写调用。本篇主要介绍 csv 文件和 json 文件。 1.读取 csv 文件数据 首先创建 csv 文件&#xff…...

Datawhale AI春训营学习笔记

数据竞赛Baseline代码全解析&#xff1a;从数据加载到结果输出 一、环境配置与数据加载 1.1 依赖库导入 from netCDF4 import Dataset # 处理气象.nc格式数据 import numpy as np import pandas as pd from sklearn.model_selection import KFold from sklearn.metrics imp…...

关于学习STM32的C语言的知识

数据类型 关键字位数表示范围stdint关键字char8 -128 ~ 127 int8_tunsigned char8 0 ~ 255 uint8_tshort16 -32768 ~ 32767 int16_tunsigned short16 0 ~ 65535 uint16_tint32 -2147483648 ~ 2147483647 int32_t unsigned int32 0 ~ 429496729 uint32_t long32 -2147483648 ~…...