HTTP伺服器 物件導向

2022-07-01 12:45:18 字數 3203 閱讀 2556

import socket

import gevent

import time

from gevent import monkey

class webserver(object):

"""把http伺服器的功能都封裝在webserver類中"""

documents_root = './html' # 這裡配置伺服器,配置服務端的文件根路徑

def __init__(self):

monkey.patch_all() # 打gevent補丁

# 建立監聽套接字

# 當套接字四次揮手,可立即復用位址埠

# 服務端繫結埠

# 開啟監聽

# 關閉監聽套接字

# 等待接受瀏覽器客戶端的請求

# 開啟gevent協程處理請求

g1 = gevent.spawn(self.handle_client, client_socket)

g1.join()

def handle_client(self, client_socket):

"""為客戶端服務"""

print("當前gevent協程物件:", gevent.getcurrent())

# 接收從客戶端傳送的資料

recv_data = client_socket.recv(4096)

if not recv_data:

return # 假如服務端沒有收到請求資料,直接返回

# 解碼

request_data = recv_data.decode("utf-8")

# 按行分離字串

request_lines = request_data.splitlines()

print("客戶端的請求報文資料如下:")

for line in request_lines:

print(line)

# 請求行: get /index.html http/1.1

request_line = request_lines[0]

# 通過請求行取得請求路徑,即要求的頁面路徑

get_file_name = request_line.split(" ")[1]

print("客戶端要求的頁面是: ===>%s" % get_file_name)

# 如果沒有指定訪問哪個頁面,預設指定index.html

print("服務端回傳的頁面是: ===>%s" % get_file_name)

# 按照http 響應報文格式去回覆客戶端

"""http 響應報文格式

1. 響應行 : http/1.1 200 ok

2. 響應頭 server: mimiweb1.0 connection: keep-alive

3. 分隔符 \r\n

4. 響應體 網頁的具體內容

"""try:

f = open(get_file_name, "rb")

except ioerror:

"""請求異常"""

# 404表示沒有這個頁面

response_line = "http/1.1 404 not found\r\n" # 響應行,必寫

response_headers = "server: mimiweb1.0\r\n" # 設定響應頭

split = "\r\n" # 分割線

response_body = "====sorry ,file not found====" # 設定響應體

response_body = response_body.encode('utf-8') # 注意,一定要重新賦值,否則response_body還是字串,而不是位元組串

else:

"""請求成功"""

response_line = "http/1.1 200 ok\r\n" # 響應行,必寫

response_headers = "server: mimiweb1.0\r\n" # 設定響應頭

split = "\r\n" # 分割線

# 設定響應體

response_body = f.read()

f.close()

finally:

# 因為頭資訊在組織的時候,是按照字串組織的,不能與以二進位制開啟檔案讀取的資料合併,因此分開傳送

# 先傳送response的頭資訊

client_socket.send((response_line + response_headers + split).encode('utf-8'))

# 再傳送body

client_socket.send(response_body)

# 關閉套接字

client_socket.close()

def main():

"""程式主控制入口"""

web_server = webserver()

web_server.startup()

if __name__ == '__main__':

main()

web伺服器物件導向 長連線

from gevent import monkey monkey.patch all 打補丁 import socket import re import gevent import sys class webserver object def init self,port 初始化伺服器套接字 初始...

搭建http伺服器

本節以中標麒麟桌面作業系統 龍芯版 為例,簡單介紹 http伺服器搭建方法,其他作業系統或搭建 ftp 伺服器,請參考相關使用者手冊或網路資料。1.在 var www html 下建立update,再在update下建立packages 和repodata。將軟體包拷貝到 var www html ...

搭理http伺服器

由於在某些特定場景下,我們的外網訪問會受到限制,如果有一些訪問需求的話就需要乙個 作為中轉了。首先需要一台機器作為中轉的伺服器,這時候當然要去阿里雲買一台啦微笑。作業系統一定要選linux,我使用的是centos。之後的主要目標是在這台機器上搭建乙個http 了。當然肯定不可能自己從頭開始寫,用現有...