以下**,支援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...