自定義socket 模擬B/S服務端

經過什麼實現鏈接?

  • socket 套接字 位於應用層和傳輸層之間的虛擬層 一組接口進鏈接

B/S 客戶端與服務端交互過程

socket server端 python代碼 (靜態html反饋)

""" 
    根據URL中不一樣的路徑返回不一樣的內容--函數進階版 
    返回獨立的HTML頁面 
    """  
      
    import socket  
      
    sk = socket.socket()  
    sk.bind(("127.0.0.1", 8080))  # 綁定IP和端口  
    sk.listen()  # 監聽  
      
      
    # 將返回不一樣的內容部分封裝成不一樣的函數  
    def index(url):  
        # 讀取index.html頁面的內容  
        with open("index.html", "r", encoding="utf8") as f:  
            s = f.read()  
        # 返回字節數據  
        return bytes(s, encoding="utf8")  
      
      
    def home(url):  
        with open("home.html", "r", encoding="utf8") as f:  
            s = f.read()  
        return bytes(s, encoding="utf8")  
      
      
    # 定義一個url和實際要執行的函數的對應關係  
    list1 = [  
        ("/index/", index),  
        ("/home/", home),  
    ]  
      
    while True:  
        # 等待鏈接  
        conn, add = sk.accept()  
        data = conn.recv(8096)  # 接收客戶端發來的消息  
        # 從data中取到路徑  
        data = str(data, encoding="utf8")  # 把收到的字節類型的數據轉換成字符串  
        # 按\r\n分割  
        data1 = data.split("\r\n")[0]  
        url = data1.split()[1]  # url是咱們從瀏覽器發過來的消息中分離出的訪問路徑  
        conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 由於要遵循HTTP協議,因此回覆的消息也要加狀態行  
        # 根據不一樣的路徑返回不一樣內容  
        func = None  # 定義一個保存將要執行的函數名的變量  
        for item in list1:  
            if item[0] == url:  
                func = item[1]  
                break  
        if func:  
            response = func(url)  
        else:  
            response = b"404 not found!"  
      
        # 返回具體的響應消息  
        conn.send(response)  
        conn.close()
  • 提供響應的index頁面 html代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>index</title>
</head>
<body>
<div>這是index頁面</div>
</body>
</html>
  • 提供響應的home頁面 html代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>home</title>
</head>
<body>
<div>這是home頁面</div>
</body>
</html>
  • 瀏覽器訪問 index頁面

  • 瀏覽器訪問 home頁面

  • 輸入無效頁面結果

  • 網頁可以正常顯示,可是都是靜態的。頁面的內容都不會變化

socket server端 python代碼 (動態html反饋)

#咱們改一下代碼,模擬一下動態網站。選擇使用字符串替換來實現這個需求。(這裏使用時間戳來模擬動態的數據)

    """ 
    根據URL中不一樣的路徑返回不一樣的內容--函數進階版 
    返回獨立的HTML頁面 
    """  
      
    import socket  
      
    sk = socket.socket()  
    sk.bind(("127.0.0.1", 8080))  # 綁定IP和端口  
    sk.listen()  # 監聽  
      
      
    # 將返回不一樣的內容部分封裝成不一樣的函數  
    def index(url):  
        # 讀取index.html頁面的內容  
        with open("index.html", "r", encoding="utf8") as f:  
            s = f.read()  
        # 返回字節數據  
        return bytes(s, encoding="utf8")  
      
      
    def home(url):  
        with open("home.html", "r", encoding="utf8") as f:  
            s = f.read()  
        return bytes(s, encoding="utf8")  
      
      
    def timer(url):  
        import time  
        with open("time.html", "r", encoding="utf8") as f:  
            s = f.read()  
            s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))  
        return bytes(s, encoding="utf8")  
      
      
    # 定義一個url和實際要執行的函數的對應關係  
    list1 = [  
        ("/index/", index),  
        ("/home/", home),  
        ("/time/", timer),  
    ]  
      
    while True:  
        # 等待鏈接  
        conn, add = sk.accept()  
        data = conn.recv(8096)  # 接收客戶端發來的消息  
        # 從data中取到路徑  
        data = str(data, encoding="utf8")  # 把收到的字節類型的數據轉換成字符串  
        # 按\r\n分割  
        data1 = data.split("\r\n")[0]  
        url = data1.split()[1]  # url是咱們從瀏覽器發過來的消息中分離出的訪問路徑  
        conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 由於要遵循HTTP協議,因此回覆的消息也要加狀態行  
        # 根據不一樣的路徑返回不一樣內容  
        func = None  # 定義一個保存將要執行的函數名的變量  
        for item in list1:  
            if item[0] == url:  
                func = item[1]  
                break  
        if func:  
            response = func(url)  
        else:  
            response = b"404 not found!"  
      
        # 返回具體的響應消息  
        conn.send(response)  
        conn.close()
  • 提供響應的time頁面 html代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>time</title>
</head>
<body>
    <div>@@time@@</div>  <!--@@來標識要替換的元素-->
</body>
</html>
  • 執行效果 (刷新三次,時間是動態的)

小結 :

這是咱們用socket模擬,基於BS框架下的 server端與browser端的交互,對於真實開發中的python web程序來講,
通常會分爲兩部分:服務器程序和應用程序。服務器程序負責對socket服務端進行封裝,並在請求到來時,
對請求的各類數據進行整理。應用程序則負責具體的邏輯處理。爲了方便應用程序的開發,就出現了衆多的Web框架,
例如:Django、Flask、web.py 等。不一樣的框架有不一樣的開發方式,可是不管如何,開發出的應用程序都要和服務器程序配合,
才能爲用戶提供服務。
相關文章
相關標籤/搜索