要求:使用socket搭建简易http server,处理request并响应response,根据url响应不同页面,实现用户登录的机制,实现cookie
import socket
import re
import time
import threading
import multiprocessing
def parse_request(cli_skt):
request_msg = cli_skt.recv(1024).decode("utf-8")
# print("-"*10+request_msg+"-"*10)
# print(request_msg)
head,body = request_msg.split("\r\n\r\n")
# print(body)
print("-"*5,body)
if parse_body(body):
print("yes"*10)
else:
print("no"*10)
request_line = head.split("\r\n")
# print(head+"dddddddddddddddddddddddddddddd")
# print("sdad"+body)
method = request_line[0].split("/")[0]
# print(request_line[1])
# print(request_msg)
print("+"*5,body)
if body == "":
resp_head = "HTTP/1.1 200 OK\r\n\r\n"
else:
resp_head = "HTTP/1.1 200 OK\r\nSet-Cookie:session = 123\r\n\r\n"
req_url = re.match(r"[^/]+(/[^ ]*)",request_line[0])
# print("-"*10,req_url)
if req_url:
file_name = req_url.group(1)
print(file_name)
# text_content = ""
if file_name == "/" :
f = open("./html/index.html","rb")
text_content = f.read()
f.close()
elif file_name == "/favicon.ico":
text_content = ""
else:
# try:
# f = open("./html"+file_name)
# text_content = f.read()
# f.close()
# except:
# text_content = ""
f = open("./html"+file_name,"rb")
text_content = f.read()
f.close()
cli_skt.send(resp_head.encode("utf-8"))
if text_content != "":
cli_skt.send(text_content)
cli_skt.close()
def parse_body(body):
users = get_txt()
for item in users:
if body == item:
return True
else:
return False
def get_txt():
f = open("./html/data.txt","r")
txt_cont = f.read()
f.close()
splited_txts = txt_cont.split("|")
return splited_txts
def main():
server_skt = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_skt.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_skt.bind(('',6789))
server_skt.listen(128)
while True:
print("new loop")
cli_skt,addr = server_skt.accept()
p = threading.Thread(target = parse_request,args = (cli_skt,))
# parse_request(cli_skt)
p.start()
server_skt.close()
if __name__ == '__main__':
main()
第一次做,问题还是很大的,但是勉强能用,要求全达到了。
除了server.py外,还需要在同一路径下新建html文件夹,html文件夹中写入index.html、login.html、loginError.html作不同返回时使用,还要新建users.txt作为用户登录信息存储