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

建站网站都用不了的wordpress标签加颜色

建站网站都用不了的,wordpress标签加颜色,做的网站浏览器提示不安全,网站建设主要推广方式文章目录 监听TCP连接读取HTTP Reqeust返回HTTP Response返回HTML页面验证Request和选择性Response 使用rust编写一个基于HTTP协议的Web服务器。HTTP是更高层的通信协议#xff0c;一般来说都基于TCP来构建的#xff0c;除了HTTP/3#xff0c;后者是基于UDP构建的协议 仓库… 文章目录 监听TCP连接读取HTTP Reqeust返回HTTP Response返回HTML页面验证Request和选择性Response 使用rust编写一个基于HTTP协议的Web服务器。HTTP是更高层的通信协议一般来说都基于TCP来构建的除了HTTP/3后者是基于UDP构建的协议 仓库地址 1037827920/web-server: 使用rust编写的简单web服务器 (github.com) 下面分为五个步骤去完成这个单线程Web服务器 监听TCP连接读取HTTP Reqeust返回HTTP Response返回HTML页面验证Request和选择性Response 监听TCP连接 use std::net::TcpListener;fn main() {// 监听端口let listener TcpListener::bind(localhost:8080).unwrap();// incoming返回一个迭代器它每一次迭代会返回一个新的连接stream客户端发起的连接Web服务器负责监听接收因此接下来做的就是从stream中读取数据然后返回处理的结果for stream in listener.incoming() {let stream stream.unwrap();println!(Connection established!);} }运行代码后访问localhost:8080可以看到如下结果 Connection established! Connection established! Connection established!为啥浏览器访问依次会在终端打印多次连接建立的信息 原因在于stream超出作用域时会触发drop的扫尾工作其中包含了关闭连接。但是浏览器可能会存在自动重试的情况因此还会重新建立连接最终打印了多次。 注意 由于listener.incoming()会在当前阻塞式监听所以main线程会被阻塞。 读取HTTP Reqeust 连接建立后就可以开始读取客户端传来请求数据先了解一下HTTP Reqeust HTTP Request格式 Method Request-URI HTTP-Version headers CRLF message-bodyMethod是请求的方法例如GET、POST等Reqeust-URI是该请求希望访问的目标资源路径例如/、/sleep类似JSON格式的数据都是HTTP请求报头headers例如“Host: localhost:8080”message-body是消息体它包含了用户请求携带的具体数据例如更改用户名的请求就要提交新的用户名数据而GET请求是没有message-body的 代码 use std::{// 帮助我们读取和写入数据// BufReader可以实现缓冲区读取底层其实是基于std::io::Read实现可以使用lines方法获取一个迭代器可以对传输的内容流进行按行迭代读取要使用该方法需引入std::io::BufReadio::{prelude::*, BufReader},net::{TcpListener, TcpStream}, };fn main() {let listener TcpListener::bind(192.168.218.128:8080).unwrap();for stream in listener.incoming() {let stream stream.unwrap();handle_connection(stream);} }/// # 函数作用 /// 处理连接读取请求 fn handle_connection(mut stream: TcpStream) {let buf_reader BufReader::new(mut stream);let http_request: Vec_ buf_reader.lines().map(|result| result.unwrap()).take_while(|line| !line.is_empty()) // 从迭代器中获取元素直到闭包返回false为止.collect(); // 使用collect消费掉迭代器println!(Request: {:#?}, http_request); }运行代码后访问localhost:8080可以看到如下结果 Request: [GET / HTTP/1.1,Host: 192.168.218.128:8080,Connection: keep-alive,Cache-Control: max-age0,Upgrade-Insecure-Requests: 1,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0,... ]如何判断客户端发来的HTTP数据是否读取完成 客户端会在请求数据的结尾附上两个换行符放我们检测某一行字符串为空时就意味着请求数据已经传输完毕了可以collect了。 返回HTTP Response 客户端请求后服务端需要给予相应的请求应答 HTTP Response格式 HTTP-Version Status-Code Reason-Phrase CRLF headers CRLF message-bodyStatus-Code用于告诉客户端当前的请求是否成功若失败大概是什么原因 Response示例 HTTP/1.1 200 OK\r\n\r\n修改handle_conneciton将Response发送回客户端 /// # 函数作用 /// 处理连接读取请求回应请求 fn handle_connection(mut stream: TcpStream) {let buf_reader BufReader::new(mut stream);let http_request: Vec_ buf_reader.lines().map(|result| result.unwrap()).take_while(|line| !line.is_empty()) // 从迭代器中获取元素直到闭包返回false为止.collect(); // 使用collect消费掉迭代器let response HTTP/1.1 200 OK\r\n\r\n;// write_all接收[u8]类型作为参数这里需要用as_bytes将字符串转换为字节数组stream.write_all(response.as_bytes()).unwrap(); }运行代码后访问localhost:8080浏览器已经不会再报错已经收到了来自服务器的Response虽然是空白页面 返回HTML页面 hello.html !DOCTYPE html html langenheadmeta charsetutf-8titleThis is title/title/headbodyh1Hello!/h1pHi from Web Server/p/body /html添加导包 use std::fs;修改handle_connection函数 /// # 函数作用 /// 处理连接读取请求回应请求 fn handle_connection(mut stream: TcpStream) {let buf_reader BufReader::new(mut stream);let _http_request: Vec_ buf_reader.lines().map(|result| result.unwrap()).take_while(|line| !line.is_empty()) // 从迭代器中获取元素直到闭包返回false为止.collect(); // 使用collect消费掉迭代器let status_line HTTP/1.1 200 OK; // 状态行let contents fs::read_to_string(hello.html).unwrap(); // 读取文件内容let length contents.len();let response format!({status_line}\r\nContent-Length: {length}\r\n\r\n{contents});// write_all接收[u8]类型作为参数这里需要用as_bytes将字符串转换为字节数组stream.write_all(response.as_bytes()).unwrap(); }运行代码后访问localhost:8080浏览器会显示hello.html页面 验证Request和选择性Response 404.html内容 !DOCTYPE html html langenheadmeta charsetutf-8titleThis is 404 Page/title/headbodyh1Sorry!/h1p404/p/body /html继续修改handle_connection针对客户端不同的Request给出相应的Response fn handle_connection(mut stream: TcpStream) {let buf_reader BufReader::new(mut stream);// 使用next而不是lines因为我们只需要读取第一行判断具体的request方法let request_line buf_reader.lines().next().unwrap().unwrap();let (status_line, filename) if request_line GET / HTTP/1.1 {(HTTP/1.1 200 OK, hello.html)} else {(HTTP/1.1 404 NOT FOUND, 404.html)};let contents fs::read_to_string(filename).unwrap();let length contents.len();let response format!({status_line}\r\nContent-Length: {length}\r\n\r\n{contents});stream.write_all(response.as_bytes()).unwrap(); }运行代码后访问localhost:8080浏览器会显示hello.html页面范围localhost:8080/sleep会显示404.html页面
http://www.zqtcl.cn/news/772844/

相关文章:

  • h5商城网站建站成都网站建设全平台
  • xuzhou公司网站制作有什么手机网站
  • 网站建设 培训深圳网站建设制作品牌公司
  • 网站到期怎么续费网站运营优化推广
  • 一站式装修的利弊上海建设厅焊工证查询网站
  • 济宁做网站公司找融合深圳招聘一般在哪个网站
  • 重庆建网站推广公司个人网站需要建站群吗
  • 深圳网站建设吗个人博客网站制作代码
  • 化妆品网站模板网络营销的网站分类有哪些
  • 广州网站建设程序员培训wordpress 微信 抓取
  • 毕设给学校做网站个人店铺logo
  • 中国做w7的网站宿迁网站建设价位
  • 网站建设售后服务合同百度关键词排名点击器
  • 编辑网站用什么软件推广是什么
  • 北京模板开发建站做网站赚钱的点在哪里
  • 网站建设价格兴田德润i网址多少wordpress主题汉化是什么意思
  • 用最少的钱做网站根据域名查询网站名称
  • 网站开发答辩难点网站返回按钮设计
  • 鹤壁做网站优化建设银行理财产品网站
  • 电子商务类网站模板自学网站建设基本流程
  • 无锡网站制作的公司上海企业服务公司
  • 做h5小程序的网站搜索引擎营销案例
  • 订餐网站开发方案查询网站是否正规
  • 建站论坛图片生成器免费
  • 怎么做自己的店铺网站博物馆门户网站建设优势
  • 专业旅游培训网站建设应用之星 wordpress
  • 青海媒体网站建设公司深圳网站建设推广优化公司
  • 网站开发 价格跨境支付互联互通
  • 织梦 修改网站logo营销型网站设计的内容
  • 电商网站运营策划做网站CentOS还是win好