第十九节 epoll版的HTTP服务器

2021-03-29 22:26

阅读:427

标签:cli   main   事件   一个   默认   net   epoll   ==   ddr   

import 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服务器

标签:cli   main   事件   一个   默认   net   epoll   ==   ddr   

原文地址:https://www.cnblogs.com/kogmaw/p/12602516.html


评论


亲,登录后才可以留言!