51 html网页

news2024/11/16 16:51:41

上节内容的网页是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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有效运营企业内部社区的板块有哪些?

随着企业内部沟通和协作的重要性日益凸显&#xff0c;建立一个高效运营的企业内部社区成为越来越多企业的首要任务。针对不同的需求和目标&#xff0c;将企业内部社区分为多个板块&#xff0c;可以更好地促进员工之间的沟通、协作和共享知识。下面介绍如何从分多个板块创建的角…

Docker搭建Redis主从 + Redis哨兵模式(一主一从俩哨兵)

我这里是搭建一主一从&#xff0c;俩哨兵&#xff0c;准备两台服务器&#xff0c;分别安装docker 我这里有两台centos服务器 主服务器IP&#xff1a;192.168.252.134 从服务器IP&#xff1a;192.168.252.135 1.两台服务器分别拉取redis镜像 docker pull redis 2.查看镜像 d…

2024长三角快递物流展即将亮相,致鸿物流器材有限公司值得关注

广东致鸿物流器材有限公司&#xff0c;前身为广州致鸿物流器材有限公司&#xff0c;成立于2002年初&#xff0c;是一家中国专业仓储笼研发制造公司&#xff0c;公司员工约400名&#xff0c;日产仓储笼制造规模近8000个&#xff0c;在全国范围内有五大配送服务中心&#xff1a;江…

AI绘画Stable Diffusion XL 可商用模型!写实艺术时尚摄影级真实感大模型推荐(附模型下载)

大家好&#xff0c;我是设计师阿威 大家在使用AI绘画的时候&#xff0c;是不是遇到这种问题&#xff1a;收藏的模型确实很多&#xff0c;可商用的没几个&#xff0c;而今天阿威将给大家带来的这款写实艺术时尚摄影级真实感大模型-墨幽人造人XL&#xff0c; 对于个人来讲完全是…

应用弹窗优先级

背景 由于活动业务越来越多,积累的弹窗越来越多和杂乱,出现如下弹窗交互问题: 弹窗无限重叠,影响操作 弹出顺序无优先级,重要弹窗被隐藏 原因相信大家都一样,产品是一次次迭代的,也可能是不同人开发的,两个毫不相关的业务,弹窗时机也没有任何关联,重不重叠我怎么控制…

第8周 分布式事务与数据一致性主流解决方案落地

第8周 分布式事务与数据一致性主流解决方案落地 1. OpenFeign 服务间的远程调用_实战2. 客户端与服务端负载均衡机制_概念3. 微服务负载均衡NacosLoadbalancer_实战网关基于nacos实现负载均衡:默认轮询方式权重方式实现4. OSI七层网络模型_概念5. 微服务分布式环境下的事务问题…

Ubuntu22.04设置程序崩溃产生Core文件

Ubuntu22.04设置程序崩溃产生Core文件 文章目录 Ubuntu22.04设置程序崩溃产生Core文件摘要Ubuntu 生成Core文件配置1. 检查 core 文件大小限制2. 设置 core 文件大小限制3. 配置 core 文件命名和存储路径4. 重启系统或重新加载配置5. 测试配置 关键字&#xff1a; Ubuntu、 C…

VSCode连接远程服务器使用jupyter报错问题解决

目录 一. 问题描述二. jupyter环境确认三. 插件安装 一. 问题描述 经常会遇到一种问题就是, VSCode连接远程服务器, 上次jupyter notebook 还用的好好的, 下次打开就显示找不到内核了. 今天提供了全套解决方案, 帮大家迅速解决环境问题. 二. jupyter环境确认 首先进入自己需…

React 中的 Fiber 架构

React Fiber 介绍 React Fiber 是 React 的一种重写和改进的核心算法&#xff0c;用于实现更细粒度的更新和高效的调度。它是 React 16 版本中的一个重要更新&#xff0c;使得 React 能够更好地处理复杂和高频的用户交互。以下是对 React Fiber 的详细介绍&#xff1a; 为什么…

java中的工具类

以下是我们到现在学的三个类 在书写工具类的时候我们要遵循以下的规则 类名见面知意是为了知道这个工具类的作用 私有化构造方法的作用是为了不让外界不能创造这个类的对象吗&#xff0c;因为工具类不是描述一个事物的&#xff0c;它是一个工具。 方法定义位静态是为了方便调用…

8086 汇编笔记(一):寄存器

前言 8086 CPU 有 14 个寄存器&#xff0c;每个寄存器有一个名称。这些寄存器是&#xff1a;AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW 一、通用寄存器 8086 CPU 的所有寄存器都是 16 位的&#xff0c;可以存放两个字节。AX、BX、CX、DX 这 4个寄存器通常用…

剧本杀小程序开发,探索市场发展新的商业机遇

剧本杀游戏作为一个新兴行业&#xff0c;经历了爆发式的增长&#xff0c;剧本杀游戏在市场中的热度不断升高。 不过&#xff0c;在市场的火热下&#xff0c;竞争也在逐渐加大。因此&#xff0c;在市场竞争下&#xff0c;成本低、主题多样、有趣的线上剧本杀小程序成为了创业者…

永恒之蓝(MS17-010)详解

这个漏洞还蛮重要的&#xff0c;尤其在内网渗透和权限提升。 目录 SMB简介 SMB工作原理 永恒之蓝简原理 影响版本 漏洞复现 复现准备 复现过程 修复建议 SMB简介 SMB是一个协议服务器信息块&#xff0c;它是一种客户机/服务器、请求/响应协议&#xff0c;通过SMB协议…

两年半前端面字节,广度和深度让我不想做前端了

两年半经历&#xff0c;面的是前端工程师&#xff0c;字节面试官的问题挺有广度与深度的&#xff0c;这里整理一下面试过程中的题目&#xff08;有些忘记了&#xff09;&#xff0c;分享给大家: 面试过程中的问题 1、简单的自我介绍与项目经验。 2、一道算法题。 3、一道 …

揭秘!编写高质量代码的关键:码农必知的黄金法则!

文章目录 一、保持代码的简洁与清晰二、遵循良好的命名规范三、注重代码的可读性四、利用抽象与封装五、遵循SOLID原则六、关注代码性能七、确保代码安全性《码农修行&#xff1a;编写优雅代码的32条法则》编辑推荐内容简介目录前言/序言 在编程的世界里&#xff0c;每一位码农…

给转行产品经理的小白的一些建议

哈喽我是小源&#xff0c;毕业在教培大厂做了1年的班主任&#xff0c;下午1点上班&#xff0c;被优化后gap3月找到了自己的本命岗位——产品经理&#xff01; 其实这个转变也挺机缘巧合的&#xff0c;朋友和我都是教培行业&#xff0c;她是成人职教类&#xff0c;我是k111类&a…

SSL证书:守护个人信息安全的坚固盾牌

在数字化浪潮汹涌的今天&#xff0c;我们的个人信息如同一座座宝藏&#xff0c;吸引着不法分子的贪婪目光。数据泄露事件频发&#xff0c;让信息安全问题日益凸显。而在这个信息爆炸的时代&#xff0c;如何保护我们的个人信息安全&#xff0c;成为了一个亟待解决的问题。幸运的…

【嵌入式】RS485通信+硬件

目录 1.物理层 2.协议层 3.收发电路 3.1三极管开关电路 3.2收发原理图解释 1.物理层 对比 CAN 通讯网络&#xff0c;可发现它们的网络结构组成是类似的&#xff0c;每个节点都是由一个通讯控制器和 一个收发器组成&#xff0c;在 RS-485 通讯网络中&#xff0c;节点中的…

基于单片机的操作平台数据采集网关设计与实现

摘  要&#xff1a; 由于传统网关无法实现数据实时交换&#xff0c;数据传输速率较低&#xff0c;为此提出基于单片机的操作平台数据采集网关设计与实现研究。首先&#xff0c;结合单片机具有的显著优势对网关结构选型设计&#xff1b;其次&#xff0c;参照一体化设计理念&…

每日力扣刷题day07(滑动窗口专项)

文章目录 2024.5.28&#xff08;3题&#xff09;643. 子数组最大平均数 I解题思路Java代码实现详细解释 1343. 大小为 K 且平均值大于等于阈值的子数组数目解题思路java代码实现详细解释 2090. 半径为 k 的子数组平均值解题思路java代码实现详细解释 2024.5.28&#xff08;3题&…