51 html网页

上节内容的网页是hello world的字符串,但实际上网页应该是html格式的这种超文本标记语言,这一节完善一下网页的各种格式和内容

分文件

实际服务器中,网页的界面应该单独放一个文件,服务器从文件里读取网页的内容
先创建一个wroot文件夹专门用来放网页文件,创建主页,index.html。一个网址网页肯定不止一个,再创建两个分页,分别放在a/b目录和x/y目录下
在这里插入图片描述

网页的显示根据用户请求的url,请求哪个网页显示哪个。所以要对用户的请求反序列化,得到各部分的内容。为了得到url,请求行每部分内容都要取到。创建一个包含各个内容的类
成员变量包含报头部分和正文部分,报头部分的请求方法,url,请求版本,再将url分割出请求的路径
在这里插入图片描述

成员函数将报文内容解析为两部分。参数是报文字符串,先找第一个\r\n,找到的就是请求行,加入到reqhead的0下标,然后不停找\r\n,没找到一个就是一行报文,加入到reqhead,接着删除读取到的内容,继续后面的内容。如果这行内容是空,就是到了空行。剩下的内容就是正文,放入text

void deserialize(string message)
    {
        while (true)
        {
            size_t pos = message.find(seq);
            if (pos == string::npos)
            {
                break;
            }

            string temp = message.substr(0, pos);
            if (temp.empty())
            {
                break;
            }
            _reqhead.push_back(temp);
            // pos + seq
            message.erase(0, pos + seq.size());
        }

        _text = message;
    }

将报头内容的请求行分离出来,得到url,获取到用户请求的网页路径
stringstream可以自动按空格分隔内容,流符号提取到变量中。wroot变量是目录初始常量
在这里插入图片描述

filepath先赋值为初始量,如果url是根目录,拼上主页的内容。如果是分页,拼接上url

void parse()
    {
        stringstream s(_reqhead[0]);
        s >> _method >> _url >> _httpversion;
        _filepath = wroot;
        // wroot/index.html
        if (_url == "/" || _url == "/index.html")
        {
            _filepath += "/";
            _filepath += homepage;
        }
        else
        {
            // 用户/a/b  文件./wroot/a/b
            _filepath += _url;
        }

    }

debugprint函数将成员变量的值都打印显示

void debugprint()
    {
        for (auto &line : _reqhead)
        {
            cout << "---------------------------" << endl;
            cout << line << "\n";
        }

        cout << "method:" << _method << endl;
        cout << "url:" << _url << endl;
        cout << "http-version:" << _httpversion << endl;
        cout << "file_path:" << _filepath << endl;
        cout << _text << endl;
    }

在收到报文后,实例Request类调用函数得到变量值
text的内容用函数获取,传入用户访问的哪个文件,读取内容返回字符串
在这里插入图片描述

ReadHtmlContent
文件打开失败返回404,成功读取所有内容返回

static string ReadHtmlContent(const string htmlpath)
    {
        ifstream in(htmlpath);
        if (!in.is_open())
        {
            return "404";
        }

        string line;
        string content;
        while (getline(in, line))
        {
            content += line;
        }

        in.close();
        return content;
    }

html基本格式

首先用<html></html>表明是html格式,<head></head>中可以设置中文编码为utf-8,不然中文会乱码。<body></body>内容中是网页主体内容,将hello world改为下面格式

<!DOCTYPE html>
<html html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    hello world

</body>

</html>

开启服务端,访问
在这里插入图片描述

标题

一共有六级标题,h1-h6

<h1>内容</h1>

在这里插入图片描述

跳转

在网页中,点击某几个字就会跳转到新的网页

<a href=url>显示内容</a>

将a/b文件夹下的hello.html作为第二张网页,x/y下的world.html作为第三张网页。主页可以跳转第二张,第二张可以返回主页或跳转第三页,第三页返回主页
以主页的跳转举例:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

也可以直接访问web其他目录,/的格式拼到后面

获取输入

在百度还是其他登录网页中,需要输入内容,服务器获取到提供对应的服务,这个需要用到表单

<form action="action_page.php"  method="GET">
First name:<br>
<input type="text" name="firstname" value="Mickey">
<br>
Last name:<br>
<input type="text" name="lastname" value="Mouse">
<br><br>
<input type="submit" value="Submit">
</form> 

GET

方法默认是get
action是将输入内容传递给谁,可以是一个程序,收到内容后程序替换执行登录验证,提交方法有get和post,下面的name是url后输入值的变量名。value是默认显示值。type是输入框类型

<!DOCTYPE html>
<html html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
<form action="/a/b/hello.html" method="GET">
    name:<input type="text" name="name"><br>
    password:<input type="password" name="pass">
    <br><br>
    <input type="submit" value="提交">
</form>

</body>

</html>

在这里插入图片描述
在这里插入图片描述

url的 ?号前面是访问路径,后面是刚填入提交的参数

POST

在这里插入图片描述

post方法的提交内容在正文里

GET方法通过URL进行提参,参数数量受限的,不私密
POST方法也支持参数提交,采用请求的正文提交参数,更私密一些
安全问题都会存在,安全可以在加密方面完善

HTTP的方法

方法说明支持的版本
GET获取资源1.0、1.1
POST传输实体主体1.0、1.1
PUT传输文件1.0、1.1
HEAD获得报文首部1.0、1.1
DELETE删除文件1.0、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINK断开连接关系1.0

大部分方法用的都是GET和POST,CONNECT一般是中间连接使用的方法,其他有的浏览器禁止使用

HTTP的状态码

状态码类别原因短语
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器处理请求出错

最常见的状态码,比如200(OK),404(Not Found),302(Redirect,重定向),502(Bad Gateway)

错误页面

上面的网页如果用户访问不存在的网页会打不开,实际上,如京东,如果访问的网页不存在,会提示自己的404页面,未找到网页,同时可以返回主页。我们也需要制作自己的404页面,如果访问的不存在,则显示这个页面

创建一个err页面,显示错误内容

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>404 Not Found</title>
    <style>
        body {
            text-align: center;
            padding: 150px;
        }

        h1 {
            font-size: 50px;
        }

        body {
            font-size: 20px;
        }

        a {
            color: #008080;
            text-decoration: none;
        }

        a:hover {
            color: #005F5F;
            text-decoration: underline;
        }
    </style>
</head>

<body>
    <div>
        <h1>404</h1>
        <p>页面未找到<br></p>
        <p>
            您请求的页面可能已经被删除、更名或者您输入的网址有误。<br>
            请尝试使用以下链接或者自行搜索:<br><br>
            <a href="https://www.baidu.com">百度一下></a>
        </p>
    </div>
</body>

</html>

如果读到的网页内容是空,说明是错误页面。重新读取刚刚创建的错误页面返回

在这里插入图片描述
响应行也得修改
在这里插入图片描述
页面显示如下:
在这里插入图片描述

响应内容
在这里插入图片描述

HTTP常见Header

Content-Type:数据类型(text/html等)
Content-Length:Body的长度
Host:客户端告知服务器,所请求的资源是在哪个主机的端口上
User-Agent:声明用户的操作系统和浏览器版本信息
referer:当前页面是从哪个页面跳转过来的
location:搭配3xx状态码使用,告诉客户端接下来要去访问哪里
Cookie:用于在客户端存储少量信息,通常用于实现会话(session)功能

重定向

3XX状态码是重定向,重定向用于服务器暂时维护,引导客户到新的网页。或者服务网址已更换,引导旧用户去新地址
在这里插入图片描述
浏览器访问服务器,服务器返回3xx和新服务,浏览器再次对新服务发起访问

永久重定向:301,308
临时重定向:302,303, 307
其他重定向:304

报头也得添加location字段,重定向到导航页
在这里插入图片描述在这里插入图片描述

这时访问就会跳转到目标网页
在这里插入图片描述

长短连接

一个网页中会有很多图片视频等,每一个都算一个资源,连接每次只能获取一个资源,再获取资源必须重新请求,这是短连接这样一个网页有100张图片就要请求一百次,显然是低效的。建立一个tcp连接,发送和返回多个http的request和response,就是长连接

在这里插入图片描述
长连接需要添加Connection:keep-alive报头

图片

要在服务器里加载图片,报头里需要加入图片的类型,content-type字段对应数据类型,.html是网页文件后缀,.jpg就是图片类型,对应类型加入报头的内容如下:

text/html : HTML格式
text/plain :纯文本格式      
text/xml :  XML格式
image/gif :gif图片格式    
image/jpeg :jpg图片格式 
image/png:png图片格式
image/jpg:jpg图片格式
image/pdf:pdf格式

找几张图片,放在wroot文件夹下的image文件夹里。在网页文件中加入图片格式内容
在这里插入图片描述
html图片格式:

Pulpit rock

src是文件路径,alt是图片加载不出来显示的文字
在这里插入图片描述

长连接会根据src自动发起后续的请求
想在报头中添加content,需要从url中获得对应类型的协议内容,所以request类里添加一个成员后缀,从url中分割出.后面的文件类型

在这里插入图片描述在这里插入图片描述
有了后缀需要一个对照表,返回对应类型的内容,用一个map类型,初始化插入几个基本类型

在这里插入图片描述

提供函数,用参数对应表返回格式内容:
在这里插入图片描述
显示效果:
在这里插入图片描述

cookie

这个是用来登录用户的会话保持功能,浏览器在访问一个网页时,需要登录,登录成功后往浏览器写入cookie文件,当下一次打开这个网页时,用户会自动登录。cookie分为文件及和内存级,内存级的关闭浏览器就会失效。cookie有时间限制,如果不设置就由浏览器管理
在这里插入图片描述

加入cookie
在这里插入图片描述
以后每次访问,访问会自动带上cookie:
在这里插入图片描述

全代码

server.hpp

#include <fstream>
#include <pthread.h>
#include <vector>
#include <sstream>
#include <unordered_map>
#include "Socket.hpp"

const uint16_t port = 8000;

const string wroot = "./wroot";
const string seq = "\r\n";
const string homepage = "index.html";

class server;
class ThreadData
{
public:
    int _sockfd;
    server *_this;
};

class Request
{
public:
    void deserialize(string message)
    {
        while (true)
        {
            size_t pos = message.find(seq);
            if (pos == string::npos)
            {
                break;
            }

            string temp = message.substr(0, pos);
            if (temp.empty())
            {
                break;
            }
            _reqhead.push_back(temp);
            // pos + seq
            message.erase(0, pos + seq.size());
        }

        _text = message;
    }

    void parse()
    {
        stringstream s(_reqhead[0]);
        s >> _method >> _url >> _httpversion;
        _filepath = wroot;
        // wroot/index.html
        if (_url == "/" || _url == "/index.html")
        {
            _filepath += "/";
            _filepath += homepage;
        }
        else
        {
            // 用户/a/b  文件./wroot/a/b
            _filepath += _url;
        }

        auto pos = _filepath.rfind(".");
        if (pos == string::npos)
        {
            _suffix = ".html";
        }
        else
        {
            _suffix = _filepath.substr(pos);
        }

    }

    void debugprint()
    {
        for (auto &line : _reqhead)
        {
            cout << "---------------------------" << endl;
            cout << line << "\n";
        }

        cout << "method:" << _method << endl;
        cout << "url:" << _url << endl;
        cout << "http-version:" << _httpversion << endl;
        cout << "file_path:" << _filepath << endl;
        cout << "content-type: " << _suffix << endl;
        cout << _text << endl;
    }

public:
    vector<string> _reqhead;
    string _text;

    string _method;
    string _url;
    string _httpversion;
    string _filepath;

    string _suffix;
};

class server
{
public:
    void ContentTable()
    {
        _content_type.insert({".html", "text/html"});
        _content_type.insert({".jpg", "image/jpeg"});
        _content_type.insert({".png", "image/png"});

    }

    void start()
    {
        ContentTable();
        _listensock.Socket();
        _listensock.Bind(port);
        _listensock.Listen();

        cout << "server init done" << endl;
        for (;;)
        {
            string ip;
            uint16_t port;
            int sockfd = _listensock.Accept(&ip, &port);
            if (sockfd > 0)
            {
                cout << "get a new link:" << ip << "," << port << endl;
                pthread_t tid;
                ThreadData *data = new ThreadData;
                data->_sockfd = sockfd;
                data->_this = this;
                pthread_create(&tid, nullptr, routine, data);
            }
        }
    }

    static void *routine(void *args)
    {
        pthread_detach(pthread_self());
        ThreadData *dat = static_cast<ThreadData *>(args);
        dat->_this->HandlerHttp(dat->_sockfd);
        close(dat->_sockfd);
        delete dat;
        return nullptr;
    }

    string SuffixDesc(const string& suffix)
    {
        auto n = _content_type.find(suffix);
        if (n == _content_type.end())
        {
            return ".html";
        }
        else
        {
            return _content_type[suffix];
        }
    }

    void HandlerHttp(int sockfd)
    {
        char buff[1024];
        ssize_t n = recv(sockfd, buff, sizeof(buff) - 1, 0);
        if (n > 0)
        {
            buff[n] = 0;
            // 假设读到了完整报文
            // 分割请求,获取请求文件
            
            Request req;
            req.deserialize(buff);
            req.parse();
            req.debugprint();
            // 响应内容
          
            string text = ReadHtmlContent(req._filepath); //失败
            bool ok = true;
            if (text.empty())
            {
                ok = false;
                string err_html = wroot;
                err_html += "/err.html";
                text = ReadHtmlContent(err_html);
            }

            string response_line;
            if (ok)
            {
                response_line = "HTTP/1.0 200 OK\r\n";
            }
            else
            {
                response_line = "HTTP/1.0 404 Not Found\r\n";
            }     

            //response_line = "HTTP/1.0 302 Found\r\n";
            string response_head = "Content-Length: ";
            response_head += to_string(text.size());
            response_head += "\r\n";
            //response_head += "location: https://home.firefoxchina.cn/\r\n";
            response_head += "Content-Type: ";
            response_head += SuffixDesc(req._suffix);
            //cout << "Content-Type: " << SuffixDesc(req._suffix) << endl;
            response_head += "\r\n";
            response_head += "Set-Cookie: name=www&&pass=123\r\n";
            string block_line = "\r\n";

            string response = response_line;
            response += response_head;
            response += block_line;
            response += text;

            //cout << response << endl;
            send(sockfd, response.c_str(), response.size(), 0);
        }
    }

    // 读取html
    static string ReadHtmlContent(const string htmlpath)
    {
        // 图片数据需要二进制读取
        ifstream in(htmlpath, ios::binary);
        in.seekg(0, ios_base::end);
        std::streampos len = in.tellg();
        in.seekg(0, ios_base::beg);

        string content;
        content.resize(len);
        in.read((char *)content.c_str(), content.size());
        // if (!in.is_open())
        // {

        //     return "";
        // }

        // string line;
        // string content;
        // while (getline(in, line))
        // {
        //     content += line;
        // }

        in.close();
        return content;
    }

private:
    Sock _listensock;
    unordered_map<string, string> _content_type;
};

index,html

<!-- <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #header {
            background-color: black;
            color: white;
            text-align: center;
            padding: 5px;
        }

        #nav {
            line-height: 30px;
            background-color: #eeeeee;
            height: 300px;
            width: 100px;
            float: left;
            padding: 5px;
        }

        #section {
            width: 350px;
            float: left;
            padding: 10px;
        }

        #footer {
            background-color: black;
            color: white;
            clear: both;
            text-align: center;
            padding: 5px;
        }
    </style>
</head>

<body>

    <div id="header">
        <h1>City Gallery</h1>
    </div>

    <div id="nav">
        London<br>
        Paris<br>
        Tokyo<br>
    </div>

    <div id="section">
        <h2>London</h2>
        <p>
            London is the capital city of England. It is the most populous city in the United Kingdom,
            with a metropolitan area of over 13 million inhabitants.
        </p>
        <p>
            Standing on the River Thames, London has been a major settlement for two millennia,
            its history going back to its founding by the Romans, who named it Londinium.
        </p>
    </div>
    <a href="http://106.54.46.147:8000/a/b/hello.html">跳转 第二页</a>
    <a href="https://im.qq.com">跳转 qq</a>
    <div id="footer">
        Copyright ? W3Schools.com
    </div>
</body>

</html> -->

<!-- <!DOCTYPE html>
<html html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <a href="http://106.54.46.147:8000/a/b/hello.html">跳转 第二页</a>
    <a href="https://im.qq.com">跳转 qq</a>

</body>

</html> -->

<!DOCTYPE html>
<html html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    
    <body>
        <form action="/a/b/hello.html" method="POST">
            name:<input type="text" name="name"><br>
            password:<input type="password" name="pass">
            <br><br>
            <input type="submit" value="提交">
        </form>
        <img src="/image/1.jpg" alt="1.jpg" width="617" height="816"> <!--根据src自动发起第二次请求-->>
        <img src="/image/2.jpg" alt="2.jpg" width="574" height="815">
        <img src="/image/3.png" alt="3.png" width="617" height="816">
    
    </body>
    
    </html>

hello.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <h1>hello</h1>
    <h1>hello</h1>
    <h1>hello</h1>
    <h1>hello</h1>
    <h1>hello</h1>
    <h1>hello</h1>
    <h1>这是第一张网页</h1>
    <a href="http://106.54.46.147:8000/x/y/world.html">跳转 第三页</a>
    <a href="http://106.54.46.147:8000">返回主页</a>
</body>

</html>

world.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <h1>wrold</h1>
    <h1>wrold</h1>
    <h1>wrold</h1>
    <h1>wrold</h1>
    <h1>wrold</h1>
    <h1>wrold</h1>
    <h1>这是第二张网页</h1>
    <a href="http://106.54.46.147:8000">返回主页</a>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/661748.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PLC集成BL121PO网关优化智能电网的远程管理PLC转OPC UA协议

随着工业自动化技术的不断发展&#xff0c;智能电网等复杂系统对于设备之间高效通信的需求日益增加。PLC转OPC UA协议转换网关BL121PO作为一款领先的协议转换设备&#xff0c;通过其独特的设计和功能&#xff0c;为用户提供了高效、安全的PLC接入OPC UA的解决方案。 设备概述 …

R语言入门 | 使用 dplyr 进行数据转换

3.1简介 3.1.1准备工作 3.1.2 dplyr 基础 • 按值筛选观测&#xff08; filter() &#xff09;。 • 对行进行重新排序&#xff08; arrange() &#xff09;。 • 按名称选取变量&#xff08; select() &#xff09;。 • 使用现有变量的函数创建新变量&#xff08; …

STM32实验之USART串口发送+接受数据(二进制/HEX/文本)

涉及三个实验&#xff1a; 1.USART串口发送和接收数据 我们使用的是将串口封装成为一个Serial.c模块.其中包含了 void Serial_Init(void);//串口初始化 void Serial_SendByte(uint8_t Byte);//串口发送一个字节 void Serial_SendArray(uint8_t *Array,uint16_t Length);//…

Vue3项目练习详细步骤(第三部分:文章分类页面模块)

文章分类列表 主体结构 接口文档 文章分类列表查询接口数据绑定 Pinia状态管理库 axios请求拦截器 Pinia持久化插件-persist 未登录统一处理 添加文章分类 主体结构 接口文档 绑定请求数据 编辑文章分类 弹框结构 数据回显 接口文档 绑定请求数据 删除分类 …

WAF几种代理模式详解

WAF简介 WAF的具体作用就是检测web应用中特定的应用&#xff0c;针对web应用的漏洞进行安全防护&#xff0c;阻止如SQL注入&#xff0c;XSS&#xff0c;跨脚本网站攻击等 正向代理 WAF和客户端与网络资源服务器都建立连接&#xff0c;但是WAF 的工作口具有自己的 IP 地址&…

【408真题】2009-28

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

智慧排水监测系统方案

智慧排水监测系统方案 智慧排水监测系统作为现代城市基础设施管理的重要组成部分&#xff0c;旨在通过先进的信息技术手段&#xff0c;实现对城市排水系统的全面、实时、高效的远程监控与管理。该系统整合了物联网技术、大数据分析、云计算平台与人工智能算法&#xff0c;不仅…

国产操作系统上apt命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上apt命令详解 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用apt命令的详解文章。apt&#xff08;Advanced Package Tool&#xff09;是Debian及其衍生发行版&#xff08;如统信UOS…

Adobe Camera Raw 11 for Mac/win:摄影后期处理的革命性飞跃

在数字摄影的世界里&#xff0c;RAW格式以其未压缩的原始数据特性&#xff0c;为摄影师提供了更大的后期处理空间。而Adobe Camera Raw 11&#xff0c;作为这一领域的翘楚&#xff0c;以其卓越的性能和创新的功能&#xff0c;为摄影师们带来了前所未有的创作体验。 Adobe Came…

深度学习(一)

深度学习&#xff08;一&#xff09; 一、实验目的 掌握前馈全连接神经网络&#xff0c;具体包括&#xff1a; (1) 前馈全连接神经网络的网络结构 (2) 前馈神全连接经网络的工作原理 (3) 前馈全连接神经网络的代码实现 二、实验内容 1. 导入常用工具包 2. 数据导入与数据…

国内加密软件排行榜,每一款加密软件都是精品

在数字化快速发展的今天&#xff0c;数据安全和隐私保护已成为企业和个人关注的焦点。加密软件作为保护数据安全的重要手段&#xff0c;其重要性日益凸显。以下是根据权威机构的评测和用户反馈&#xff0c;整理的国内加密软件排行榜及其特点概述。 1、加密软件安企神免费试用7天…

计算机系统基础实验三(解了但尽量理解)

一.准备阶段 1、下载好32位的实验代码后&#xff0c;将文件解压缩并且通过共享文件夹操作将文件添加到虚拟机中&#xff0c;双击查看bomb.c代码&#xff0c;将c代码完整看了一遍&#xff0c;发现看这里的c代码是无从下手的&#xff0c;代码中只含有主函数&#xff0c;触发炸弹…

前缀和(下)

目录 热身&#xff1a; 寻找数组的中心下标 题解&#xff1a; 代码&#xff1a; 进阶&#xff1a; 除自身之外数组的乘积 题解&#xff1a; 代码&#xff1a; 和为K的子数组 题解&#xff1a; 代码&#xff1a; 和可被 K 整除的子数组 题解&#xff1a; 同余定理…

【网络运维的重要性】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

基于单片机的步进电机控制系统研究

摘 要 &#xff1a; 近年来 &#xff0c; 步进电机凭借其定位精度高 、 使用方便 、 性价比高 、 容易控制等优点 &#xff0c; 在各领域受到广泛应用 。 文中利用C52 单片机设计了一种步进电机控制系统 &#xff0c; 介绍了其总体方案 、 主控制模块 、 驱动电路 、 键盘 、 晶…

jmeter多用户并发登录教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录操作&#xff0c;大致参考如下 jmx脚本&#xff1a;百度网盘链接 提取码&#xff1a;0000 一&#xff1a; 单用户登录 先使用1个用户登录&#xff08;先把1个请求调试通过&#xff09; 发送一个登录请求&…

【Python】解决Python报错:TypeError: ‘int‘ object is not iterable

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

打造云计算时代的仿真软件

2024年5月25日&#xff0c;北京云道智造科技有限公司&#xff08;下称“云道智造”&#xff09;在深圳成功举办了2024新品发布会暨用户大会。来自全国各地的近500位客户和合作伙伴代表齐聚一堂&#xff0c;共同见证了云道智造新产品的隆重发布&#xff0c;交流分享了仿真领域的…

模型实战(21)之 C++ - tensorRT部署yolov8-det 目标检测

C++ - tensorRT部署yolov8-det 目标检测 python环境下如何直接调用推理模型转换并导出:pt -> onnx ->.engineC++ tensorrt 部署检测模型不写废话了,直接上具体实现过程+all代码 1.Python环境下推理 直接命令行推理,巨简单yolo detect predict model=yolov8n.pt source…

SQL刷题笔记day6——转战LeetCode

1 第二高的薪水 ​ 我的代码&#xff1a; SELECT Salary SecondHighestSalary FROM Employee ORDER BY Salary DESC LIMIT 1, 1 我的代码不满足示例2的情况&#xff1a;如果没有第 2 高的薪资&#xff0c;即表里可能只有一条记录&#xff0c;这个解答会被评测为 Wrong Answ…