python實現靜態web伺服器

2022-09-28 16:45:22 字數 3639 閱讀 6469

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...