# 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()