網路程式設計--http請求、響應網頁
阿新 • • 發佈:2018-12-11
網路程式設計–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程式碼該怎麼寫:
- 建立套接字
- 繫結伺服器地址並設定監聽
- 等待http的請求
- 處理http請求,並作出響應
- 關閉套接字
請求、響應怎麼寫:
- 接收瀏覽器的請求
- 作出響應,請求是否成功
- 返回響應內容
# 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
/
第一個是輸入檔名稱,第二個是不輸入直接發出請求
我們可以根據這個做判斷了,判斷就不說了
本節完!