1. 程式人生 > 實用技巧 >【Python高階程式設計035 ● 靜態web伺服器 ● 靜態Web伺服器-返回指定頁面資料】

【Python高階程式設計035 ● 靜態web伺服器 ● 靜態Web伺服器-返回指定頁面資料】


---------Python基礎程式設計---------

Author : AI菌


【內容講解】

開發自己的靜態Web伺服器步驟:
    1、編寫一個TCP服務端程式;
    2、獲取瀏覽器傳送的http請求報文資料;
    3、讀取固定頁面資料,把頁面資料組裝成HTTP響應報文資料傳送給瀏覽器;
    4、HTTP響應報文資料傳送完成以後,關閉服務於客戶端的套接字。

【程式碼演示】

"""
開發自己的靜態Web伺服器步驟:
    1、編寫一個TCP服務端程式;
    2、獲取瀏覽器傳送的http請求報文資料;
    3、讀取固定頁面資料,把頁面資料組裝成HTTP響應報文資料傳送給瀏覽器;
    4、HTTP響應報文資料傳送完成以後,關閉服務於客戶端的套接字。
"""

import socket

if __name__ == '__main__':
    # 建立tcp服務端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 設定埠號複用, 程式退出埠立即釋放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 繫結埠號
    tcp_server_socket.bind(("", 8000))
    # 設定監聽
    tcp_server_socket.listen(128)

    # 迴圈響應客戶端請求
    while True:
        # 等待接受客戶端的連線請求
        new_socket, port = tcp_server_socket.accept()
        # 程式碼執行到此,說明連線建立成功
        # 接收客戶端的資料,對二進位制資料進行解碼
        recv_client_data = new_socket.recv(4096)
        recv_client_data.decode("utf-8")
        print("來自客戶端的資料:", recv_client_data)

        # 讀取檔案資料
        # rb表示以二進位制的方式讀取檔案資料
        # r的方式可以讀取字串,但對於圖片檔案不合適
        # 這裡的file表示開啟檔案的物件
        # with open()關閉檔案這不操作不用程式設計師來完成,系統幫我們完成
        with open("static/index.html", "rb") as file:
            file_data = file.read()
        # 響應行
        response_line = "HTTP/1.1 200 OK\r\n"
        # 響應頭
        response_head = "server:DiamondDownload1.0\r\n"
        # 響應體
        response_body = file_data
        # 拼接響應報文
        response_data = (response_line + response_head + "\r\n").encode("utf-8") + response_body

        # 傳送資料
        new_socket.send(response_data)
        # 關閉服務端與客戶端套接字
        new_socket.close()

【執行結果】

服務端程式控制臺列印結果:

來自客戶端的資料: b'GET /index.html HTTP/1.1\r\nHost: 192.168.1.64:9000\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n'
來自客戶端的資料: b'GET /favicon.ico HTTP/1.1\r\nHost: 192.168.1.64:9000\r\nConnection: keep-alive\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36\r\nAccept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8\r\nReferer: http://192.168.1.64:9000/index.html\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n'

瀏覽器訪問:

【往期精彩】

▷【Python基礎程式設計196 ● 讀取檔案的4種方式】
▷【Python基礎程式設計197 ● 讀取檔案的4種方式】
▷【Python基礎程式設計198 ● 讀取檔案的4種方式】
▷【Python基礎程式設計199 ● Python怎麼讀/寫很大的檔案】
▷【Python基礎程式設計200 ● 讀取檔案的4種方式】
▷【Python基礎程式設計201 ● 讀取檔案的4種方式】
▷【Python基礎程式設計202 ● 讀取檔案的4種方式】
▷【Python基礎程式設計203 ● 讀取檔案的4種方式】

【加群交流】