import socket
import re
import multiprocessing
import time
class WSGTServer(object):
def __init__(self):
# 1、創(chuàng)建套接字
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2、綁定
self.tcp_server_socket.bind(("", 7890))# 空代表任何端口都可以
# 3、變?yōu)楸O(jiān)聽套接字(最大鏈接數(shù)128)
self.tcp_server_socket.listen(128)# 調(diào)用listen變?yōu)楸粍?/p>
def service_client(self,new_socket):
# 為這個客戶端返回數(shù)據(jù)
# 1、接收瀏覽器發(fā)送過來的請求
# GET / HTTP/1.1
# ......
request = new_socket.recv(1024).decode("utf-8")
# print('<<<<<' * 20)
# print(request)
request_lines = request.splitlines()
print("")
print(">" * 20)
print(request_lines)
# GET /index.py HTTP/1.1
# get post put del
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])# *:0個~~多個
file_name = ""
if ret:
file_name = ret.group(1)
print("*" * 50, file_name)
if file_name == '/':
file_name = '/絲芙蘭.html'
# 2、返回HTTP格式的數(shù)據(jù)給瀏覽器
# 2.1 如果請求的資源不是以.py結(jié)尾,那么就認(rèn)為是靜態(tài)資源(html/css/js/png/jpg)
if not file_name.endswith(".py"):
try:
# f = open("../創(chuàng)維官方商場-權(quán)威官網(wǎng) 彩電領(lǐng)導(dǎo)者/charry.html", "rb")
f = open("../sephore" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "---FILE NOT FOUND---"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
# 2.1準(zhǔn)備發(fā)送給瀏覽器的Header
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n"
# 2.2準(zhǔn)備發(fā)送給瀏覽器的Body
# response += "<h1>hahaha</h1>"
# 將Response Heard 發(fā)送給瀏覽器
new_socket.send(response.encode("utf-8"))
# 將Response Body 發(fā)送給瀏覽器
new_socket.send(html_content)
else: # 2.2 如果是以.py結(jié)尾,就認(rèn)為是動態(tài)資源的請求
header = "HTTP/1.1 200 OK\r\n"
header += "\r\n"
body = "hahaha %s" % time.ctime();
response = header + body
# 發(fā)送response給瀏覽器
new_socket.send(response.encode("utf-8"))
# 關(guān)閉客戶端套接字
new_socket.close()
def run_forever(self):
while True:
# 4、等待新客戶端的連接
new_socket, client_addr = self.tcp_server_socket.accept()
# 5、為這個客戶端服務(wù)
# service_client(new_socket)
p = multiprocessing.Process(target=self.service_client, args=(new_socket,))
p.start()
new_socket.close()
# 6、關(guān)閉監(jiān)聽套接字
self.tcp_server_socket.close()
def main():
# 用來完成整體的控制,創(chuàng)建一個web服務(wù)器對象,調(diào)用run_forever方法運(yùn)行
wsgi_server = WSGTServer()
wsgi_server.run_forever()
if __name__ == '__main__':
main()