(1.1)浏览器生成HTTP消息--从浏览器到服务器的探索

本文将会将会介绍当你从浏览器输入一个字符串,或者点击一个东西的时候浏览器第一件做的事–生成HTTP请求.所以我们首先介绍一下HTTP协议.

(一)什么是HTTP协议

HTTP协议的全称是Hyper Text Transfer Protocol(超文本传输协议).它定义了客户端和服务器之间进行交互的消息内容和步骤.基本思路是这样的:

1.1首先客户端向服务器发送请求消息,请求消息中包含了三个部分的内容:

  1. 去哪里:就是指我们在地址栏中输入的URL
  2. 做什么:就是我们想要做的事情,也被称为是方法
  3. 附加信息:主要是向服务器表明该信息来自哪里,浏览器的版本是多少等等

1.2 HTTP消息的基本格式

在这里插入图片描述

1.3 HTTP值得注意部分细节

  1. 主要方法的表:

在这里插入图片描述

○:在该版本中定义的项目
△:并非正式规格,而是在规格书上定义的附加功能
2. 响应的状态码

状态码含义
1XX告知请求的处理进度和情况
2XX成功
3XX表示需要进一步操作
4XX客户端错误
5XX服务器内部错误

下面是一个实际的例子:

1.消息体体:因为没有携带信息所以就没有消息体

在这里插入图片描述

(二)URL是什么

在介绍之前我首先要普及一点小知识:

  1. 我们在浏览器的地址栏输入的一串字符叫做URL:Uniform Resource Locator 统一资源定位符

  2. URL有很多种,我们想要完成的不同功能可以分成以不同字符开头.如 “http”, “https”,“ftp”,“file”.我们常常说的去访问某个网站就是访问以http或者https开头的URL

  3. 我们常常输入的www.****这种以www开头的东西不叫URL,叫做域名.域名的作用其实就是为了让网民能更好的记住它.其实不用域名也可以访问到互联网上的资源—ip地址.例如大家可以通过两种方式都可以访问到百度的首页 1.https://www.baidu.com/ 2. http://14.215.177.38/

在这里插入图片描述

大家在日常生活中常常将浏览器中的地址栏说成是网址,这种说法有些片面.甚至有些同学认为地址栏中的那串字母必须是以www来开头的.其实不然,浏览器中地址栏中填入的有效字符串准确来讲是URL:Uniform Resource Locator 统一资源定位符.通过名字就可以知道URL可以唯一的确定到网络上的一个资源.通常来讲就是以http开头的一串字母.但是很多人可能不知道的是,URL还可以使用其他文字开头,例如"file:","ftp"等,大家可以试一下用浏览器来打开自己的文件管理器,下面我就用自己的做个演示

在这里插入图片描述

这是我通过浏览器来打开了自己的D盘,大家也可以按照我的格式来实验一下.非常有趣.

下面我再用一张图来列举互联网中几种常见的URL:
在这里插入图片描述

之所以有各种各种各样的URL,是因为我们的浏览器不只有访问Web服务器的功能.所以它需要一些东西来判断该使用它的那个功能

(三)对URL进行解析

但我们在地址栏输入了一个URL的时候,就代表我们已经有了想要访问的资源了,但是浏览器面对的只是一个字符串而已,所以浏览器要对URL进行解析. 上面讲过URL有很多种格式,我们就以最常见,最核心的http开头的为例.

根据上面的图我们知道,使用**HTTP协议(HyperTextTransferProtocol 超文本传输协议)**来访问web服务器的时候,URL包括了几个部分.所以浏览器就会将URL拆分成以下几个部分.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个简单的 HTTP 服务器可以分为以下几个步骤: 1. 创建一个 socket,绑定到指定的 IP 地址和端口号; 2. 监听 socket,等待客户端连接; 3. 接收客户端请求; 4. 处理客户端请求,生成响应数据; 5. 发送响应数据给客户端; 6. 关闭连接。 下面是一个简单的 C 语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #define PORT 8080 #define BUFFER_SIZE 1024 void handle_request(int client_socket) { char buffer[BUFFER_SIZE]; ssize_t bytes_read = recv(client_socket, buffer, BUFFER_SIZE, 0); if (bytes_read < 0) { perror("recv failed"); return; } buffer[bytes_read] = '\0'; printf("Received request:\n%s\n", buffer); char response[] = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, world!"; ssize_t bytes_written = send(client_socket, response, strlen(response), 0); if (bytes_written < 0) { perror("send failed"); return; } printf("Sent response:\n%s\n", response); } int main() { int server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket < 0) { perror("socket failed"); exit(EXIT_FAILURE); } struct sockaddr_in server_address = {0}; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(PORT); if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_socket, 5) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } printf("Server listening on port %d...\n", PORT); while (1) { struct sockaddr_in client_address = {0}; socklen_t client_address_size = sizeof(client_address); int client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_address_size); if (client_socket < 0) { perror("accept failed"); continue; } handle_request(client_socket); close(client_socket); } close(server_socket); return 0; } ``` 这个代码实现了一个简单的 HTTP 服务器,它监听在 8080 端口上,收到客户端请求后会返回一个固定的响应。你可以在浏览器中输入 `http://localhost:8080` 来访问这个服务器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值