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

怎样使用仿站小工具做网站/百度网络推广怎么做

怎样使用仿站小工具做网站,百度网络推广怎么做,济南网站设计公司推荐,wordpress查看站点文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…

文章目录

  • 1.HTTP概念
  • 2. URL
    • urlencode 和 urldecode
    • 转义规则
  • 3. HTTP的宏观理解
    • HTTP的请求
    • HTTP的响应
  • 4. 见一见HTTP请求和响应
      • 请求报头
    • 1. 模拟一个简单的响应response
      • 响应报头
    • 2. 从路径中获取内容
      • ReadFile函数的实现
    • 3.不同资源进行区分
      • 反序列化的实现
        • ReadOneLine函数的实现
        • ParseRequestLine函数的实现
      • 路径path的最终表示
    • 4. 同时显示 文字 和 图片
      • GetContentType函数的实现
    • 5.模拟的完整代码
      • wwwroot
        • index.html(图片)
      • Err.hpp(错误)
      • HttpServer.hpp(初始化和启动)
      • Log.hpp(日志)
      • Main.cc(回调函数调用)
      • makefile
      • Sock.hpp(TCP套接字)
      • Until.hpp

1.HTTP概念

应用层 典型的 协议 HTTP(超文本传输协议), 它是应用最广泛的协议
作用为:将任意内容拉取到本地浏览器,让浏览器进行解释


客户端client 把自己的"东西" 给别人
同时也想把 别人的"东西" 拿到自己本地
一般称为 CS 模式

http中的网页文本 、图片 、视频、音频 统一称为资源
东西实际上就是资源

2. URL

要访问服务器,就必须知道服务器的IP地址和端口号

需要有一个 域名解析服务
如: baidu.com (域名) 解析成 110.242.68.4(IP地址)

如:QQ官网

https 作为协议
www.qq.com 作为服务器地址

server的端口号不能随意指定,必须是众所周知且不能随便更改的
端口号和成熟的应用层协议是 一 一对应的

https 常用的端口号为443
http 常用的端口号为80


协议名称 和端口号之间是一对一 ,强相关
如:附近着火了,第一时间想起的就是打119 进行救火

由于http是超文本传输协议,就需要告诉别人要访问什么资源


第一个 / 表示 web根目录
第二个 / 表示 路径分隔符
/ / 表示 URL想访问服务器的 什么资源

? 表示区分 URL 左侧 和右侧的分隔符
? 后面跟的都是参数

参数是KV的 ,=左边的 uid 可看作是K ,=右边的 1 可看作V

URL 被称为 统一资源定位符

urlencode 和 urldecode

在这里插入图片描述

  • 只搜索 ?/#: 这些特殊符号 发现特殊符号被转化为16进制格式数字
    因为URL本身用一些字符作为特殊字符,所以在使用特殊字符时,所以特殊符号被转化为16进制格式数字,用来和URL本身的特殊字符进行区分
    转化的过程 被称之为 URL的 encode编码,用于解决 URL中特殊符号的问题 这个工作是由浏览器或者客户端 自动做的
  • 服务器收到的就为 16进制格式,而不想要16进制格式,想要特殊符号 ,就需要进行 decode编码

转义规则

将需要转码的字符转为 16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式


点击查看:自动编码工具

在该网站上可以进行 urlencode 与urlencode 解码

3. HTTP的宏观理解

HTTP的请求

按照完整的说法,HTTP分为四部分


第一部分——请求行
HTTP的请求行,以行为单位,分为三部分 请求方法 URL 协议版本
请求方法: GET/ POST
URL:请求资源
协议版本:http/1.0 http/1.1 http/2.0
三部分之间用空格作为分隔符,把这三部分 分离开


第二部分——请求报头
由 Key:Value 所构成的多行结构


第三部分——空行
\r\n


第四部分——有效载荷
一般是用户可能提交的参数 (可以没有)

HTTP的响应

状态行 分为 协议版本 状态码 状态码描述
三部分之间用空格作为分隔符,把这三部分 分离开
协议版本:http/1.0 http/1.1 http/2.0
状态码: 如404
状态码描述 : 404所对应的含义 如:Not Found


响应报头 也是 由Key:Value 所构成的多行结构


有效载荷 可能是 html /css的文件资源,也可能是请求对应的图片等

4. 见一见HTTP请求和响应

请求报头

当从浏览器输入 主机IP+端口号 ,Linux上显示如下数据

GET / HTTP/1.1
第一行作为 请求行


由 Key Value 构成的 多行结构 作为 请求报头
并没有包含 有效载荷
Host 表示 这次请求给哪台主机,一般为目标服务器的IP地址和端口号
Connection 表示 这次请求的链接模式 长/短链接
Cache-control 表示 双方在通信时 要建立缓存,最大缓存的生存时间默认为0(不缓存)
User_Agent 表示 HTTP请求的客户端信息
Accept_Encodong 表示 作为客户端,能接受的编码和压缩类型
Accept_Language 表示 作为客户端,能接受编码符号

1. 模拟一个简单的响应response

创建一个Main.cc,通过调用 回调函数HandlerHttp的方式来实现整个过程


对于回调函数 HandlerHttp,在是一个完整的http请求报文的前提下,分别将状态行 分隔符 有效载荷 添加到 response响应中,并将 响应返回
有效载荷部分以网页部分呈现的

响应报头

进行文本分析时,按行进行分割读取,直到找到一行是空行,则认为把报头读完了

报头中key 为 Content-Length ,Value 为 Body的长度(有效载荷的长度)


当在Linux上运行程序,并输入端口号时
浏览器上 输入 主机IP+端口号 ,就会使主函数 调用回调函数 打印 this a test
同时Linux会出现如下数据 响应的 状态行 响应报头 空行 有效载荷


由于有效载荷内部分为 图片、视频、音频 资源
为了便于区分 使用 Content_Type :Body的种类


图片、视频、音频 资源 这些资源本质都是文件

图片的后缀为.png
网页的后缀为.html
视频的后缀为.mp3
Linux资源都要有自己的后缀,需要告诉别人 ,就需要 Content-Type 对照表


若后缀为.html,则 Content-Type 对照表 为 text/html
若后缀为.png,则 Content-Type 对照表 为 image/png


在响应后 添加 网页的Content-Type 对照表 text/html,以及 SEP分隔符

2. 从路径中获取内容

给http维护一个自己的目录,即 wwroot
创建 index.html 里面放入这个网页中的所有资源


创建 Until.hpp
在Until这个类中,创建一个接口 ReadFile 用于读取整个文件内容

第一个参数 path 为指定的路径
第二个参数file_content 表示输出 即文件对应的内容


path表示路径,在wwwroot目录下的index.html中获取文件
将获取到的文件交给 字符串body

ReadFile函数的实现

1. 获取文件本身的大小
输入 man 2 stat

对指定的文件路径,获取它的struct stat 属性
成功返回0,失败返回-1


st_size 表示这个文件 按字节为单位的大小
st_mode: 匹配很多的宏



2. 调整string的空间 保证能够把文件全部放下

开辟size大小个空间


3. 读取

O_RDONLY 读取


path作为路径,可以找到对应 index.html的内容,再将内容传给body字符串中,作为有效载荷

3.不同资源进行区分

只有是请求,无脑响应的都是这些资源

若请求到不同的资源,应该加以区分
用户想要什么就给他什么,没有就返回404


把request 进行处理,进行反序列化,由字符串信息变成结构化字段
创建一个 HttpRequest 结构体
里面包含 状态行的请求方法、URL、请求版本以及请求报头


在这里插入图片描述


URL作为请求资源,所以将 path替换成 req.url_ 即可

反序列化的实现

在主函数Main.cc中
创建ReadOneLine函数,将message中的第一行的请求行取出
创建 ParseRequestLine函数,将 请求行解析成 请求方法、URL、协议版本

两个函数都在Util.hpp中实现

ReadOneLine函数的实现

加上static修饰,是为了防止有隐藏的this指针存在
使用find函数寻找sep分隔符,若找到则返回pos位置的下标
使用substr函数 取出[0,pos]区间的子串 作为返回值
使用 erase函数 将下标从0开始 删除 pos+sep.size()个字符


ParseRequestLine函数的实现

sstream 流 按照空格作为分隔符,打印到三个string中

路径path的最终表示

路径path是需要加上 web根目录的

所以定义一个web根目录 webRoot


在使用请求时,先在路径path中 加入web根目录 ,再添加对应的 URL(请求资源)

4. 同时显示 文字 和 图片

点击查看:石榴花图片


在wwwroot中 创建 image文件,并进入inmage中


wget :远程获取资源的命令

使用 wget + 图片地址,获取图片


使用 mv 指令 ,将 原图片名字改为 1.jpg


此时在vscode中的 image 文件中,就可以显示图片了


一张网页包含很多要素资源,如:图片 文字 视频
每一个资源都要发起一次http请求

在浏览器中搜索 w3cschool


在HTML教程中,找到HTML图像,其中寻找到 替换文本属性


第一个/表示 web根目录 即wwwroot
在wwroot目录下找到image文件中的 1.jpg

若获取图片失败,则会显示文字 这是一张石榴花图片


由于这次资源既包含文字 又包含图片,所以类型不同,需要处理 Content-Type (body的种类)

添加成员变量,判断 要访问的是什么资源(如:图片 文字)


在反序列化函数中 使用 rfind 函数 ,从后往前 查找 字符 . ,再使用substr 函数 从下标 pos开始取len个字符
若没有给len,则一直取到path_字符串结束


在HandlerHttp函数的 使用请求中
将 Content-Type (body的种类) 进行封装成 一个GetContentType的接口

GetContentType函数的实现

若后缀为.html,则 Content-Type 对照表 为 text/html
若后缀为.css,则 Content-Type 对照表 为 test/css
若后缀为.js,则 Content-Type 对照表 为 application/x-javascript
若后缀为.png,则 Content-Type 对照表 为 image/png
若后缀为.jpg,则 Content-Type 对照表 为 image/jpeg


在浏览器 输入 主机IP+端口号 ,发现图片并没有显示,而且出现了乱码


网页必须指明编码格式,否则就会出现乱码
所以修改index.html的内容


再次输入 主机IP 和端口号 就可以同时显示 文字 和图片了

5.模拟的完整代码

wwwroot

index.html(图片)

<!DOCTYPE html>
<html lang="en"><head><meta charest="UTF-8"><meta name="viewport" content="width=device-width" ,initial-scale=1.0"><title>Document</title>
</head><body><h1>this is a test </h1><h1>this is a test </h1><h1>this is a test </h1><h1>this is a test </h1><img src="/image/1.jpg" alt="这是一张石榴花图片">
</body></html>  

Err.hpp(错误)

#pragma once enum
{USAGE_ERR=1,SOCKET_ERR,//2BIND_ERR,//3LISTEN_ERR,//4SETSID_ERR,//5OPEN_ERR//6
};

HttpServer.hpp(初始化和启动)

#include<iostream>
#include<string>
#include<pthread.h>
#include<functional>  
#include"Sock.hpp"static const uint16_t  defaultport=8888;//默认端口号class HttpServer;
//定义 func_t 类型  为 返回值为string 参数为string的包装器
using func_t =std::function<std::string( std::string&)>;class ThreadData{public:ThreadData(int sock,std::string ip,const uint16_t& port,HttpServer*tsvrp)//构造:_sock(sock),_ip(ip),_port(port),_tsvrp(tsvrp){}~ThreadData(){}public:int _sock;//套接字HttpServer *_tsvrp;//指针指向Tcp服务器 std::string _ip;uint16_t   _port;};class HttpServer
{public:HttpServer(func_t f,int port= defaultport):func(f),port_(port){}void InitServer()//初始化{listensock_.Socket();//创建套接字listensock_.Bind(port_);//绑定listensock_.Listen();//监听}void HandlerHttpRequest(int sock)//{char buffer[4096];std::string request;//将套接字的数据读取到buffer中ssize_t s=recv(sock,buffer,sizeof(buffer)-1,0);if(s>0)//读取成功{buffer[s]=0;//将'\0'赋值给buffer中request=buffer;std::string response =func(request);//回调函数 将request变为responsesend(sock,response.c_str(),response.size(),0);//发送 将respnse中的内容 发送到sock套接字中}else {//读取失败logMessage(Info,"client quit ...");//打印日志 }} static void* threadRoutine(void *args){//线程分离 若不关心线程返回值 则提前告诉它 要进行分离pthread_detach(pthread_self());ThreadData* td=(ThreadData*)args;td->_tsvrp->HandlerHttpRequest(td->_sock);close(td->_sock);delete td;return nullptr;}void Start()//启动{for(;;){std::string clientip;uint16_t clientport;int sock=listensock_.Accept(&clientip,&clientport);//获取客户端IP和端口号if(sock<0){continue;}pthread_t tid;ThreadData *td =new ThreadData(sock,clientip,clientport,this);pthread_create(&tid,nullptr,threadRoutine,td);}}~HttpServer(){}private:int port_;       //端口号Sock listensock_;//套接字func_t func; //包装器类型的回调函数
};

Log.hpp(日志)

#pragma once 
#include<iostream>
#include<string.h>
#include<cstdio>
#include<cstring>
#include<cstdarg>
#include<unistd.h>
#include<sys/types.h>
#include<time.h>const std::string  filename="tecpserver.log";//日志等级
enum{Debug=0, // 用于调试Info  ,  //1 常规Warning, //2 告警Error ,  //3  一般错误Tatal ,  //4 致命错误Uknown//未知错误
};static  std::string tolevelstring(int level)//将数字转化为字符串
{switch(level){case  Debug : return "Debug";case Info : return "Info";case Warning : return "Warning";case  Error : return "Error";case Tatal : return "Tatal";default: return "Uknown";}
}
std::string gettime()//获取时间
{time_t curr=time(nullptr);//获取time_tstruct tm *tmp=localtime(&curr);//将time_t 转换为 struct tm结构体char buffer[128];snprintf(buffer,sizeof(buffer),"%d-%d-%d %d:%d:%d",tmp->tm_year+1900,tmp->tm_mon+1,tmp->tm_mday,tmp->tm_hour,tmp->tm_min,tmp->tm_sec);return buffer;}
void logMessage(int level, const char*format,...)
{//日志左边部分的实现char logLeft[1024];std::string level_string=tolevelstring(level);std::string curr_time=gettime();snprintf(logLeft,sizeof(logLeft),"%s %s %d",level_string.c_str(),curr_time.c_str());//日志右边部分的实现char logRight[1024]; va_list p;//p可以看作是1字节的指针va_start(p,format);//将p指向最开始vsnprintf(logRight,sizeof(logRight),format,p);va_end(p);//将指针置空//打印日志 printf("%s%s\n",logLeft,logRight);//保存到文件中FILE*fp=fopen( filename.c_str(),"a");//以追加的方式 将filename文件打开//fopen打开失败 返回空指针if(fp==nullptr){return;}fprintf(fp,"%s%s\n",logLeft,logRight);//将对应的信息格式化到流中fflush(fp);//刷新缓冲区fclose(fp);
}

Main.cc(回调函数调用)

#include<vector>
#include<memory>
#include"HttpServer.hpp"
#include"Util.hpp"using namespace std;
const std::string SEP="\r\n";const std::string defaultHomePage ="index.html";//默认首页
const std::string webRoot="./wwwroot";//web根目录class HttpRequest
{
public:HttpRequest():path_(webRoot){}~HttpRequest(){}void Print(){logMessage(Debug,"method:%s,url:%s,version:%s",method_.c_str(),url_.c_str(),httpVersion_.c_str());/*for(const auto&line:body_){logMessage(Debug,"-%s",line.c_str());}*/logMessage(Debug,"path:%s",path_.c_str());logMessage(Debug,"suffix:%s",suffix_.c_str());}
public:std::string method_;//请求方法std::string url_;   //URLstd::string httpVersion_;//请求版本std::vector<std::string> body_;//请求报头std::string path_; //想要访问的资源std::string suffix_;//后缀 用于判断访问是什么资源
};//反序列化 将字符串转化为 HttpRequest结构体
HttpRequest Deserialize(std::string &message)
{HttpRequest req;std::string line=Util::ReadOneLine(message,SEP);//在message中根据分隔符读走状态行//将请求行分为 请求方法 URL 协议版本Util::ParseRequestLine(line,&req.method_,&req.url_,&req.httpVersion_);//解析请求行logMessage(Info,"method:%s,url:%s,version:%s",req.method_.c_str(),req.url_.c_str(),req.httpVersion_.c_str());//将状态行处理后,剩余请求报头,每一次取一行 将其放入body中while(!message.empty()){line=Util::ReadOneLine(message,SEP);req.body_.push_back(line);}req.path_ += req.url_;   //path_在构造时,已经默认为web根目录了,所以只需加上资源即可//只有一个'/',需加上默认首页if(req.path_[req.path_.size()-1]=='/'){req.path_+= defaultHomePage;}auto pos=req.path_.rfind(".");if( pos==std::string::npos)//没找到{ req.suffix_=".html";//默认为html}else {req.suffix_=req.path_.substr(pos);}return req;
}std::string GetContentType(std::string &suffix)//判断是哪一种资源的后缀
{std::string content_type =" Content-Type: ";if(suffix==".html"|| suffix==".htm"){content_type+="text/html";}else if(suffix==".css "){content_type+="text/css";}else if(suffix==".js"){content_type+="application/x-javascript";}else if(suffix==".png"){content_type+="image/png";}else if(suffix==".jpg"){content_type+="image/jpeg";}else {}return content_type+SEP;
}
std::string HandlerHttp( std::string &message)//回调函数的实现
{//1.读取请求//request 一定是一个完整的http请求报文//给别人返回的 http responsecout<<"---------------------------"<<endl;//2.反序列化和分析请求HttpRequest req =  Deserialize(message);req.Print();//3.使用请求std::string body;//有效载荷Util::ReadFile(req.path_,&body);//将path路径中的内容交给body字符串中//做一次响应 //状态行 : 协议版本 状态码 状态码描述//200表示请求是正确的std::string response="HTTP/1.0 200 OK"+SEP;//状态码//Content-Length获取有效载荷长度response+="Content-Length: "+std::to_string(body.size())+SEP;//响应报头response+=GetContentType(req.suffix_);response += SEP;  //分隔符response += body; //有效载荷   return response;
}int main(int argc,char* argv[]){  if(argc!=2){exit(USAGE_ERR);}uint16_t port=atoi(argv[1]);std::unique_ptr<HttpServer> tsvr(new HttpServer(HandlerHttp,port));tsvr->InitServer();tsvr->Start();return 0; }

makefile

	httserver:Main.ccg++ -o $@ $^ -std=c++11 -lpthread
.PHONY:clean
clean:rm -f httserver

Sock.hpp(TCP套接字)

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<unistd.h>
#include"Log.hpp"
#include"Err.hpp"static const int  gbacklog=32;
static const int defaultfd=-1;
class Sock
{public:Sock() //构造:_sock(defaultfd){}void  Socket()//创建套接字{_sock=socket(AF_INET,SOCK_STREAM,0);if(_sock<0)//套接字创建失败{logMessage( Tatal,"socket error,code:%s,errstring:%s",errno,strerror(errno));exit(SOCKET_ERR);}}void Bind(uint16_t port)//绑定{struct sockaddr_in local;memset(&local,0,sizeof(local));//清空local.sin_family=AF_INET;//16位地址类型local.sin_port= htons(port); //端口号local.sin_addr.s_addr= INADDR_ANY;//IP地址//若小于0,则绑定失败if(bind(_sock,(struct sockaddr*)&local,sizeof(local))<0){logMessage( Tatal,"bind error,code:%s,errstring:%s",errno,strerror(errno));exit(BIND_ERR);}}void Listen()//将套接字设置为监听状态{//小于0则监听失败if(listen(_sock,gbacklog)<0){logMessage( Tatal,"listen error,code:%s,errstring:%s",errno,strerror(errno));exit(LISTEN_ERR);}}int Accept(std::string *clientip,uint16_t * clientport)//获取连接{struct sockaddr_in temp;socklen_t len=sizeof(temp);int sock=accept(_sock,(struct sockaddr*)&temp,&len);if(sock<0){logMessage(Warning,"accept error,code:%s,errstring:%s",errno,strerror(errno));}else {//inet_ntoa 4字节风格IP转化为字符串风格IP*clientip = inet_ntoa(temp.sin_addr) ; //客户端IP地址//ntohs 网络序列转主机序列*clientport= ntohs(temp.sin_port);//客户端的端口号}return sock;//返回新获取的套接字}int Connect(const std::string&serverip,const uint16_t &serverport )//发起链接{struct sockaddr_in server;memset(&server,0,sizeof(server));//清空server.sin_family=AF_INET;//16位地址类型server.sin_port=htons(serverport);//端口号//inet_addr  字符串风格IP转化为4字节风格IPserver.sin_addr.s_addr=inet_addr(serverip.c_str());//IP地址//成功返回0,失败返回-1return  connect(_sock, (struct sockaddr*)&server,sizeof(server));}int Fd(){return _sock;}void Close(){if(_sock!=defaultfd){close(_sock);}}~Sock()//析构{}private:int _sock;};

Until.hpp

#pragma once
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<sstream>
#include"Log.hpp"class Util
{public:static bool  ReadFile(const std::string &path,std::string *fileContent  )//读取整个文件内容{//1.获取文件本身的大小struct stat st;//定义一个struct stat 类型的结构体int n=stat(path.c_str(),&st);if(n<0)//读取失败{return false;}int size = st.st_size;//2.调整string的空间fileContent->resize(size); //3.读取int fd=open(path.c_str(),O_RDONLY);if(fd<0)//读取失败{return false;}read(fd,(char*)fileContent->c_str(),size);//从文件fd中读取,放到fileContentclose(fd);logMessage( Info,"read file %s done ",path.c_str());return true;}//在message中根据分隔符取出状态行static std::string ReadOneLine( std:: string &message,const std::string &sep){auto pos=message.find(sep);//查找sep分隔符,找到则返回pos位置的下标while(pos==std::string::npos)//没找到{return "";}std::string s=message.substr(0,pos);//取[0,pos]区间作为子串message.erase(0,pos+sep.size());从下标为0处开始 删除pos+sep.size()个字符return s;}//将请求行分=解析为 请求方法 URL 协议版本static bool ParseRequestLine(const std::string &line,std::string * method,std::string *url,std::string *httpVersion){//以空格为单位,对内容做提取std::stringstream ss(line);ss >> *method >> *url >> *httpVersion;return true;}};

相关文章:

【计算机网络】HTTP(上)

文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…...

Maven学习记录

一、Maven是什么 简单来说Maven是一个标准化的java管理和构建工具&#xff0c;它提供了一系列规范&#xff0c;包括项目结构&#xff0c;构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;&#xff0c;依赖管理等。 标准化就是定下…...

H5游戏开发H5休闲小游戏定制H5软件定制

H5游戏是一种运行在网页浏览器中的HTML5技术开发的游戏。H5休闲小游戏通常具有简单的玩法&#xff0c;易于上手&#xff0c;适合快速的娱乐。以下是开发H5休闲小游戏的一般步骤&#xff1a; 1. 制定游戏开发概念&#xff1a; 确定H5游戏开发的主题和玩法。休闲小游戏通常应该…...

Spring基础及IoC容器的理解

Spring概念&#xff1a; 通常所说的Spring指的是Spring Framewprk(Spring框架)&#xff0c;它是一个开源的框架。用一句话概括就是&#xff1a;Spring是包含了众多工具方法的IoC容器。 什么是容器&#xff1f; 容器是用来容纳某种物品的装置&#xff0c;在之前的学习中&…...

护网行动为什么给的钱那么多

因为护网行动是国家应对网络安全问题所做的重要布局之一。 随着大数据、物联网、云计算的快速发展&#xff0c;愈演愈烈的网络攻击已经成为国家安全的新挑战。国家关键信息基础设施可能时刻受到来自网络攻击的威胁。网络安全的态势之严峻&#xff0c;迫切需要我们在网络安全领…...

软考知识汇总-计算机系统

文章目录 1 计算器 1 计算器 算术逻辑单元&#xff08;ALU&#xff09;&#xff1a;运算器重要组成部件&#xff0c;负责处理数据&#xff0c;实现对数据的算数运算和逻辑运算。累加寄存器&#xff08;AC&#xff09;&#xff1a;简称累加器&#xff0c;为ALU提供数据并暂存运…...

OpenCV 11(图像金字塔)

一、 图像金字塔 **图像金字塔**是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说, 图像金字塔是同一图像不同分辨率的子图集合. 图像金字塔最初用于机器视觉和图像压缩。其通过梯次向下采…...

Linux学习笔记-Ubuntu系统用户、群组、权限管理

一、概述 本文记录Ubuntu系统下通过命令操作用户账户进行管理。 Ubuntu系统版本&#xff1a; Linux ubuntu 5.15.0-1034-raspi #37-Ubuntu SMP PREEMPT Mon Jul 17 10:02:14 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux 注&#xff1a;查看系统版本号的指令如下 uname -…...

文章预览 安防监控/视频存储/视频汇聚平台EasyCVR播放优化小tips

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…...

Nand Flash的特性及烧录问题

目录 前言 一 Nand flash的特性 1 存储结构 2 OOB区域 3 位翻转 4 坏块及ECC 二 Nand系统裸片量产烧录 1 坏块处理策略 2 分区(Partition) 3 纠错码(Error Correction Codes&#xff0c;ECC) 4. 擦除坏块 &#x1f388;个人主页&#x1f388;&#xff1a;linux_嵌入式…...

【React 】useLayoutEffect 和 useEffect的区别

useLayoutEffect和useEffect是React中常用的两个Hook&#xff0c;它们的主要区别在于触发时机。 useEffect会在渲染完成后异步执行&#xff0c;不会阻塞浏览器的绘制操作。它适用于需要在组件渲染后执行副作用的情况&#xff0c;例如数据的获取、订阅事件等。它不会阻止屏幕更新…...

oracle数据库常见的优化步骤与脚本

要优化 Oracle 数据库的性能,可以按照以下步骤进行: 1. 性能分析和诊断:首先,使用 Oracle 提供的性能分析工具(如 AWR 报告、ASH 报告)对数据库进行分析和诊断。这些报告可以帮助您确定数据库的性能瓶颈和潜在问题。 2. 优化 SQL 查询语句:针对频繁执行的 SQL 查询语句…...

并发内存池(C++)

项目简介 这个项目是实现了一个高效的并发内存池。它的原型的goggle的一个开源项目tcmalloc&#xff0c;即thread-cache malloc&#xff08;线程缓存的malloc&#xff09;&#xff0c;实现了高效多线程的内存管理&#xff0c;可实现对系统提供的内存分配函数malloc和free的替代…...

本地起一个VUE 前端项目

#安装 安装 Vue CLI 3&#xff1a; Vue CLI是一个用于创建和管理Vue项目的命令行工具 npm install -g vue/cli#查看更详细的告警信息 npm install -g vue/cli --verbose#检查项目的依赖关系 ,保持项目的依赖关系最新和安全 npm audit npm audit fix#查看版本 vue --version#创建…...

Python爬虫:Selenium的介绍及简单示例

Selenium是一个用于自动化Web应用程序测试的开源工具。它允许开发人员模拟用户在浏览器中的交互行为&#xff0c;以便自动执行各种测试任务&#xff0c;包括功能测试、性能测试和回归测试等。Selenium最初是为Web应用程序测试而创建的&#xff0c;但它也可用于Web数据抓取和其他…...

每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题

食用指南&#xff1a;本文为作者刷题中认为有必要记录的题目 前置知识&#xff1a;回溯法经典问题之全排列 ♈️今日夜电波&#xff1a;带我去找夜生活—告五人 0:49 ━━━━━━️&#x1f49f;──────── 4:59 …...

python循环遍历字典: title_content_list.append([key, value])print(ti

示例示例Python循环遍历字典的方法有以下几种&#xff1a;使用for...in循环&#xff1a; Python循环遍历字典的方法有以下几种&#xff1a; 1. 使用for...in循环&#xff1a; python dict {name:Tom, age:20, gender:male} # 遍历所有的键 for key in dict:print(key) # 遍…...

Redis List类型命令 - Set类型命令 - SortedSet类型命令

目录 List类型 什么是双向链表呢&#xff1f; List类型的特征&#xff1a; List的常用命令 LPUSH和RPUSH的区别&#xff1a; LPOP和RPOP的区别&#xff1a; LPUSH和RPUSH的使用 LPOP和RPOP的使用 LRANGE key star end&#xff1a;返回一段距离范围内所有的元素 BLPOP…...

等级保护 —— 安全控制点,安全要求

等级保护 —— 安全控制点&#xff0c;安全要求 安全物理环境&#xff1a; 物理位置选择 a&#xff09;机房场地应选择在具有防震、防风和防雨等能力的建筑内&#xff1b; 1&#xff09;核查是否有建筑物抗震设防审批文档。2&#xff09;核查是否有雨水渗漏的痕迹。3&#…...

nginx-缓存

disk cache&#xff1a;磁盘缓存数据&#xff0c;有时间延迟&#xff0c;但是非常小&#xff0c;相对于直接请求服务器返回 对于用户来说基本无感知。 memory cache&#xff1a;磁盘缓存数据&#xff0c;基本上没有时间延迟 协商缓存&#xff08;nginx自带功能&#xff0c; 不…...

layui使用富文本已经使用第三方插件Kz.layedit来优化layui的富文本

官方提供的编辑器功能太少 没有字体颜色&#xff0c;不能传图片&#xff0c;视频等扩展 官方文档说的很清楚&#xff0c;简易的富文本使用layui提供的的确十分方便&#xff0c;但是缺少的元素很多。像什么标题&#xff0c;元素&#xff0c;等简单的都没有。小编我当初页为此苦…...

某公司二面面试题总结

你们公司开发遵守怎么样的代码规范&#xff1f; 当编写Java代码时&#xff0c;遵守良好的代码规范对于代码的可读性和可维护性至关重要。以下是一些更详细的Java代码规范建议&#xff1a; 命名规范&#xff1a; 类名应该采用名词或名词短语&#xff0c;使用驼峰命名法&#xf…...

Ubuntu编译运行socket.io

本篇文章记录一下自己在ubuntu上编译运行socket.io的过程&#xff0c;客户端选用的是socket.io的c的库&#xff0c;编译起来倒不难&#xff0c;但是说到运行的话&#xff0c;对我来说确实是花了点功夫。毕竟程序要能运行起来才能更方便地去熟悉代码&#xff0c;因此今天我就记录…...

h5开发网站-页面内容不够高时,如何定位footer始终位于页面的最底部

一、问题描述&#xff1a; 在使用h5开发页面时&#xff0c;会遇到这个情况&#xff1a;当整个页面高度不足以占满显示屏一屏&#xff0c;页脚不是在页面最底部&#xff0c;影响用户视觉。想让页脚始终在页面最底部&#xff0c;我们可能会想到用&#xff1a; 1.min-height来控…...

手机也可以搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站【cpolar实现公网访问】

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…...

Support for password authentication was removed on August 13, 2021 解决方案

打开你的github&#xff0c;Setting 点击Developer settings。 点击generate new token 按照需要选择scope 生成token&#xff0c;以后复制下来。 给git设置token样式的remote url git remote set-url origin https://你的tokengithub.com/你的git用户名/仓库名称.git然后就可…...

MPP 与 SMP 的区别,终于有人讲明白了【文末送书】

文章目录 导读01 SMP1. SMP 的典型特征2. SMP的优缺点 02 分布式MPP计算架构1. MPP 架构核心原理2. MPP 典型特征3. MPP优缺点 写作末尾 导读 当今数据计算领域主要的应用程序和模型可大致分为在线事务处理&#xff08;On-line Transaction Processing &#xff0c;OLTP&#…...

华为OD机试真题【寻找最大价值的矿堆】

1、题目描述 【寻找最大价值的矿堆】 给你一个由 ‘0’&#xff08;空地&#xff09;、’1’&#xff08;银矿&#xff09;、’2’&#xff08;金矿&#xff09;组成的的地图&#xff0c; 矿堆只能由上下左右相邻的金矿或银矿连接形成。超出地图范围可以认为是空地。 假设银矿…...

Java Maven 项目读取项目版本号

java读取 pom.xml 文件中设置的版本号 1. 在 src/main/resources/下新建 app.properties 文件&#xff1a; app.version${project.version} 2. 在pom.xml 中增加 <build> <resources> <resource> <directory>src/main/resources</di…...

Lesson4-1:OpenCV图像特征提取与描述---角点特征

学习目标 理解图像的特征知道图像的角点 1 图像的特征 大多数人都玩过拼图游戏。首先拿到完整图像的碎片&#xff0c;然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序&#xff0c;那计算机就也会玩拼图游戏了。 在拼图时&#xff…...