第十九节 epoll版的HTTP服务器
2021-03-29 22:26
标签:cli main 事件 一个 默认 net epoll == ddr 第十九节 epoll版的HTTP服务器 标签:cli main 事件 一个 默认 net epoll == ddr 原文地址:https://www.cnblogs.com/kogmaw/p/12602516.htmlimport socket
import select
‘‘‘
kernel:Linux的操作系统
epoll:创造一个特殊的内存空间,tcp服务器和操作系统共用,将套接字列表放在该内存,不再使用轮询的方式遍历列表,而采用事件通知
轮询:开发上讲遍历称为轮询
事件通知:
‘‘‘
def tcp_serve(resp_socket):
resp_body = ‘hahaha‘
resp_header = ‘HTTP/1.1 200 OK\r\n‘ + ‘Content-Length:%d\r\n‘ % len(resp_body) + "\r\n" + "\r\n"
resp_data = resp_header + resp_body
resp_socket.send(resp_data.encode(‘utf-8‘))
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((‘192.168.0.106‘,8080))
web_socket.listen(128)
web_socket.setblocking(False)
client_socket_list = list()
epl = select.epoll()
# 创建epoll对象,即创造特殊的内存空间
epl.register(web_socket.fileno(), select.EPOLLIN)
# 将监听套接字对应的文件描述符放入epl中,web_socket.fileno()取出其对应的文件描述符,select.EPOLLIN为触发的事件类型这个表示收到数据
fd_socket_dict = dict
while True:
fd_event_list = epl.poll()
# 默认会阻塞,直到系统监听到有数据到来,通过事件通知方式告诉这个程序,此时才会接阻塞
# epl.poll()会返回一个元组(fd, event)即文件描述符和这个文件描述符是什么事件,例如接受数据等
for fd, event in fd_event_list:
if fd == web_socket.fileno():
new_socket, client_addr = web_socket.accept()
epl.register(new_socket.fileno(), select.EPOLLIN)
fd_socket_dict[new_socket.fileno()] = new_socket
elif event == select.EPOLLIN:
recv_data = fd_socket_dict[fd].recv(1024).decode(‘utf-8‘)
if recv_data:
tcp_serve(fd_socket_dict[fd])
else:
fd_socket_dict[fd].close()
epl.unregister(fd)
# 将这个文件描述符从epl注册中删除
del fd_socket_dict[fd]
web_socket.close()
if __name__ == ‘__main__‘:
main()
文章标题:第十九节 epoll版的HTTP服务器
文章链接:http://soscw.com/index.php/essay/69710.html