首页 > 其他分享 >Web 服务器

Web 服务器

时间:2024-09-29 18:03:14浏览次数:8  
标签:Web http 请求 字符 服务器 数据 客户端

欢迎访问我的另一个博客: https://xingzhu.top/
项目:https://xingzhu.top/archives/webfu-wu-qi-xiao-xiang-mu-linux-c-epoll

HTTP 协议

客户端 (浏览器):

  • 通过浏览器地址栏给服务器发送请求,浏览器内部进行数据的封装
    • 根据 http 协议进行封装,封装完毕,数据发送给服务器
  • 等待服务器的回复
  • 收到服务器回复的数据,根据 http 协议解析数据
    • 得到了服务器回复的原始数据

服务器端:

  • 接收数据,被 http 协议封装过的
  • 根据 http 协议解析数据,得到客户端请求的原始数据
  • 处理客户端请求,得到处理结果
  • 给客户端回复数据,(数据需要通过 http 协议进行封装,然后在发送给客户端)

http 协议封装好数据之后是一个数据块,得到若干行数据,使用的换行符 \r\n

http 请求

http 请求消息分为四部分:

  • 请求行;不管 get 请求还是 post 请求,请求行是分为三部分
  • 请求头
  • 空行
  • 客户端向服务器提交的数据

get 方式提交数据

  • 如果使用 get 的方式向服务器提交数据,数据并没有在请求协议的第四部分,而是在请求行的第二部分
  • 如果使用 get 方式提交数据,第四部分是空的 -> 用于为空
GET /pic/1.jpg HTTP/1.1
Host: 192.168.1.8:6789
Connection: keep-alive    # 一直保持连接
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0(Windows NT 10.0;Win64;x64)
AppleWebKit/537.36(KHTML, like Gecko)
Chrome/80.0.3987.186 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,imag
e/webp,image/apng,*/*;q=0.8,application/signed-
exchange;v=b3;q=0.9
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
-
  • 14 行为空行
  • get 请求:请求服务器上的静态文件,就是服务器上存在的文件
  • /pic/1.jpg 这个是请求的静态资源,注意这个 / 是服务器的资源目录,不是服务器根目录,所以需要切换到指定的资源目录
  • 请求头是若干个键值对,也就是上述从 2 到 8 行,冒号后面跟个空格再写数据

post 方式提交

POST / HTTP/1.1
Host: 192.168.1.8:6789
Connection: keep-alive
Content-Length: 98         # 提交的内容长度
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded       # 提交的数据格式 
User-Agent: Mozilla/5.0(Windows NT 10.0;Win64;x64)
AppleWebKit/537.36(KHTML,like Gecko)
Chrome/80.0.3987.106 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=8.9,ima
ge/webp,image/apng,*/*;q=0.8,application/signed-
exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

username=subwen%40gq.com&phone=1111111&email=sub%40gq.com
&date=2020-01-01&sex=male&class=1&rule=on
  • 提交的数据是动态的,在服务器上不存在(如用户名和密码信息,是在对应的数据库上)
  • 提交的数据在地址栏中不显示,但是 get 方式提交会显示

http 响应

服务器给客户端回复数据,称之为 http 响应,协议的格式分为四部分:

  • 状态行
  • 消息报头/响应头
  • 空行
  • 回复给客户端的数据

http 响应消息也是一个数据块,若干行,换行 \r\n

HTTP/1.1 200 0k
Server: micro_httpd
Date: Fri, 18 Jul 2014 14:34:26 GMT
Content-Type: text/plain;charset=iso-8859-1(必选项)
Content-Length: 32
Location: https://www.biadu.com
Content-Language: zh-CN
Last-Modified: Fri,18 Jul 2014 08:36:36 GMT
Connection: close

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

http 相应状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种:

  • 1xx:指示信息--表示请求已接收,继续处理
  • 2xx:成功--表示请求已被成功接收、理解、接受
  • 3xx:重定向--要完成请求必须进行更进一步的操作 (网络地址的重新访问)
  • 4xx:客户端错误--请求有语法错误或请求无法实现
  • 5xx:服务器端错误--服务器未能实现合法的请求

常见状态码:

  • 200 OK 客户端请求成功
  • 400 Bad Request 客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
  • 403 Forbidden 服务器收到请求,但是拒绝提供服务
  • 404 Not Found 请求资源不存在,如:输入了错误的 URL
  • 500 Internal Server Error 服务器发生不可预期的错误
  • 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

详情查阅: 在线工具 —— OSCHINA.NET社区

相关操作函数

sscanf

// 函数原型
// 将参数 str 的字符串根据参数 format 字符串来转换并格式化数据,转换后
sscanf(const char *str, const char *format)

具体功能如下:

  • 根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等
  • 取指定长度的字符串
  • 取到指定字符为止的字符串
  • 取仅包含指定字符集的字符串
  • 取到指定字符集为止的字符串

可以使用正则表达式进行字符串的拆分

正则匹配规则:

  • [1-9]:匹配一个字符,这个字符在 1-9 范围内就满足条件
  • [2-7]:匹配一个字符,这个字符在 2-7 范围内就满足条件
  • [a-2]:匹配一个字符,这个字符在 a-z 范围内就满足条件
  • [A, b, c, D,e,f]:匹配一个字符,这个字符是集合中任意一个就满足条件
  • [1-9,f-x]:匹配一个字符,这个字符是 1-9,或者 f-x 集合中的任意一个就满足条件
  • [^1]^ 代表否定,匹配一个字符,这个字符只要不是 1 就满足条件
  • [^2-8]:匹配一个字符,这个字符只要不在 2-8 范围内就满足条件
  • [^a-f]:匹配一个字符,这个字符只要不在 a-f 范围内就满足条件
  • [^ ]:匹配一个字符,这个字符只要不是空格就满足条件
const char *s = "http://www.baidu.com:1234";
char protocol[32] = {0};
char host[128] = {0};
char port[8] = {0};
sscanf(s, "%[^:]://%[^:]:%[1-9]", protocol, host, port);

说明:参考学习 https://subingwen.cn/

标签:Web,http,请求,字符,服务器,数据,客户端
From: https://www.cnblogs.com/xingzhuz/p/18440515

相关文章

  • JavaWeb之过滤器
    1.过滤器的概念过滤器是JavaServlet规范中定义的组件,用于在请求到达Servlet之前或响应返回客户端之前,对请求或响应进行拦截和处理。过滤器可以实现以下功能:日志记录:记录请求的详细信息,如URI、参数、时间等。身份验证和授权:检查用户是否已登录,是否有权限访问资源。输入输出......
  • Java Web开发:实际问题与解决方案
    引言在JavaWeb开发中,面对高并发、复杂业务逻辑和安全威胁等挑战,开发者需要灵活应对,找到有效的解决方案。本文将探讨一些实际开发中常见的问题,并结合最新技术提供切实可行的解决方案和示例代码。1.性能瓶颈1.1问题描述随着用户访问量的增长,应用的性能可能出现瓶颈,导致响......
  • Python Web 应用中的 API 网关集成与优化
    PythonWeb应用中的API网关集成与优化目录......
  • Web服务器
    目录一、引言二、环境准备三、网络编程基础  1.socket概述  2.创建socket  3.绑定地址和端口  4.监听客户端连接  5.接受客户端连接四、实现Web服务器  1.创建socket  2.绑定地址和端口  3.监听客户端连接  4.处理客户端请求  5.......
  • 最强AI绘画大模型Flux可以在SDWebUI 上使用了!超便捷的Flux模型使用教程
    大家好,我是画画的小强目前最强的AI绘画大模型Flux.1横空出世有段时间了,模型效果也得到了广泛的认可,但是StableDiffusionWebUI官方迟迟没有跟进,据说是因为要修改很多底层的处理机制,加之ComfyUI如火如荼,可能AUTOMATIC1111大佬的心气也不是很高,选择了躺平,又或者是在秘密......
  • PbootCMS在阿里云主机上邮件发送失败:服务器已经禁用stream_socket_client和fsockopen
    当你遇到PBootCMS网站的留言邮件通知功能失效,并且提示“服务器已经禁用 stream_socket_client 和 fsockopen 函数,请至少开启一个才能发送邮件!”时,这通常是因为服务器的安全策略禁用了这些函数。解决方法如下:步骤1:检查服务器配置登录阿里云主机管理后台:登录阿里云控制台......
  • 使用WebClient 快速发起请求(不使用WebClientUtils工具类)
    使用WebClient发起网络请求_webclient工具类-CSDN博客文章浏览阅读717次,点赞9次,收藏8次。使用WebClient发起网络请求_webclient工具类https://blog.csdn.net/qq_43544074/article/details/137044825这个是使用工具类发起的,下面就不使用工具类进行快速发起。同样的导入依赖<......
  • .Net 6 WebApi 项目部署到 Linux 系统上的 Docker 容器
    .Net6WebApi项目部署到Linux系统上的Docker容器 1.创建一个基础的WebApi项目  注意:因为发布时候,Dockerfile文件必须和解决方案.cspro文件放在同级,所以建议勾上这个,当时遇到这个问题,导致打包镜像时找不到.cspro文件,搞了好久  点击创建,项目基础框架是这样......
  • .Net Web项目中,实现轻量级本地事件总线 框架
    .NetWeb项目中,实现轻量级本地事件总线框架 一、事件总线设计方案1.1、事件总线的概念事件总线是一个事件管理器,负责统一处理系统中所有事件的发布和订阅。事件总线模式通过提供一种松耦合的方式来促进系统内部的业务模块之间的通信,从而增强系统的灵活性和可维护性。1......
  • pbootcms提示:“未检测到您服务器环境的sqlite3数据库扩展…”
    当PBootCMS提示“未检测到您服务器环境的sqlite3数据库扩展”时,可以通过以下两种方法来解决:方法一:修改数据库配置连接驱动为 pdo_sqlite打开数据库配置文件:打开数据库配置文件 /config/database.php。修改数据库类型:找到 'type' 这一行,将 sqlite 改为 pdo_sqli......