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

VC++支持断点续下或续传的功能

VC++使用多线程和Socket实现断点续下

一、断点续下的基本原理:

1.断点续传的理解可以分为两部分:一部分是断点,一部分是续传。断点的由来是在下载过程中,将一个下载文件分成了多个部分,同时进行多个部分一起的下载,当某个时间点,任务被暂停了,此时下载暂停的位置就是断点了。续传就是当一个未完成的下载任务再次开始时,会从上次的断点继续传送。

2.使用多线程断点续传下载的时候,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,多个线程并发可以占用服务器端更多资源,从而加快下载速度。在下载(或上传)过程中,如果网络故障、电量不足等原因导致下载中断,这就需要使用到断点续传功能。下次启动时,可以从记录位置(已经下载的部分)开始,继续下载以后未下载的部分,避免重复部分的下载。断点续传实质就是能记录上一次已下载完成的位置。

注意:要实现HTTP断点续传,Web服务器必须支持HTTP/1.1

3.HTTP请求是有一个Header的,里面有个Range属性是定义下载区域的,它接收的值是一个区间范围,比如:Range:bytes=0-10000。这样我们就可以按照一定的规则,将一个大文件拆分为若干很小的部分,然后分批次的下载,每个小块下载完成之后,再合并到文件中;这样即使下载中断了,重新下载时,也可以通过文件的字节长度来判断下载的起始点,然后重启断点续传的过程,直到最后完成下载过程。

二、FTP实现断点续传

FTP协议也可以支持断点续传下载数据,基本原理是用get命令拿数据的时候在文件名后面加上要获取的起始位置。FTP实现断点续传有三个条件:

①断点续传需要服务器的支持,FTP服务器必须能提供断点续传的功能。传统的FTP Server是不支持断点续传的,因为它不支持REST指令;目前包括IIS和大部分的FTP架设软件都有了这个功能。用Serv-U架设FTP服务器就能支持断点续传。

②支持断点续传的下载工具软件

QQ旋风、迅雷、影音传送带等大多下载软件都支持断点续传;IE浏览器5.0以前的版本默认的自带下载方式不支持断点续传。在手机上,UC浏览器支持断点续传,能够自动存储已下载的部分,重新打开之后可以继续在已下载部分的基础上继续下载。

③FTP服务器上的文件要与下载到硬盘中的文件名相同。

在使用IE下载文件时,遇到网络中断,不需要重新启动机器,也可实现断点续传。前提是,在恢复下载、开始断点续传并提示再次保存文件时,要使用和第一次下载时相同的路径和文件名。

三、断点续传的基本原理包括以下几个步骤:

  1. 文件分割:下载的文件被分割成多个小块(或称为“分片”、“段”等)。

  2. 下载记录:客户端在下载每个文件块时,会记录下已经成功下载的块的信息,这通常包括块的序号、大小、校验码等。

  3. 中断检测:如果下载过程中发生中断,客户端会检测到这一情况。

  4. 恢复请求:当用户决定重新开始下载时,客户端会根据记录的下载信息,向服务器发送恢复请求,请求从最后一个成功下载的块开始继续下载。

  5. 服务器响应:服务器接收到恢复请求后,会根据请求中的信息,从指定的块开始发送数据。

  6. 数据校验:客户端在接收到数据后,会进行数据校验,确保接收的数据块是正确的。

  7. 合并文件:随着下载的进行,客户端会将下载的块按顺序合并,最终形成完整的文件。

  8. 完成下载:当所有块都下载并合并完成后,下载任务结束。

下面我们就新建工程来实现断点续下,如下笔者是直接用从网上下载的工程,叫做DownLoadTest,后面这个工程也会上传Gitee。
在这里插入图片描述

具体的代码是:

1.首先定义一个线程基类,用来启动下载。头文件为Thread.h

#ifndef _THREAD_SPECIFICAL_H__
#define _THREAD_SPECIFICAL_H__#define    WIN32_LEAN_AND_MEAN   //防止windows.h引入winsock.h与winsock2.h冲突
#include   <windows.h>   static unsigned int __stdcall threadFunction(void *);class Thread {friend unsigned int __stdcall threadFunction(void *);
public:Thread();virtual ~Thread();int start(void * = NULL);//线程启动函数,其输入参数是无类型指针。void stop();void* join();//等待当前线程结束void detach();//不等待当前线程static void sleep(unsigned int);//让当前线程休眠给定时间,单位为毫秒protected:virtual void * run(void *) = 0;//用于实现线程类的线程函数调用private:HANDLE threadHandle;bool started;bool detached;void * param;unsigned int threadID;
};#endif

Thread.cpp代码如下:

unsigned int __stdcall threadFunction(void * object)
{Thread * thread = (Thread *) object;return (unsigned int ) thread->run(thread->param);
}Thread::Thread()
{started = false;detached = false;
}Thread::~Thread()
{stop();
}int Thread::start(void* pra)
{if (!started){param = pra;if (threadHandle = (HANDLE)_beginthreadex(NULL, 0, threadFunction, this, 0, &threadID)){if (detached){CloseHandle(threadHandle);}started = true;}}return started;
}//wait for current thread to end.
void * Thread::join()
{DWORD status = (DWORD) NULL;if (started && !detached){WaitForSingleObject(threadHandle, INFINITE);GetExitCodeThread(threadHandle, &status); CloseHandle(threadHandle);detached = true;}return (void *)status;
}void Thread::detach()
{if (started && !detached){CloseHandle(threadHandle);}detached = true;
}void Thread::stop()
{if (started && !detached){TerminateThread(threadHandle, 0);//Closing a thread handle does not terminate //the associated thread. //To remove a thread object, you must terminate the thread, //then close all handles to the thread.//The thread object remains in the system until //the thread has terminated and all handles to it have been //closed through a call to CloseHandleCloseHandle(threadHandle);detached = true;}
}void Thread::sleep(unsigned int delay)
{::Sleep(delay);
}

2.接下来从该类继承一个类DownLoadHelper用来真正的实现下载操作。

#include <vector>
#include <string>
#include <iostream>
using namespace std;
#include "Thread.h"
#include "ChineseCode.h"//每个任务线程数
#define THREAD_COUNT 3
//重连时间
#define RECONNECT_INTERVAL 10000    class DownloadHelper: public Thread
{
public:void * run(void *);bool startDownload();//url:"http://www.abc.com/123.jpg"//location: "f:\\download\\123.jpg"bool addDownloadTask(const char* remoteUrl, const char* localFolder);DownloadHelper();virtual ~DownloadHelper();//传入函数指针,下载完成后调用void setOnFinish(void (*func)());
private://判断下载列表的文件是否已经存在
//传入index是downloadListRemoteURLs的下标bool exist(int index);//文件网络url路径vector<string> downloadListRemoteURLs;//文件在本地保存的目录vector<string> downloadListLocalFolders;//完成后调用的函数void (*onFinish)();ChineseCode chineseCode;};bool existInVector(vector<string>& array, string& str);

DownLoadHelper.cpp文件实现如下:

#include "stdafx.h"
#include "DownloadHelper.h"
#include "Mydownload.h"
#include <io.h>//
// Construction/Destruction
//DownloadHelper::DownloadHelper()
{onFinish = NULL;
}DownloadHelper::~DownloadHelper()
{}//添加下载任务,以传入的url作为唯一标识符
bool DownloadHelper::addDownloadTask(const char* remoteUrl, const char* localFolder)
{string remoteUrlString(remoteUrl);string localFolderString(localFolder);if(!existInVector(downloadListRemoteURLs,remoteUrlString)){downloadListRemoteURLs.push_back(remoteUrlString);downloadListLocalFolders.push_back(localFolderString);return true;}else{return false;}
}//每次删除第一个
/*    vector<string>::iterator startIterator = downloadListRemoteURLs.begin();  downloadListRemoteURLs.erase( startIterator );
*///判断字符串是否已经在vector<string>中出现
bool existInVector(vector<string>& array, string& str){for(int k = 0;k<array.size();k++){if(array[k].compare(str)==0)return true;}return false;
}//开始下载
bool DownloadHelper::startDownload()
{this->start();return true;
}//多线程重构函数
void * DownloadHelper::run(void *)
{    //分配空间,用于跟踪。unsigned long temp = 0;unsigned long *downloaded = &temp;unsigned long totalSize = 1024;while(downloadListRemoteURLs.size()>0){cout<<downloadListRemoteURLs[0]<<endl;//默认三线程下载,可以修改,但必须保持不变,因为断点续传需要前后两次线程数一致while(true){//阻塞式,直到下载成功或者网络出错才跳出fnMyDownload(downloadListRemoteURLs[0].data(),downloadListLocalFolders[0].data(),downloaded,totalSize,"",0,THREAD_COUNT);    if(!exist(0)){//文件不存在,表示下载中断cout<<"网络中断,等待重连..."<<endl;Sleep(RECONNECT_INTERVAL);    //10秒后重连}else{//下载成功,删除第一个任务vector<string>::iterator startIterator = downloadListRemoteURLs.begin();  downloadListRemoteURLs.erase( startIterator );startIterator = downloadListLocalFolders.begin();  downloadListLocalFolders.erase( startIterator );break;    }}}if(onFinish!=NULL){onFinish();}return NULL;
}//判断下载列表的文件是否已经存在
//传入index是downloadListRemoteURLs的下标
bool DownloadHelper::exist(int index)
{string fileName = downloadListRemoteURLs[index].substr(downloadListRemoteURLs[index].find_last_of("/")+1);string file(downloadListLocalFolders[index].data());    //copyfile.append(fileName);return (_access(file.data(), 0) == 0);;
}//传入函数指针,下载完成后调用
void DownloadHelper::setOnFinish(void (*func)()){onFinish = func;
}

因为这个项目是使用Http进行下载,所以定义一个Http类,用来处理Http下载请求,对于Http协议,笔者也不是很懂,后面还需要学习一下。这里就直接用原来的代码了。

定义一个HttpGet类来处理Http请求:头文件是MyDownLoad.h
#ifndef Mydownload___
#define Mydownload___#include "stdafx.h"
#define MAX_RECV_LEN           100   // 每次接收最大字符串长度.
#define MAX_PENDING_CONNECTS   4     // 等待队列的长度.class  CHttpSect
{
public:CString  szProxyAddr;     // 理服务器地址.CString  szHostAddr;      // Host地址.int      nProxyPort;      // 代理服务端口号.int      nHostPort;       // Host端口号.CString  szHttpAddr;      // Http文件地址.CString  szHttpFilename;  // Http文件名.CString  szDesFilename;   // 下载后的文件名.DWORD    nStart;          // 分割的起始位置.DWORD    nEnd;            // 分割的起始位置.DWORD    bProxyMode;      // 下载模态. 
};class  CHttpGet  
{
public:CHttpGet();virtual ~CHttpGet();//static unsigned long m_downloaded;private:CHttpSect *sectinfo;static int m_nCount;static UINT ThreadDownLoad(void* pParam);public:static DWORD m_nFileLength;private:static SOCKET ConnectHttpProxy(CString strProxyAddr,int nPort);static SOCKET ConnectHttpNonProxy(CString strHostAddr,int nPort);static BOOL SendHttpHeader(SOCKET hSocket,CString strHostAddr,CString strHttpAddr,CString strHttpFilename,DWORD nPos);static DWORD GetHttpHeader(SOCKET sckDest,char *str);static DWORD GetFileLength(char *httpHeader);static BOOL SocketSend(SOCKET sckDest,CString szHttp);BOOL FileCombine(CHttpSect *pInfo, FILE *fpwrite);public:BOOL HttpDownLoadProxy(CString strProxyAddr,int nProxyPort,CString strHostAddr,CString strHttpAddr,CString strHttpFileName,CString strWriteFileName,int nSectNum,DWORD &totalSize);BOOL HttpDownLoadNonProxy(CString strHostAddr,CString strHttpAddr,CString strHttpFileName,CString strWriteFileName,int nSectNum,DWORD &totalSize);BOOL HttpDownLoad(CString strProxyAddr,int nProxyPort,CString strHostAddr,int nHostPort,CString strHttpAddr,CString strHttpFileName,CString strWriteFileName,int nSectNum,BOOL bProxy);
};

另外我们还定义一个Socket类,使用Socket来连接服务器进行下载操作。

class CDealSocket  
{
public:CDealSocket();virtual ~CDealSocket();public:SOCKET GetConnect(CString host ,int port);SOCKET Listening(int port);CString GetResponse(SOCKET hSock);
};

一个文件类CMyFile,用来辅助需要下载的文件。

class CMyFile  
{
public:CMyFile();virtual ~CMyFile();public:BOOL FileExists(LPCTSTR lpszFileName);FILE* GetFilePointer(LPCTSTR lpszFileName);DWORD GetFileSizeByName(LPCTSTR lpszFileName);CString GetShortFileName(LPCSTR lpszFullPathName);
};

MyDownLoad.cpp文件太长了,这里就不贴出来了。直接去项目看下。

在主函数中的测试程序如下:

DownloadHelper downloadHelper;downloadHelper.addDownloadTask("http://192.168.1.112/com.zip","C:\\Users\\Administrator\\Desktop\\");downloadHelper.startDownload();downloadHelper.join();

上面用用到的网址,是自己在本地搭建的Http服务器。另外需要讲一下在Windows上搭建Http服务器的过程。使用IIS搭建Http服务器进行测试时,遇到了如下问题:http error 503.the service is unavailable错误。最后的解决办法遇到相同问题的可以参考这篇文章。# 成功解决http error 503.the service is unavailable错误

小结:这个项目中用到的知识点有:

1.多线程编程。

2.Http协议。

3.Socket编程。

4.如何在本地搭建Http服务器。

参考文章:

1.解读断点续传的基本原理 - duanxz - 博客园 (cnblogs.com)

2.windows环境(本地端以及华为云服务器)搭建HTTP服务器_本地服务器-CSDN博客

  1. https://developer.aliyun.com/article/1217820问题解决办法。

最后,就为大家介绍到这里了。项目的源码:DownLoadTest

相关文章:

VC++支持断点续下或续传的功能

VC使用多线程和Socket实现断点续下 一、断点续下的基本原理&#xff1a; 1.断点续传的理解可以分为两部分&#xff1a;一部分是断点&#xff0c;一部分是续传。断点的由来是在下载过程中&#xff0c;将一个下载文件分成了多个部分&#xff0c;同时进行多个部分一起的下载&…...

机器学习数学原理专题——线性分类模型:损失函数推导新视角——交叉熵

目录 二、从回归到线性分类模型&#xff1a;分类 3.分类模型损失函数推导——极大似然估计法 &#xff08;1&#xff09;二分类损失函数——极大似然估计 &#xff08;2&#xff09;多分类损失函数——极大似然估计 4.模型损失函数推导新视角——交叉熵 &#xff08;1&#x…...

windows和linux路径斜杆转换脚本,打开即用

前言&#xff1a; windows和linux的目录路径斜杆是相反的&#xff0c;在ssh或者其他什么工具在win和ubuntu传文件时候经常需要用到两边的路径&#xff0c;有这个工具就不用手动去修改斜杆反斜杠了。之前有个在线网站&#xff0c;后来挂了&#xff0c;就想着自己搞一个脚本来用。…...

在Android系统中,查看apk安装路径

在Android系统中&#xff0c;应用通常安装在内部存储的特定目录下。要找到已安装应用的路径&#xff0c;可以通过ADB&#xff08;Android Debug Bridge&#xff09;工具来查询。以下是一些步骤和命令&#xff0c;可以帮助你找到应用的安装路径&#xff1a; 使用pm list package…...

管理不到位,活该执行力差?狠抓这4点要素,强化执行力

管理不到位&#xff0c;活该执行力差&#xff1f;狠抓这4点要素&#xff0c;强化执行力 一&#xff1a;强化制度管理 1、权责分明&#xff0c;追责管理 要知道&#xff0c;规章制度其实就是一种“契约”。 在制定制度和规则的时候&#xff0c;民主一点&#xff0c;征求团队成员…...

应届毕业之本科简历制作

因为毕设以及编制岗位面试&#xff0c;最近好久没有更新了&#xff0c;刚好有同学问如何制作简历&#xff0c;我就准备将我自己制作简历的流程分享给各位&#xff0c;到此也算是一个小的结束&#xff0c;拿了工科学位证书毕业去做&#x1f402;&#x1f40e;了。 简历主要包含内…...

SparkOnHive_列转行、行转列生产操作(透视和逆透视)

前言 行专列&#xff0c;列转行是数开不可避免的一步&#xff0c;尤其是在最初接触Hive的时候&#xff0c;看到什么炸裂函数&#xff0c;各种udf&#xff0c;有点发憷&#xff0c;无从下手&#xff0c;时常产生这t怎么搞&#xff0c;我不会啊&#xff1f; 好吧&#xff…...

【人机交互 复习】第2章 Hadoop

一、概念 1.Hadoop 是一个能够对大量数据进行分布式处理的软件框架&#xff0c;并 且是以一种可靠、高效、可伸缩的方式进行处理的&#xff0c; 2.特点&#xff1a; 高可靠性&#xff0c;高效性&#xff0c;高可扩展性&#xff0c;高容错性 运行在Linux平台上&#xff0c;支持…...

国产自研编程语言“仓颉”来了!

在 6.21 召开的华为开发者大会&#xff08;HDC2024&#xff09;上,华为自研的国产编程语言“仓颉”终于对外正式发布了&#xff01; 随着万物互联以及智能时代的到来&#xff0c;软件的形态将发生巨大的变化。一方面&#xff0c;移动应用和移动互联网领域仍然强力驱动人机交互…...

Swarm 集群管理

Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API&#xff0c;所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限…...

从社交网络到元宇宙:Facebook的战略转型

随着科技的迅猛发展和数字化时代的深入&#xff0c;社交网络已不再局限于简单的信息交流和社交互动&#xff0c;而是逐步向更广阔、更深远的虚拟现实空间——元宇宙&#xff08;Metaverse&#xff09;转变。作为全球最大的社交网络平台之一&#xff0c;Facebook正在积极推动这一…...

程序猿大战Python——面向对象——继承进阶

方法重写 目标&#xff1a;掌握方法的重写。 当父类的同名方法达不到子类的要求&#xff0c;则可以在子类中对方法进行重写。语法&#xff1a; class 父类名(object):def 方法A(self):代码... class 子类名(父类名):def 方法A(self):代码... 例如&#xff0c;一起来完成&…...

【Linux基础】SSH登录

SSH简介 安全外壳协议&#xff08;Secure Shell Protocol&#xff0c;简称SSH&#xff09;是一种加密的网络传输协议&#xff0c;可在不安全的网络中为网络服务提供安全的传输环境。 SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。 SSH最常见的用途是远程登…...

经典机器学习方法(7)—— 卷积神经网络CNN

参考&#xff1a;《动手学深度学习》第六章 卷积神经网络&#xff08;convolutional neural network&#xff0c;CNN&#xff09;是一类针对图像数据设计的神经网络&#xff0c;它充分利用了图像数据的特点&#xff0c;具有适合图像特征提取的归纳偏置&#xff0c;因而在图像相…...

经典面试题【作用域、闭包、变量提升】,带你深入理解掌握!

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享经典面试题【作用域、闭包、变量提升】&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;原创不易&#xff0c;如果能帮助到带大家&#xff0…...

Dockerfile实战

Dockerfile是用来快速创建自定义镜像的一种文本格式的配置文件&#xff0c;在持续集成和持续部署时&#xff0c;需要使用Dockerfile生成相关应用程序的镜像。 Dockerfile常用命令 FROM&#xff1a;继承基础镜像MAINTAINER&#xff1a;镜像制作作者的信息&#xff0c;已弃用&a…...

常用的开源数据集网站

Kaggle&#xff08;https://www.kaggle.com/datasets&#xff09;&#xff1a;Kaggle 是一个著名的数据科学竞赛平台&#xff0c;也提供了大量的开放数据集供用户下载和使用。UCI Machine Learning Repository&#xff08;https://archive.ics.uci.edu/datasets&#xff09;&am…...

html文本被木马病毒植入vbs脚本

我在公司服务器上写了一个静态html&#xff0c;方便导航&#xff0c;结果没过多久发现html文件被修改了&#xff0c;在</html>标签后加了这些代码。 注&#xff1a;WriteData 的内容很长&#xff0c;被我删掉了很多&#xff0c;不然没法提交这个提问 ​ <SCRIPT Lan…...

jsonl 文件介绍

jsonl文件介绍 什么是 jsonl 文件文件结构读取jsonl文件写入jsonl文件 什么是 jsonl 文件 jsonl&#xff08;json lines&#xff09;是一种文件格式&#xff0c;其中每一行都是一个单独的 json 对象。与常规的 json文件不同&#xff0c;jsonl文件在处理大量数据时具有优势&…...

反射机制详解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Java从入门到精通 ✨特色专栏&#xff…...

【数据库】七、数据库安全与保护

七、数据库安全与保护 文章目录 七、数据库安全与保护安全性访问控制数据库安全性控制用户标识和鉴别存取控制自主存取控制(DAC)存取控制方法&#xff1a;授权与回收GRANT授权REVOKE回收 强制存取控制(MAC) MySQL的安全设置用户管理1.创建登录用户2.修改用户密码3.修改用户名4.…...

卡尔曼滤波-剔除异常值的影响

二郎在看论文的时候&#xff0c;发现了一个针对卡尔曼滤波过程中&#xff0c;测量向量出现误差导致滤波发散的处理方法。 该方法也可以扩展到其他问题中使用&#xff0c;所以二郎在这里写一下。 论文原文&#xff1a;https://www.mdpi.com/1424-8220/20/17/4710 论文翻译对应…...

Java程序之动物声音“模拟器”

题目&#xff1a; 设计一个“动物模拟器”&#xff0c;希望模拟器可以模拟许多动物的叫声和行为&#xff0c;要求如下&#xff1a; 编写接口Animal&#xff0c;该接口有两个抽象方法cry()和getAnimalName()&#xff0c;即要求实现该接口的各种具体的动物类给出自己的叫声和种类…...

jieba中文分词器的使用

Jieba 是一个中文分词的第三方库&#xff0c;主要用于对中文文本进行分词。分词是将文本分割成一个个词语的过程&#xff0c;这在中文文本处理中尤为重要&#xff0c;因为中文不像英文那样有明显的空格来分隔词语。Jieba 的分词算法可以实现精确分词、全模式分词和搜索引擎模式…...

【杂记-浅谈OSPF协议中的RouterDeadInterval】

OSPF协议中的RouterDeadInterval 一、RouterDeadInterval概述二、设置RouterDeadInterval三、RouterDeadInterval的重要性 一、RouterDeadInterval概述 RouterDeadInterval&#xff0c;即路由器死区间隔&#xff0c;它涉及到路由器如何在广播网络上发现和维护邻居关系。Router…...

Django 模版变量

1&#xff0c;模版变量作用 模板变量使用“{{ 变量名 }}” 来表示模板变量前后可以有空格&#xff0c;模板变量名称&#xff0c;可以由数字&#xff0c;字母&#xff0c;下划线组成&#xff0c;不能包含空格模板变量还支持列表&#xff0c;字典&#xff0c;对象 2&#xff0c;…...

【数据结构与算法】图的存储(邻接矩阵,邻接表)详解

图的邻接矩阵数据结构 typedef enum { NDG, DG, NDN, DN } GraphKind;using VRType int; using InfoType int;typedef struct ArcCell {VRType adj;InfoType *info; } Arc[N][N];struct MGraph {ElemType vexs[N];Arc arc;int vexnum, arcnum;GraphKind kind; };ArcCell 结构…...

【深度C++】之“类与结构体”

0. 抽象数据类型 类&#xff08;class&#xff09; 和结构体&#xff08;struct&#xff09; 都是C中的自定义数据类型&#xff0c;是使用C实现面向对象编程思想的起点。 类的基本思想是数据抽象&#xff08;data abstraction&#xff09; 和封装&#xff08;encapsulation&a…...

CTO的职责是什么?

看《架构思维》作者是这样讲的&#xff1a; CTO 到底是做什么的&#xff1f; 我当下的答案是&#xff1a;“CTO 就是一个从技术视角出发&#xff0c;为公司或者所在的部门做正确决策的 CEO。”怎么理解这句话呢&#xff1f;作为一个 CTO&#xff0c;其长期目标和决策优先级与…...

【GD32】从零开始学兆易创新32位微处理器——RTC实时时钟+日历例程

1 简介 RTC实时时钟顾名思义作用和墙上挂的时钟差不多&#xff0c;都是用于记录时间和日历&#xff0c;同时也有闹钟的功能。从硬件实现上来说&#xff0c;其实它就是一个特殊的计时器&#xff0c;它内部有一个32位的寄存器用于计时。RTC在低功耗应用中可以说相当重要&#xf…...

HTTP网络协议

1.HTTP &#xff08;1&#xff09;概念&#xff1a; Hyper Text Transfer Protocol&#xff0c;超文本传输协议规定了浏览器和服务器之间数据传输的规则。 &#xff08;2&#xff09;特点 基于TCP协议:面向连接&#xff0c;安全基于请求-响应模型的:一次请求对应一次响应HTTP协…...

Kubernetes相关生态

1、Prometheus、Metrics Server与Kubernetes监控体系 简介&#xff1a; Prometheus 项目与 Kubernetes 项目一样&#xff0c;也来自于 Google 的 Borg 体系&#xff0c;它的原型系统&#xff0c;叫作 BorgMon&#xff0c;是一个几乎与 Borg 同时诞生的内部监控系统 Pro…...

C语言入门4-函数和程序结构

函数举例 读取字符串&#xff0c;如果字符串中含有ould则输出该字符串&#xff0c;否则不输出。 #include <stdio.h>// 函数声明 int getLine(char s[], int lim); int strindex(char s[], char t[]);int main() {char t[] "ould"; // 要查找的目标子字符串…...

分行业二氧化碳排放数据

分行业二氧化碳排放量 资源名称&#xff1a;分行业二氧化碳排放量 数据来源&#xff1a;中国能源统计年鉴 时间范围&#xff1a;1995-2018年指标&#xff1a;八类能源和总量&#xff1a;煤炭、焦炭、原油、汽油、煤油、柴油、燃料油、天然气...

【OS基础】符合AUTOSAR标准的RTAOS-Alarms详解

目录 前言 正文 7.报警Alarms 7.1配置Alarms 7.1.1激活一个任务 7.1.2 设置一个事件 7.1.3报警回调Alarm Callback 7.1.4 增加计数器值 7.2设置Alarms 7.2.1 绝对Alarms 7.2.2 相对Alarm 7.3自启动Alarms 7.4 删除Alarms 7.5确认何时会发生Alarm 7.6非周期Alarm…...

基于Java的学生成绩管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;B/S结构 工具&#xff1a;MyEclipse&#xff0c;MySQL 系统展示 首页 个人中…...

都2024年了,还有人不懂动态代理么?

文章目录 一、定义二、静态代理三、动态代理1. JDK代理1.1 JDK代理实现流程1.2 动态生成的类字节码 2. Cglib代理2.1 Cglib实现流程 四、总结 一、定义 静态代理和动态代理都反映了一个代理模式&#xff0c;代理模式是一种经典的设计模式&#xff0c;常用于为其他对象提供一种…...

ARM功耗管理框架之PPU

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理框架&#xff1f;SCP&#xff1f;PPU&#xff1f;LPI&#xff1f;之间的关系&#xff1f;如何配合&#xff1f; 目录 一、功耗管理框架中的PPU 二、PPU的结构与连接关系 三、PPU操作模式和电源模式及其之间的转…...

说说 SSL 的错误认识和不足之处

最近明月在学习折腾 LNMP 期间无意中建了一个 Typecho 的博客小站&#xff0c;近一周的折腾下来&#xff0c;收获真的不少&#xff0c;致使兴趣也越来越浓了&#xff0c;在升级 LNMP 的时候捎带手的给这个 Typecho 博客也启用了 SSL。并且开启了 memcached 和 OPcache 优化加速…...

Go语言day1

下载go语言的安装程序&#xff1a; All releases - The Go Programming Language 配置go语言的环境变量&#xff1a; 写第一个go语言 在E:\go_workspace当前窗口使用cmd命令: 输入 go run test.go...

【Python机器学习】利用t-SNE进行流形学习

虽然PCA通常是用于变换数据的首选方法&#xff0c;使你能够用散点图将其可视化&#xff0c;但这一方法的性质限制了其有效性。 有一类用于可视化的算法叫做流形学习算法&#xff0c;它允许进行更复杂的映射&#xff0c;通常也可以给出更好的可视化。其中特别有用的一个就是t-S…...

03 - matlab m_map地学绘图工具基础函数 - 设置坐标系(m_coord)

03 - matlab m_map地学绘图工具基础函数 - 设置坐标系&#xff08;m_coord&#xff09; 0. 引言1. m_proj使用方法2. 结语 0. 引言 上一篇介绍了m_proj函数用于初始化投影&#xff0c;本篇介绍的函数m_coord用于初始化地理坐标系或地磁坐标系&#xff0c;地理/地磁坐标系和投影…...

UEC++ 虚幻5第三人称射击游戏(一)

UEC 虚幻5第三人称射击游戏&#xff08;一&#xff09; 创建一个空白的C工程 人物角色基本移动 创建一个Character类添加一些虚幻商城中的基础动画 给角色类添加Camera与SPringArm组件 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category "SpringArm")clas…...

java小代码(1)

代码 &#xff1a; 今日总结到此结束&#xff0c;拜拜&#xff01;...

SLAM ORB-SLAM2(27)词袋模型

SLAM ORB-SLAM2(27)词袋模型 1. 词袋模型1.1. 词汇树1.2. 逆向索引表1.3. 逆向索引表2. 词袋向量3. 匹配候选帧3.1. 找出和当前帧具有公共单词的所有关键帧3.2. 找出和当前帧最多公共单词的关键帧3.3. 剔除共享单词数较少的关键帧3.4. 计算关键帧的共视关键帧组的总得分3.5. …...

OpenAI 的 GPT-5:CTO米拉-穆拉提说,到 2026 年将实现博士级智能(Ph.D.-Level))

据首席技术官米拉-穆拉提&#xff08;Mira Murati&#xff09;介绍&#xff0c;GPT-5 是 OpenAI 人工智能的下一代进化产品&#xff0c;将于 2025 年底或 2026 年初在特定任务中实现博士级智能。 GPT-5 内部代号为 "Gobi "和 “Arrakis”&#xff0c;将是一个多模态…...

macbook配置adb环境和用adb操作安卓手机

&#xff08;参考&#xff1a;ADB工具包的安装与使用_adb工具箱-CSDN博客&#xff09; 第一步&#xff1a;从Android开发者网站下载Android SDK&#xff08;软件开发工具包&#xff09;。下载地址为&#xff1a; 第二步&#xff1a;解压下载的SDK压缩文件到某个目录中。 进入解…...

微软TTS最新模型,发布9种更真实的AI语音

很高兴与大家分享 Azure AI 语音翻译产品套件的两个重大更新&#xff1a; 视频翻译和增强的实时语音翻译 API。 视频翻译&#xff08;批量&#xff09; 今天&#xff0c;我们宣布推出视频翻译预览版&#xff0c;这是一项突破性的服务&#xff0c;旨在改变企业本地化视频内容…...

python爬虫 -爬取 json 格式数据

在Python中&#xff0c;爬取JSON格式的数据通常涉及到发送 HTTP请求到某个URL&#xff0c;并解析返回的JSON数据。以下是一个简单的示例&#xff0c;说明如何使用Python的requests库来爬取JSON格式的数据&#xff1a; 1. 首先&#xff0c;确保你已经安装了requests库。如果没…...

Pytorch(5)-----梯度计算

一、问题 如何使用Pytorch计算样本张量的基本梯度呢&#xff1f;考虑一个样本数据集&#xff0c;且有两个展示变量&#xff0c;在给定初始权重的基础上&#xff0c;如何在每次迭代中计算梯度呢&#xff1f; 二、如何运行 假设有x_data 和 y_data 列表&#xff0c;计算两个列表需…...

微信小程序的开发

前端&#xff1a;微信小程序开发的技术 后端&#xff1a;springboot的框架 一&#xff1a;微信小程序环境的搭建 1. 访问微信开发者官⽅⽹站的⼩程序开发⼯具下载⻚⾯。 2. 根据你的操作系统&#xff08;Windows、macOS或Linux&#xff09;选择合适的版本进⾏下载。 3. 下…...

探索 Apache Paimon 在阿里智能引擎的应用场景

摘要&#xff1a;本文整理自Apache Yarn && Flink Contributor&#xff0c;阿里巴巴智能引擎事业部技术专家王伟骏&#xff08;鸿历&#xff09;老师在 5月16日 Streaming Lakehouse Meetup Online 上的分享。内容主要分为以下三个部分&#xff1a; 一、 阿里智能引擎…...

深圳比创达EMC|EMI电磁干扰行业:从源头到终端的全面解决方案2

深圳比创达EMC&#xff5c;EMI电磁干扰行业&#xff1a;从源头到终端的全面解决方案 在当今电子信息技术日新月异的时代&#xff0c;电磁干扰&#xff08;EMI&#xff09;问题愈发凸显其重要性。EMI电磁干扰行业作为解决这一问题的关键领域&#xff0c;正面临着前所未有的挑战…...

Prometheus安装部署

1 常见部署方式 包安装 RHEL系统: https://packagecloud.io/app/prometheus-rpm/release/search 二进制安装 https://prometheus.io/download/ 基于 Docker 运行 https://prometheus.io/docs/prometheus/latest/installation/ 1.1 Docker 镜像直接启动 [root120 ~]# d…...

CPU/内存/综合性能评估工具汇总-1:lmbench

目录 一、概括二、lmbench 一、概括 嵌入式开发中对要设计的产品、立项的项目进行设计时&#xff0c;往往需要对关键芯片进行性能评估&#xff0c;本文主要总结基于linux系统的产品在性能评估时的工具使用总结&#xff0c;在aarch64(arm64平台下测试)&#xff0c;板卡根文件系…...

用pycharm进行python爬虫的步骤

使用 pycharm 进行 python 爬虫的步骤&#xff1a;下载并安装 pycharm。创建一个新项目。安装 requests 和 beautifulsoup 库。编写爬虫脚本&#xff0c;包括获取页面内容、解析 html 和提取数据的代码。运行爬虫脚本。保存和处理提取到的数据。 用 PyCharm 进行 Python 爬虫的…...

方程豹豹3谍照信息曝光售价或低于20万元

日前,电车之家获悉到一组方程豹豹3的谍照信息。该车定位紧凑型SUV,预计会在年内上市,售价方面或低于20万元。新车还处于高度保密期,所以车身有着较多的伪装材料。目前只能看到新车配备了平行式日间行车灯,是否贯穿式,目前还不能确定。另外在路试车的车顶我们也没有看到激…...

引领SUV新风尚:新一代哈弗H6预售,科技与美学双重革新

哈弗H6作为长城汽车旗下的紧凑型SUV,一直以来都备受消费者的青睐。近日,新一代哈弗H6正式开启了预售,吸引了众多目光。外观方面,新一代哈弗H6采用了“星河美学”设计语言,整体造型更加时尚、动感。前脸配备了全新点阵式前中网,格栅尺寸更大,取消了镀铬边框,使前脸看上去…...

本田CR-V与大众途观L车辆对比:资深人士解析,长期使用明显区别

在汽车市场领域,本田CR-V及大众途观L皆为备受瞩目的SUV车型。它们在市场上一直是激烈的竞争对手,消费者往往在它们之间犹豫不决。关于本田CR-V与大众途观L的对比文章,以帮助消费者更好地了解这两款车型的优劣势,并做出更明智的选择。一、车型特点本田CR-V是一款紧凑型SUV,…...

【busybox记录】【shell指令】unlink

目录 内容来源&#xff1a; 【GUN】【unlink】指令介绍 【busybox】【unlink】指令介绍 【linux】【unlink】指令介绍 使用示例&#xff1a; 删除文件 - 默认 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; 内容来源&#xff1a; GUN &#x…...

python常用文件路径切片及写脚本

常用文件路径切片 因为自己对路径切片这一块不是很熟悉,所以每次用都到处查浪费了不少时间,今天刚好又用到,整理一下: #绝对路径 video_path=r“E:\avfilm\pokes\qw0001.mp4” # 从绝对路径中提取完整文件名 video_name = os.path.basename(video_path) # 文件路径提取,用…...

tomcat学习--部署java项目

主流开发项目&#xff0c;springboot框架下&#xff0c;jar部署java传统的tomcat发布war包 一 什么是tomcat&#xff1f; 是一个用于运行java程序的软件&#xff0c;发布的时候&#xff1a;开发将源码使用maven打包&#xff0c;生产war包 二 安装tomcat tomcat是java写的&a…...