《简单的http网站的构建》

news/2024/11/29 8:58:03/

【一】什么是协议

通过udp和tcp协议大家知道,无论是以数据报还是字节流的方式去把信息传送出去,都需要将我们所有的信息转化为字符串的形式进行发送,这叫序列化,在另外一头将字符串转化为我们所需要的信息,这是反序列化。但是如何序列化及如何反序列化,这个约定就被称为应用层协议

【二】HTTP协议

虽然我们说,应用层协议是程序员自己定制的,但是作为一个cv工程师,能cv绝不自己手写。所以总有大佬带头定义了一套现成的非常好用的应用层协议,比如http(超文本传输协议)就是其中之一。

tips:超文本传输协议,顾名思义就是不仅限于文本的传输协议,还能传输音频,图片等等,是不是有的人觉得http这玩意看着有点眼熟,你没发现你的网址前缀就是这玩意吗?其实也没必要把这个玩意看成啥高大上的东西,这东西只是一个协议,协议只是一个约定,也就是意味着你底层还是需要将其转化为字符串进行传输,只不过是通过固定的格式进行传输

【三】HTTP的状态码

类别原因短语
1xxInformational(信息状态码)接收的请求正在处理
2xxSuccess(成功状态码)请求正常处理完毕
3xxRedirection(重定向状态码)需要进行附加操作以完成请求
4xxClient Error(客户端错误状态码)服务器无法处理请求
5xxServer Error(服务器错误状态码)服务器请求出错

tips:关于HTTP状态码一些不得不说的小故事

同学们访问网页的时候,最多出现的还是404,也就是服务器无法处理请求,而不是5xx,这是为啥呢?你想想4xx是客户端错误码,客户端是使用的人的问题,而5xx是服务端,也就是服务器出了问题,抱着打死不认错的态度,当然不会说这是我服务器的错误了对吧,其实底层还有更胜一层的原因,总有一些黑客喜欢干一些破坏团结的事情,当你使用一些特殊的访问导致的服务器出错,那那些人就知道你的服务器的弱点,从而进行攻击,但是你如果返回的是4xx他们可能就不会再这个报错上多花心思了

【四】HTTP的方法

方法说明支持的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
UNLINE断开连接关系1.0

其实上面列举了这么多,最常用的其实还是get和post的方法,其他的基本上是用不到的

【五】HTTP常见的header

content-type数据类型(text/html)
content-lengthBody的长度
host客户端告诉服务器,所请求的资源是在哪个端口上
user-Agent声明用户的操作系统和浏览器版本信息
refer当前页面是从哪个页面跳转过来的
location搭配3xx状态码使用,告诉客户端接下来咱们去哪里
cookie在客户端存储少量信息,通常用于实现会话功能

【六】最简单的HTTP服务器

实现一个最简单的HTTP服务器,只在网页上输入“hello world”,只要我们按照HTTP协议构造数据,就很容易做到。、

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Usage() {printf("usage: ./server [ip] [port]\n");
}
int main(int argc, char* argv[]) {if (argc != 3) {Usage();return 1}int fd = socket(AF_INET, SOCK_STREAM, 0);//创建网络套接字if (fd < 0) {perror("socket");return 1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(argv[1]);addr.sin_port = htons(atoi(argv[2]));int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));//bind相关信息if (ret < 0) {perror("bind");return 1;}ret = listen(fd, 10);//设计监听状态if (ret < 0) {perror("listen");return 1;} for (;;) {struct sockaddr_in client_addr;socklen_t len;int client_fd = accept(fd, (struct sockaddr*)&client_addr, &len);//接受服务端口if (client_fd < 0) {perror("accept");continue;}char input_buf[1024 * 10] = {0}; // 用一个足够大的缓冲区直接把数据读完.ssize_t read_size = read(client_fd, input_buf, sizeof(input_buf) - 1);//读取请求if (read_size < 0) {return 1;}printf("[Request] %s", input_buf);char buf[1024] = {0};const char* hello = "<h1>hello world</h1>";sprintf(buf, "HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s", strlen(hello), hello);//写入数据write(client_fd, buf, strlen(buf));}return 0;
}

1.打开网络套接字,这一步可以理解为打开网卡,之后的链接都是从网卡中读取的

2.将网卡信息和自己的主机端口号和ip地址进行绑定

3.设置网络套接字为监听状态,监听一切访问这个ip地址的信息

4.接受信息和写入信息

tips:其中写入的信息是必须按照http协议进行构造,否则浏览器无法进行解析,其中网站用的语言为html,这个语言还是比较好学的,有想法的同学还是可以学习。


http://www.ppmy.cn/news/104937.html

相关文章

Python中如何打印输出?

当你开始学习Python编程语言时&#xff0c;第一个要学习的内容之一就是如何在Python中打印输出。这个问题可能看起来很简单&#xff0c;但它实际上包含了许多不同的方面。在本篇博客中&#xff0c;我将向您展示如何在Python中进行基本的输出&#xff0c;并介绍一些高级用法和技…

vue3-组件之间的通信

1、父 传 子&#xff1a;props 父&#xff1a; 传入 msg 和 school信息 <Demo msg"圣墟" school"陈东" />子&#xff1a;接收 信息&#xff0c;可直接{{msg}} 使用 const props defineProps([msg,school])2、子传父&#xff08;自定义事件&#…

【C++】结构体 - 定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体const

文章目录 1. 定义和使用2. 结构体数组3. 结构体指针4. 结构体嵌套结构体5. 结构体做函数参数6. 结构体const 1. 定义和使用 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。 struct 结构体 {结构体成员列表}; 通过结构体创建变量的方法有三种&…

MATLAB机器学习:分类、回归和聚类的算法实现和模型优化

第一章&#xff1a;引言 机器学习是当今IT领域最热门的话题之一&#xff0c;它为我们提供了解决复杂问题的新方法。MATLAB作为一种功能强大的编程语言和环境&#xff0c;提供了许多用于机器学习的工具和函数。本文将介绍MATLAB中常用的分类、回归和聚类算法的实现&#xff0c;…

RK3588平台开发系列讲解(基础篇)Linux 内核有多少 API 接口

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、Linux 内核有多少 API 接口二、Linux 系统调用表三、Linux 系统调用实现3.1、申明系统调用3.2、定义系统调用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 作为比较成熟的操作系统,功能完善,它…

安装VMware Workstation和虚拟机教程

一、VM简介   VMware Workstation中文版是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比&#xff0c;VMWare 采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统&#xff0c;在系统切换时需要重…

jenkins配置邮箱

1.邮箱需要支持SMTP协议&#xff0c;以163邮箱为例 邮箱开通SMTP协议&#xff0c;生成秘钥 2.jenkins进入system拉到最下方&#xff0c;E-mail Notification SMTP server:邮箱smtp服务器地址&#xff08;smtp.163.com&#xff09; Default user e-mail suffix&#xff1a;邮箱…

nodejs基于vue的医院在线挂号系统

本设计是在win10操作系统环境下&#xff0c;采取nodejs作为主要编程环境&#xff0c;通过nodejs语言使用sxpress框架&#xff0c;实现医院预约挂号系统。首先用户需要选定一个医生进行预约&#xff0c;医生可以通过预约&#xff0c;这里涉及到用户到医生的数据传输&#xff0c;…