1. 程式人生 > >網路程式設計--http請求、響應網頁

網路程式設計--http請求、響應網頁

網路程式設計–http請求、響應網頁

http協議是一個tcp應用層的超文字傳輸協議,主要是對網頁的傳輸和資料的傳輸

http傳輸過程:

一端通過http請求的格式傳送具體請求內容,另一端接收http請求,按照協議 格式進行解析,獲取真實請求後按照http協議響應格式 組織回覆內容,回法給請求方,完成一次資料互動。

http請求格式:

請求行:具體的請求類別和請求內容
	請求行的格式:   GET       /        HTTP/1.1
	對應的解釋:    請求型別   請求內容   http協議版本
	
	請求型別:表示請求的種類
		GET: 獲取網路資源
		POST: 提交一定的附加資訊,得到返回結果
		...
請求頭:對請求內容的具體描述資訊
空行:格式要求
請求體:請求引數或提交內容

http響應格式:

響應行:反饋 響應的情況
	響應行的格式:  HTTP/1.1     200       OK
	對應的解釋:  http協議版本   響應碼     附加資訊   
	
	響應嗎:響應的具體情況
		1xx:提示資訊,表示請求成功
		2xx:響應成功
		3xx:響應需要重定向
		4xx:客戶端錯誤
		5xx:服務端錯誤
	
	常見的響應碼:
		200:成功
		401:沒有訪問許可權
		404:請求內容不存在
		500:伺服器發生未知錯誤
		503:暫時無法執行
		...
響應頭:對響應內容的具體描述資訊
空行:格式要求
響應體:返回給請求你端的具體內容

使用http協議寫一個簡單的請求與響應的互動傳輸資料

如先有一個index.html網頁

在這裡插入圖片描述

一會使用ip和埠號顯示這個頁面

http程式碼該怎麼寫:

  1. 建立套接字
  2. 繫結伺服器地址並設定監聽
  3. 等待http的請求
  4. 處理http請求,並作出響應
  5. 關閉套接字

請求、響應怎麼寫:

  1. 接收瀏覽器的請求
  2. 作出響應,請求是否成功
  3. 返回響應內容
# http_server.py
from socket import *

# 2. 處理瀏覽器請求的函式
def http_handle(connfd):
    # 接收請求
    request = connfd.recv(4096)
    
    # 作出響應
    try:
        f = open
('index.html', 'r') except IOError: # 開啟檔案失敗(請求失敗) response = 'HTTP/1.1 404 not fount\r\n' response += '\r\n' response += '---------not fount------------' else: # 開啟檔案成功(請求成功) response = 'HTTP/1.1 200 OK\r\n' response += '\r\n' response += f.read() finally: # 無論成功還是失敗都要執行的語句 # 將響應資訊傳送給瀏覽器 connfd.send(response.encode()) f.close() # 關閉檔案 # 1. 寫一個主函式,在裡邊完成基本操作 def main(): # 建立套接字 sockfd = socket(AF_INET, SOCK_STREAM) # 設定套接字ip格式 sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 繫結伺服器地址,設定監聽 http_server_addr = ('0.0.0.0', 8000) sockfd.bind(http_server_addr) sockfd.listen(3) # 處理請求 while True: connfd, addr = sockfd.accept() # 呼叫函式, 讓其處理請求,考慮傳什麼引數 http_handle(connfd) # 關閉套接字 connfd.close() sockfd.close()

在這裡就固定了頁面,後面會講不固定的頁面

請求成功如下:

在這裡插入圖片描述

請求失敗(先讓index.html在該路徑下消失一會)如下:

在這裡插入圖片描述

剛才說的這樣做我們只能固定的開啟index.html這個檔案,而我們要輸入別的檔案的話就都會是失敗的結局,我們可以做一個判斷,先看圖片:

在這裡插入圖片描述 我們看到了,GET後邊後邊跟的要麼是斜槓,要麼是一個檔案的路徑,其實斜槓就是跟目錄,會自動匹配index.html,那麼怎麼匹配到這個路徑呢?

# 接收了請求以後進行處理一下
request_lines = request.splitlines()
    reshtml = str(request_lines[0]).split(' ')[1]
    if reshtml[-5:] == '.html' or reshtml == '/':
        print(reshtml)

我們列印了reshtml,看看會列印什麼

/index.html
/

第一個是輸入檔名稱,第二個是不輸入直接發出請求

我們可以根據這個做判斷了,判斷就不說了

本節完!