web靜態伺服器 epool

2021-09-29 11:56:39 字數 4144 閱讀 7653

以下**,支援http的長連線,即使用了content-length

import socket

import time

import sys

import re

import select

class

wsgiserver

(object):

"""定義乙個wsgi伺服器的類"""

def__init__

(self, port, documents_root)

:# 1. 建立套接字

self.server_socket = socket.socket(socket.af_inet, socket.sock_stream)

# 2. 繫結本地資訊

self.server_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr,1)

self.server_socket.bind((""

, port)

)# 3. 變為監聽套接字

self.server_socket.listen(

128)

self.documents_root = documents_root

# 建立epoll物件

self.epoll = select.epoll(

)# 將tcp伺服器套接字加入到epoll中進行監聽

self.epoll.register(self.server_socket.fileno(

), select.epollin|select.epollet)

# 建立新增的fd對應的套接字

self.fd_socket =

dict()

defrun_forever

(self)

:"""執行伺服器"""

# 等待對方鏈結

while

true

:# epoll 進行 fd 掃瞄的地方 -- 未指定超時時間則為阻塞等待

epoll_list = self.epoll.poll(

)# 對事件進行判斷

for fd, event in epoll_list:

# 如果是伺服器套接字可以收資料,那麼意味著可以進行accept

if fd == self.server_socket.fileno():

new_socket, new_addr = self.server_socket.accept(

)# 向 epoll 中註冊 連線 socket 的 可讀 事件

self.epoll.register(new_socket.fileno(

), select.epollin | select.epollet)

# 記錄這個資訊

self.fd_socket[new_socket.fileno()]

= new_socket

# 接收到資料

elif event == select.epollin:

request = self.fd_socket[fd]

.recv(

1024

).decode(

"utf-8"

)if request:

self.deal_with_request(request, self.fd_socket[fd]

)else

:# 在epoll中登出客戶端的資訊

self.epoll.unregister(fd)

# 關閉客戶端的檔案控制代碼

self.fd_socket[fd]

.close(

)# 在字典中刪除與已關閉客戶端相關的資訊

del self.fd_socket[fd]

defdeal_with_request

(self, request, client_socket)

:"""為這個瀏覽器伺服器"""

ifnot request:

return

request_lines = request.splitlines(

)for i, line in

enumerate

(request_lines)

:print

(i, line)

# 提取請求的檔案(index.html)

("正則提取資料:"

, ret.group(1)

)print

("正則提取資料:"

, ret.group(2)

) file_name = ret.group(2)

if file_name ==

"/":

file_name =

"/index.html"

# 讀取檔案資料

try:

f =open

(self.documents_root+file_name,

"rb"

)except

: response_body =

"file not found, 請輸入正確的url"

# 將header返回給瀏覽器

client_socket.send(response_header.encode(

'utf-8'))

# 將body返回給瀏覽器

# 將資料返回給瀏覽器

client_socket.send(response_header.encode(

"utf-8"

)+response_body)

# 設定伺服器服務靜態資源時的路徑

documents_root =

"./html"

defmain()

:"""控制web伺服器整體"""

# python3 ***x.py 7890

iflen

(sys.ar**)==2

: port = sys.ar**[1]

if port.isdigit():

port =

int(port)

else

:print

("執行方式如: python3 ***.py 7890"

)return

print

("http伺服器使用的port:%s"

pythonweb靜態伺服器 靜態Web伺服器

靜態web伺服器 可以發出請求的瀏覽器提供靜態文件的程式。搭建python自帶靜態web伺服器 如何搭建python自帶的靜態web伺服器 windows可以實現資源共享的目的 語法 python m http.server 埠號 1.win r 輸入cmd進入命令指令視窗 2.切換目錄,選擇目錄建...

nginx配置靜態web伺服器

配置靜態的web,需要實現乙個虛擬主機。step1 準備工作 1 檢視你的網絡卡位址 我的 192.168.223.135 ifconfig 我們這裡建立兩個web伺服器,所以增加乙個網絡卡位址。ifconfig eth0 0 192.168.223.145 2 建立兩個站點目錄 mkdir var...

簡單web靜態頁面伺服器

先看一下檔案結構 伺服器 第一種 web靜態伺服器顯示固定的頁面 伺服器 coding utf 8 建立乙個web靜態伺服器顯示固定的頁面 建立乙個tcp的socket 使用程序監聽埠 import socket from multiprocessing import process defhand...