一、HTTP 介绍
- 在web应用中,服务器传给浏览器,实际上是将网页的HTML文件传给了浏览器,让浏览器显示。然而浏览器和服务器之间传输所遵循的协议就是HTTP协议
- HTML:是一种用来定义网页的文本,会HTML就可以编写网页
- HTTP是在网络上传输的HTML的协议,用于浏览器和服务器之间的通信
-
HTTP协议是什么:
- HTTP协议是浏览器与服务器之间用来传输的约定,请求的时候按照xxx发回的时候按照xxx收 发送的二进制的数据,不是二进制需要解码 get xxxx 200 xxxx等 浏览器访问的全过程:
-
1…解析域名:
1)检查是否知道默认网管的mac(物理地址) --> 如果没有arp广播
2)组织一个域名解析的请求发给网关 -->网关发到网上 --> 网上一步一步发到dns服务器- DNS服务器解析出来然后回复给客户端(得知ip)
- 将ip转发给网关 --> 网关发到网上 --> 在发到http服务器上
- 向服务器发送请求(三次握手)
- 客户端向服务器发送请求 - -> 服务器解析请求后将数据发个客户端 --> 浏览器显示
- 客户端四次挥手
二、web服务器搭建
1. 给浏览器返回一个固定页面
- 返回一个固定的页面
import socket def http_send(new_server): # 接受数据 data = new_server.recv(1024) print(data) # 回复数据 换行用\r\n respons = "HTTP:/1.1\r\n" # 换行 respons += "\r\n" # 内容 respons += "<h1>hahha</h1>" new_server.send(respons.encode("utf-8")) new_server.close() def main(): """返回固定的页面""" #1. 创建套接字 Tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 防止关闭后占用端口(重复利用这个资源) Tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定ip和端口 Tcp_server.bind(("",7890)) # 变为等待状态 Tcp_server.listen(128) while True: # 等待其他客户端连接 addr:访问的地址 new_server, clientaAddr = Tcp_server.accept() # 接受数据并向客户端发送数据 http_send(new_server) Tcp_server.close() if __name__ == "__main__": main()
2.返回一个HTML的index页面
- 返回一个HTML的index页面 (html是在网上随便找的,用来测试的)
- 静态文件的目录结构
├─html │ │ all page │ │ README.md │ │ │ └─Trave │ │ about.html │ │ index.html │ │ information.html │ │ order.html │ │ preview.html │ │ │ ├─css │ │ about.css │ │ basic.css │ │ home.css │ │ information.css │ │ order.css │ │ preview.css │ │ │ └─img │ ├─about │ │ trea1.png │ │ trea2.png │ │ trea3.png │ │ trea4.png │ │ │ ├─home │ │ adver.jpg │ │ logo.png │ │ tour1.jpg │ │ tour2.jpg │ │ tour3.jpg │ │ tour4.jpg │ │ tour5.jpg │ │ tour6.jpg │ │ tour7.jpg │ │ tour8.jpg │ │ tour9.jpg │ │ │ ├─information │ │ disc.png │ │ headline.jpg │ │ hot1.jpg │ │ hot2.jpg │ │ hot3.jpg │ │ hot4.jpg │ │ hot5.jpg │ │ hot6.jpg │ │ hot7.jpg │ │ hot8.jpg │ │ logo.png │ │ tour1.jpg │ │ tour2.jpg │ │ tour3.jpg │ │ tour4.jpg │ │ tour5.jpg │ │ tour6.jpg │ │ tour7.jpg │ │ tour8.jpg │ │ tour9.jpg │ │ │ └─ticket │ headline.jpg │ hot1.jpg │ hot2.jpg │ hot3.jpg │ hot4.jpg │ hot5.jpg │ hot6.jpg │ hot7.jpg │ hot8.jpg │ logo.png │ └─image └─down_img 1.jpg 2.jpg
- python 文件:
import socket def service_client(new_socket): # 接受数据 data = new_socket.recv(1024) print(data.decode("utf-8")) # 传递数据 response = "HTTP:/1.1 200 OK\r\n" response += "\r\n" # 打开文件 file_name = "../static/html/Trave/index.html" f = open(file_name, "rb") data_contend = f.read() f.close() # 发送文件 header new_socket.send(response.encode("utf-8")) # 发送文件body new_socket.send(data_contend) # 关闭套接字 new_socket.close() def main(): """控制流程""" # 创建套接字 tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定ip和port tcp_server.bind(("", 8080)) # 设置成监听模式 tcp_server.listen(128) while True: # 等待客户端连接 new_client, addr = tcp_server.accept() # 接受客户端的消息 回复客户端的消息 service_client(new_client) tcp_server.close() if __name__ == "__main__": main()
- index页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document