http協議簡介
http請求
1:瀏覽器首先向伺服器傳送http請求,請求包括:
方法:get還是post,get僅請求資源,post會附帶使用者資料;
路徑:/full/url/path;
網域名稱:由host頭指定:host: www.sina.com以及其他相關的header;
如果是post,那麼請求還包括乙個body,包含使用者資料
2:伺服器向瀏覽器返回http響應,響應包括:
響應**:200表示成功,3xx表示重定向,4xglmfnjaflx表示客戶端傳送的請求有錯誤,5xx表示伺服器端處理時發生了錯誤;
響應型別:由content-type指定;
以及其他相關的header;
通常伺服器的http響應會攜帶內容,也就是有乙個body,包含響應的內容,網頁的html原始碼就在body中。
3:如果瀏覽器還需要繼續向伺服器請求其他資源,比如,就再次發出http請求,重複步驟1、2。
web採用的http協議採用了非常簡單的請求-響應模式,從而大大簡化了開發。當我們編寫乙個頁面時,我們只需要在http請求中把html傳送出去,不需要考慮如何附帶、**等,瀏覽器如果需要請求和**,它會傳送另乙個http請求,因此,乙個http請求只處理乙個資源(此時就可以理解為tcp協議中的短連線,每個鏈結只獲取乙個資源,如需要多個就需要建立多個鏈結)
http格式
每個http請求和響應都遵循相同的格式,乙個http包含header和body兩部分,其中body是可選的。
http協議是一種文字協議,所以,它的格式也非常簡單。
1 http get請求的格式:
每個header一行乙個,換行符是\r\n。
2 http post請求的格式:
3 http響應的格式:
200 ok
header1: value1
header2: value2
header3: value3
body data goes here...
http響應如果包含body,也是通過\r\n\r\n來分隔的。
請再次注意,body的資料型別由content-type頭來確定,如果是網頁,body就是文字,如果是,body就是的二進位制資料。
當存在content-encoding時,body資料是被壓縮的,最常見的壓縮方式是gzip,所以,看到content-encoding: gzip時,需要將body資料先解壓縮,才能得到真正的資料。壓縮的目的在於減少body的大小,加快網路傳輸。
demo:靜態web伺服器
import socket
import re
import time
def service_client(new_socket):
"""為這個客戶端服務"""
# 1.接收瀏覽器傳送過來的請求,即http請求
# 判斷客戶端意外斷開鏈結返回空字串
if not request:
# 關閉套接字並退出
new_socket.close()
print("==="*30)
return
# 分隔套接字
request_lines = request.splitlines()
print()
print(">"*20)
print(request_lines)
file_name = ""
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
if file_name == "/":
file_name = "/index.html"
# 2.返回http格式資料 給瀏覽器
response += "\r\n程式設計客棧"
response += ""
response += str(time.strftime('%y-%m-%d %h:%m:%s', time.localtime(time.time())))
new_socket.send(response.encode('utf-8'))
else:
html_content = f.read()
f.close()
# 2.1準備傳送給瀏覽器的資料---header
# 2.2準備傳送給瀏覽器的資料 ---body
# 將response header傳送給瀏覽器
new_socket.send(response.encode("utf-8"))
# 將response body傳送給瀏覽器
new_socket.send(html_content)
# 關閉套接字
new_socket.close()
def main():
"""用來完成整體的控制"""
# 1.建立套接字
tcp_server_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 埠復用
tcp_server_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
# 2.繫結
tcp_server_socket.bind(("", 7890))
# 3.變為套接字
tcp_server_socket.listen(128)
while true:
# 4.等待客戶端的鏈結
new_socket, client_addr = tcp_server_socket.accept()
print(client_addr)
# 5.為這個客戶端服務
service_client(new_socket)
# 關閉監聽套接字
tcp_server_socket.close()
if __name__ == '__main__':
main()
本文標題: python實現靜態web伺服器
本文位址: /jiaoben/python/271884.html
Python建立web靜態伺服器
python作為工具,提供了很多好用的命令,比如有時候突然需要建立乙個解析靜態的html頁面的伺服器,我們不需要在安裝http伺服器,python就能夠輕鬆簡單的做到。先建立乙個index.html的頁面 寫上最簡單的hello 用python開始web伺服器 python m httpserver...
python學習之Web靜態伺服器
通過近幾天學習,完成乙個看可以在命令視窗啟動,使用命令指定埠的多工靜態web服務區。這篇文章只附上了主要 html檔案不附 usr bin env python coding utf 8 import socket import re import sys import gevent from ge...
搭建Python自帶靜態Web伺服器
檢視windows的ip位址 使用組合鍵win r調出執行,輸入cmd回車,進入命令提示符 在命令提示符下輸入ipconfig 靜態web伺服器是什麼?可以為發出請求的瀏覽器提供靜態文件的程式。如何搭建python自帶的靜態web伺服器 搭建python自帶的靜態web伺服器使用 python3 m...