epoll机制 微型web服务器

import select
import re
import socket


def socket_sever(sever_socket,request_head):
if request_head: #如果请求头不为空
list = request_head.splitlines()
request_line = list[0]
path = re.match("[^/]+(/[^ ]+)", request_line).group(1)
if path == "/": #如果请求的地址只有/
path = "/index.html"
try:
file = open("html"+path, "rb")
except Exception: #如果路径不存在
respond_head = "HTTP/1.1 404 NOT FOUND\r\n"
respond_head += "\r\n"
respond_body = "<h1>抱歉您请求的数据丢失了</h1>"
sever_socket.send(respond_head.encode('utf-8'))
sever_socket.send(respond_body.encode("utf-8"))
else:
content = file.read()
respond_body = content
respond_head = "HTTP 1.1 200 OK\r\n"
respond_head += "\r\n"
file.close()
sever_socket.send(respond_head.encode('utf-8'))
sever_socket.send(respond_body)
sever_socket.close()


def main():
# 创建服务器套接字
web_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
web_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
web_socket.bind(("", 8080))
web_socket.listen(128)
# 得到为客户端服务的独立的套接字
epl = select.epoll()#创建epoll()实例对象
epl.register(web_socket.fileno(),select.EPOLLIN)#将服务器套接字文件描述符注册到epl当中去
epl_info = {}
while True:
epl_list = epl.poll()
for fd in epl_list:
if fd == web_socket.fileno():
sever_socket, sever_address = web_socket.accept()
epl.register(sever_socket.fileno(),select.EPOLLIN)
epl_info[fd] = sever_socket.fileno()
else:
if fd == epl_info[fd]:
request_head = sever_socket.recv(1024).decode("utf-8")
if request_head:
socket_sever(sever_socket,request_head)
else:
sever_socket.close()
epl.unregister(sever_socket)
del epl_info[fd]

#socket_sever(sever_socket)
# 创建子进程
#web_socket.close()

if __name__ == '__main__':
main()

猜你喜欢

转载自www.cnblogs.com/guducp/p/9145022.html