def main():
# server_socket = init_server()
# run_server(server_socket)
tcp_server = webserver()
tcp_server.run_server()
class webserver(object):
def run_server(self):
"""執行服務"""
# 設定server_socket的非堵塞狀態
self.server_socket.setblocking(false)
# 使用客戶端列表接收新的客戶端
clients = list()
# 迴圈接收客戶請求
while true:
# 使用非堵塞時,會報錯,用try進行捕獲異常
try:
# 從三次握手的佇列中取出乙個客戶端關聯的套接字
client, addr = self.server_socket.accept()
# client_run(client)
print(client)
# 將新接收的客戶端放到客戶端列表中
# 設定客戶端的非堵塞狀態
client.setblocking(false)
except exception as e:
pass
# 迴圈取出客戶端,檢視是否有資料
for client_new in clients:
# 捕獲client的非堵塞狀態時產生的異常
try:
# 接收客戶端傳送過來的資料
data = client_new.recv(1024).decode()
# 判斷是否有資料
if data: # 有資料
# 處理乙個客戶端的請求
self.client_run(client_new, data)
else: # 沒有資料
client_new.close() # 關閉沒有資料的客戶端套接字
clients.remove(client_new) # 將沒有資料的客戶端從列表中刪除
except exception as e:
pass
# 關閉套接字
self.server_socket.close()
def client_run(self, client,data):
"""處理乙個客戶端請求"""
# 接收資料
# print(client)
# time.sleep(10)
# data = client.recv(1024).decode()
# 將接收的資料分割為以每一行作為乙個元素的列表
header_lines = data.splitlines()
try:
header_line = header_lines[0]
print(header_line)
res = re.match(r"[^/]+([^ ]*)", header_line)
# 判斷是否匹配
if res: # 匹配了
file = res.group(1)
# 如果是"/",則是在訪問首頁"index.html"
if file == "/":
file = "/index.html"
except exception as e:
print(e)
try:
# 傳送資料
# http頭部字段告訴瀏覽器接收多少位元組結束本次資料的傳輸
body = "頁面不見了"
content = header + "\r\n" + body
client.send(content.encode("utf-8"))
# 關閉套接字
# client.close()-----------注釋掉關閉客戶端,就是長連線
def __init__(self):
"""建立tcp套接字"""
# 建立tcp伺服器端套接字
self.server_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 設定套接字位址選項
self.server_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
# 繫結本地埠
self.server_socket.bind(("", 9999))
# 變為被動套接字
self.server_socket.listen(128)
# return server_socket
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 初始化伺服器套接字 初始...
Web靜態伺服器 非堵塞模式
coding utf 8 from socket import import time 用來儲存所有的新鏈結的socket g socket list list defmain server socket socket af inet,sock stream server socket.setsoc...
Python Web靜態伺服器 非堵塞模式
coding utf 8 from socket import import time 用來儲存所有的新鏈結的socket g socket list list def main server socket socket af inet,sock stream server socket.setso...