# author : yang.cao
# date : 2020.02.07
import re
import socket
import select
def server_client(client_socket, data):
ret = None
try:
ret = re.match(r"[^/]*(/[^\s]*)", data.splitlines()[0])
except Exception as err:
print("1.{}".format(err))
if ret:
try:
file_name = ret.group(1)
if file_name == "/":
file_name += "index.html"
print(file_name)
f = open("./html{}".format(file_name), "rb")
except Exception as err:
print("2.{}".format(err))
else:
f_content = f.read()
response_content = "HTTP/1.1 200 OK\r\n"
response_content += "content-length:{}\r\n".format(len(f_content))
response_content += "\r\n"
response_content = response_content.encode() + f_content
client_socket.send(response_content)
def main():
client_socket_dict = dict()
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setblocking(False) # 设置socket为非阻塞模式
tcp_server_socket.bind(("", 8888)) # 绑定本地ip
tcp_server_socket.listen(128) # 设置为监听模式
tcp_epoll = select.epoll() # 创建epoll
tcp_epoll.register(tcp_server_socket.fileno(), select.EPOLLIN) # 将服务器socket注册到epoll中
while True:
socket_epoll_list = tcp_epoll.poll()
for socket_fd, socket_event in socket_epoll_list:
if socket_fd == tcp_server_socket.fileno():
client_socket, client_addr = tcp_server_socket.accept()
client_socket.setblocking(False)
client_socket_dict[client_socket.fileno()] = client_socket
tcp_epoll.register(client_socket, select.EPOLLIN | select.EPOLLHUP)
elif socket_event & select.EPOLLHUP:
tcp_epoll.unregister(socket_fd)
client_socket_dict[socket_fd].close()
del client_socket_dict[socket_fd]
elif socket_event & select.EPOLLIN:
data = client_socket_dict[socket_fd].recv(1024)
if data:
server_client(client_socket_dict[socket_fd], data.decode())
else:
tcp_epoll.unregister(socket_fd)
client_socket_dict[socket_fd].close()
del client_socket_dict[socket_fd]
if __name__ == "__main__":
main()
python 单进程单线程长链接http server epoll实现
最新推荐文章于 2024-04-30 14:25:08 发布