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,一经查实,立即删除!

相关文章

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

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

智慧冶金: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;积累了…

服务器上创建搭建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;此次选…

10.时间片调度

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

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

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

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

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

2024年618网购节各大电商超级红包二维码集合

一年一度的电商618网购节又要来了&#xff0c;下面收集了淘宝/京东/拼多多的618红包二维码&#xff0c;手机扫描或识别即可每天领红包&#xff0c;可参考好物分享中的商品下单&#xff1a; 淘宝618超级红包&#xff1a;即日起至2024.6.10&#xff0c;每天可领一次 京东618无门…

vue+springboot实现echarts数据图统计

①vue项目修改配置 安装依赖&#xff1a; npm i echarts -S 修改路由index.js&#xff1a; import Vue from vue import VueRouter from vue-router import Manager from ../views/Manager.vue // 解决导航栏或者底部导航tabBar中的vue-router在3.0版本以上频繁点击菜单报错…

「光储充放」一体充电站-一文读懂光储充放充电站

“光储充放”一体充电站作为一种储能充电的新形式渐渐走进人们的生活&#xff0c;全国很多地区都开始陆续投放运营“光储充放”一体充电站&#xff0c;今天的这篇文章&#xff0c;就带大家全面了解“光储充放”这一新型充电站。 头图来源 | 视觉中国 01 政策背景 早在2020年…

集合的交集、并集和差集运算

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 集合最常用的操作就是进行交集、并集、差集和对称差集运算。进行交集运算时使用“&”符号&#xff0c;进行并集运算时使用“&#xff5c;”符号&…

基于振弦采集仪的岩土工程振弦监测技术研究与应用

基于振弦采集仪的岩土工程振弦监测技术研究与应用 岩土工程振弦监测技术是一种基于振弦采集仪的测试方法&#xff0c;用于对岩土体的力学特性进行监测和分析。振弦采集仪是一种先进的测试设备&#xff0c;能够准确测量岩土体中的振动响应&#xff0c;并通过分析振动信号来获取…

学习笔记——数据通信基础——数据通信网络(拓扑结构)

网络拓扑 网络拓扑(Network Topology)是指用传输介质(例如双绞线、光纤等)互连各种设备(例如计算机终端、路由器、交换机等)所呈现的结构化布局。 1、网络拓扑形态 星型网络∶所有节点通过一个中心节点连接在一起。 优点∶容易在网络中增加新的节点。通信数据必须经过中心节点…

python-数据可视化(总)

python-数据可视化 ** 数据可视化 指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘**紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表&#xff0c;也可以是数以吉字节的数据 最流行的工具之一…

HTTP协议的基本了解

一、HTTP-概述 HTTP&#xff1a;Hyper Text Transfer Protocol(超文本传输协议)&#xff0c;规定了浏览器与服务器之间数据传输的规则。 http是互联网上应用最为广泛的一种网络协议 。http协议要求&#xff1a;浏览器在向服务器发送请求数据时&#xff0c;或是服务器在向浏览器…

7 步解决Android Studio模拟器切换中文输入

详细步骤传送地址&#xff1a;Android Studio 模拟器切换中文输入 目录 01 问题概述 02 模拟器的调试 01 问题概述 大家在使用Android Studio 软件进行项目演示时总会遇到一些输入框需要输入中文汉字的情况&#xff0c;由于AS自带的模拟器基本都是英文&#xff0c;这时就有同…

Dubbo生态之深度分析sentinel的流量控制

1. 深度了解sentinel限流规则参数的含义 博客Dubbo生态之sentinel限流-CSDN博客中有dubbo集成sentinel的demo演示 在sentinel中&#xff0c;限流的直接表现形式就是&#xff0c;在执行Entry nodeA SphU.entry(resourceName)的时候抛出FlowException异常&#xff0c;FlowExce…