# web应用 架构
# C/S 架构 | B/S 架构
# client server: 客户端服务器架构,C++
# browser server:浏览器服务器架构,Java、Pythonhtml
# HTTP(HyperText Transport Protocol)是超文本传输协议
# 基于TCP/IP协议基础上的应用层协议,底层实现仍为socket
# 基于请求-响应模式:通讯必定是从客户端开始,服务器端接收到客户端必定会作出对应响应
# 无状态:协议不对任何一次通讯状态和任何数据作保存
# 无链接:一次链接只完成一次请求-响应,请求-响应完毕后会当即断开链接web
# 一次http操做称之为一个事务,工做过程可分为四步
# 1.客户端与服务端创建链接
# 2.客户端发生一个http协议指定格式的请求
# 3.服务器端接收请求后,回应一个http协议指定格式的响应
# 4.客户端将服务器的响应显示展示给用户浏览器
# 1打头:消息通知
# 2打头:请求成功
# 3打头:重定向
# 4打头:客户端错误
# 5打头:服务器端错误服务器
架构
# 完成B/S架构项目的设计 # Borwser已经完成 # Server须要手动书写socket,以http协议方式完成响应 import socket # 设置响应头(包含响应行) RESP_HEADER = b'HTTP/1.1 200 OK\r\nContent-type:text/html;charset=utf-8\r\n\r\n' # 设置服务器socket相关信息 server = socket.socket() server.bind(('localhost', 8808)) server.listen(5) print("服务: http://localhost:8808") while True: # 获取B以http协议发来的请求 client, address = server.accept() data = client.recv(1024) # 数据报文 包含 请求行 请求头 请求体 print(data) # 手动以http协议完成响应 # 数据报文 包含 响应行 响应头 响应体 client.send(RESP_HEADER) # /index => 响应主页 # /login => 登陆页面 # 错误 => 404 # 数据data, 字节形式 => 字符串形式 strData = str(data, encoding='utf-8') # 解析请求的数据, 分析获得路由 my_route = strData.split('\r\n')[0].split(' ')[1] # 后台没有设置的路由,通通以404来处理 dt = b'404' # 设置的路由返回响应的页面文件 if my_route == '/index': with open('02_index.html', 'rb') as f: dt = f.read() if my_route == '/login': with open('02_login.html', 'rb') as f: dt = f.read() # /favicon.ico该请求是日后台请求标签图标 if my_route == '/favicon.ico': with open('favicon.ico', 'rb') as f: dt = f.read() # 响应体 client.send(dt) # 一次循环,表明一次响应,也就是一次事务的完成, 要关闭http请求链接 client.close()