from gevent import monkey
monkey.patch_all() # 打補丁
import socket
import re
import gevent
import sys
class webserver(object):
def __init__(self, port):
"""初始化伺服器套接字"""
# 初始化伺服器套接字
self.server_soc = socket.socket(socket.af_inet, socket.sock_stream)
self.server_soc.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1) # 設定套接字復用位址
self.server_soc.bind(("", port))
self.server_soc.listen(128)
def startup(self):
"""開啟伺服器"""
while true:
# 獲取客戶端連線
print('等待客戶端連線~~')
client_soc, client_addr = self.server_soc.accept()
# 為乙個客戶端提供服務
gevent.spawn(self.handle_client, client_soc)
# 關閉伺服器套接字
server_soc.close()
def handle_client(self, client_soc):
"""處理乙個客戶端的請求"""
# 獲取請求頭
recv_data = client_soc.recv(1024*4)
print(recv_data)
if not recv_data:
print('客戶端關閉連線')
client_soc.close()
return
# 獲取使用者請求的資源路徑
# 讀取檔案內容
with open('html' + path,'rb') as file:
file_content = file.read()
# 返回響應資料
# 讀取 404 檔案內容
with open('html/404.html','rb') as file:
file_content = file.read()
# 處理響應資料
# 關閉客戶端套接字
"""從瀏覽器請求裡解析出資源路徑"""
# 獲取到請求行
head_list = re.split(r'\r\n', request)
# print(head_list)
request_line = head_list[0]
# 獲取到請求的資源路徑
datas = re.split(r' ', request_line)
# print(datas)
# 對路徑的安全檢查
path = datas[1]
if path == '/':
path = '/index.html'
return path
def main():
"""開發乙個能夠響應瀏覽器請求的 web 伺服器"""
if len(sys.argv) < 2:
print('必須在終端引數裡指定埠號')
return
# 獲取啟動引數
port = int(sys.argv[1])
# print(port)
# 建立伺服器
server = webserver(port)
# 開啟伺服器
server.startup()
if __name__ == '__main__':
main()
#新增內容不大,注意下面兩點
#keep-alive\r\n'
#content-length:%d\r\n'
TCP伺服器非堵塞物件導向長連線
def main server socket init server run server server socket tcp server webserver tcp server.run server class webserver object def run server self 執行服務...
Web伺服器 併發伺服器 長連線(3 4 4)
每次new socket都被強制關閉,造成短連線 所提不要關閉套接字 但是不關閉的話,瀏覽器不知道發完沒有啊 此時用到header的屬性content length 將http body的長度裝到返回頭,送出給瀏覽器 當瀏覽器獲取完資料了之後,就不會再載入了 設定非堵塞 tcp sever sock...
Web伺服器 併發伺服器 長連線(3 4 4)
目錄 每次new socket都被強制關閉,造成短連線 所提不要關閉套接字 但是不關閉的話,瀏覽器不知道發完沒有啊 此時用到header的屬性content length 將http body的長度裝到返回頭,送出給瀏覽器 當瀏覽器獲取完資料了之後,就不會再載入了 設定非堵塞 tcp sever s...