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 + seqmessage.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.htmlif (_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 + seqmessage.erase(0, pos + seq.size());}_text = message;}void parse(){stringstream s(_reqhead[0]);s >> _method >> _url >> _httpversion;_filepath = wroot;// wroot/index.htmlif (_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);}}// 读取htmlstatic 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.mzph.cn/pingmian/18615.shtml

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

相关文章

QT学习备份

2023年1月2日09:00:32 1.信号/槽编辑器 发送者&#xff1a;控件 信号&#xff1a;是控件发出的信号 接受者&#xff1a;包含控件的容器 槽&#xff1a;程序上用slot标识的方法 2.Q_OBJECT宏 只有继承了QObject类的类&#xff0c;才具有信号槽的能力。所以&#xff0c;为了使用…

uniapp实现蓝牙自动连接并获取心电图(代码篇)

我们最近的项目是需要写一个app和公司设备通过蓝牙连接&#xff0c;并且获取到心电图&#xff0c;这次是实现自动的&#xff0c;用户在第一次的时候需要点击连接蓝牙实现自动连接&#xff0c;后续更是不需要点击直接获取心电图&#xff0c;直接上代码&#xff0c;供大家参考&am…

【管理咨询宝藏118】集团公司人力资源共享服务中心建设方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏118】集团公司人力资源共享服务中心建设方案 【格式】PDF版本 【关键词】人力资源、共享服务、顶级咨询 【核心观点】 - 本项目立足集团公司的人…

学生信息管理系统(静态版)

系统的主界面 系统的操作指令 结构体的创建 目录 1、学生信息的输入 2、学生信息的添加 3、学生信息的删除 4、学生信息的查找&#xff0c;找到并显示 *判断查找函数3和4和5共用 5、学生信息的修改 6、显示学生的信息 7、学生成绩的排序,并打印(代码中有快排和冒…

智慧冶金:TSINGSEE青犀AI+视频技术助力打造高效、安全的生产环境

一、建设背景 冶金行业因其特殊的生产环境和工艺要求&#xff0c;对安全生产、环境保护以及质量监控等方面有着极高的要求。因此&#xff0c;将视频智能监控技术引入冶金行业&#xff0c;不仅有助于提升生产效率&#xff0c;更能有效保障生产安全&#xff0c;降低事故风险。 …

Python + adb 实现打电话功能

前言 其实很多年前写过一篇python打电话的功能&#xff0c;链接如下&#xff1a; Python twilio 实现打电话和发短信功能_自动发短信代码-CSDN博客 今天由于工作需要&#xff0c;又用python写了个关于打电话的小工具&#xff0c;主要是通过ADB方式实现的 实现过程 1.先利用…

计算机图形学入门02:线性代数基础

1.向量&#xff08;Vetors&#xff09; 向量表示一个方向&#xff0c;还能表示长度&#xff08;向量的摸&#xff09;。一般使用单位向量表示方向。 向量加减&#xff1a;平行四边形法则、三角形法则。比卡尔坐标系描述向量&#xff0c;坐标直接相加。 1.1向量点乘&#xff08;…

图片怎么批量重命名从1到50?这3个方法一键改名

图片怎么批量重命名从1到50&#xff1f;图片批量重命名从1到50的过程不仅提高了我们处理大量图片文件的效率&#xff0c;还大大简化了命名过程&#xff0c;让我们能更加有条理地管理和存储图片。通过使用各种专业的工具和方法&#xff0c;我们可以轻松实现图片文件的自动化命名…

光纤网络发展(光缆主动监测系统解决方案)

随着光缆网络规模的迅速扩大&#xff0c;如何提高网络运营效益就显得尤为重要。一方面需要及时掌握网络的运行状况&#xff0c;在发生劣化或故障时&#xff0c;能够准确定位&#xff0c;缩短排障历时&#xff1b;同时&#xff0c;一条光缆从设计、施工到维护&#xff0c;积累了…

聊聊异常处理及try-catch-finally块的作用

异常处理&#xff08;Exceptional Handling&#xff09;&#xff0c;又称为错误处理&#xff0c;是编程语言或计算机硬件中用于处理软件或信息系统中出现的异常状况的一种机制。这些异常状况通常指的是超出程序正常执行流程的某些特殊条件。异常处理提供了处理程序运行时出现的…

服务器上创建搭建gitlab

一、下载与安装 在主目录操作~ 1.使用wget下载 wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-14.0.1-ce.0.el7.x86_64.rpm 可以在开源软件镜像站选择合适的版本&#xff0c;版本不同页面菜单会稍有差异&#xff0c;此次选…

新人学习笔记之(函数1)

一、函数的概念 1.在JS里面&#xff0c;可能会定义非常多的相同代码或者功能相似的代码&#xff0c;这些代码可能需要大量重复使用 2.虽然for循环语句也能实现一些简单的重复操作&#xff0c;但是比较有局限性&#xff0c;此时我们就可以使用JS中的函数 3.函数&#xff1a;就是…

MongoDB CRUD操作:投影Project详解

MongoDB CRUD操作&#xff1a;投影Project详解 文章目录 MongoDB CRUD操作&#xff1a;投影Project详解返回文档的全部字段返回指定的字段和_id字段不输出_id字段指定排除的字段返回内嵌文档中的指定字段禁止内嵌文档中的特定字段数组中内嵌文档的投影聚合表达式的投影字段 默认…

拉取代码报错: SSL certificate problem: self signed certificate

问题描述&#xff1a; 使用SmartGit工具clone项目时&#xff0c;弹出框提示信息为“XXXX&#xff0c;SSL certificate problem: self signed certificate” 问题分析&#xff1a; 提示信息为SSL认证失败&#xff0c;可以关闭SSL的认证 解决方案&#xff1a; 在windows的命…

【Git】Git命令

原文链接&#xff1a;https://github.com/Wscats/CV/issues/31 新建 创建一个新的 git 版本库。这个版本库的配置、存储等信息会被保存到.git 文件夹中 # 初始化当前项目 $ git init# 新建一个目录&#xff0c;将其初始化为Git代码库 $ git init [project-name]# 在指定目录创…

go mod包管理与应用,常见错误排查方法

go mod包管理 go 中 包管理使用go mod 进行包管理 go mod init 项目名称 go mod init myproject_go生成的go.mod中有 module myproject_go 创建目录go_service 其下有两个go文件&#xff0c;go_request.go go_write.go . 根目录下有main.go入口文件。于是项目结构类似于&…

10.时间片调度

一、简介 时间片调度主要针对优先级相同的任务&#xff0c;当多个任务的优先级相同时&#xff0c;任务调度器会在每 一次系统时钟节拍到的时候切换任务&#xff0c;也就是说 CPU 轮流运行优先级相同的任务&#xff0c;每个任务运 行的时间就是一个系统时钟节拍。 二、相关实…

Percona Toolkit 神器全攻略(实用类)

Percona Toolkit 神器全攻略&#xff08;实用类&#xff09; Percona Toolkit 神器全攻略系列共八篇&#xff0c;前文回顾&#xff1a; 前文回顾Percona Toolkit 神器全攻略 全文约定&#xff1a;$为命令提示符、greatsql>为GreatSQL数据库提示符。在后续阅读中&#xff0c;…

Linux完整版命令大全(十四)

od(octal dump) 功能说明&#xff1a;输出文件内容。语  法&#xff1a;od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]补充说明&…

【吊打面试官系列】Java高并发篇 - 怎么唤醒一个阻塞的线程?

大家好&#xff0c;我是锋哥。今天分享关于 【怎么唤醒一个阻塞的线程&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 怎么唤醒一个阻塞的线程&#xff1f; 如果线程是因为调用了 wait()、sleep()或者 join()方法而导致的阻塞&#xff0c;可以中断线程&#xf…