第十九节 epoll版的HTTP服务器

Posted kog_maw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十九节 epoll版的HTTP服务器相关的知识,希望对你有一定的参考价值。

import socket
import select

‘‘‘
kernel:Linux的操作系统
epoll:创造一个特殊的内存空间,tcp服务器和操作系统共用,将套接字列表放在该内存,不再使用轮询的方式遍历列表,而采用事件通知
轮询:开发上讲遍历称为轮询
事件通知:

‘‘‘

def tcp_serve(resp_socket):
    resp_body = hahaha
    resp_header = HTTP/1.1 200 OK
 + Content-Length:%d
 % len(resp_body) + "
" + "
" 
    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服务器的主要内容,如果未能解决你的问题,请参考以下文章

学习Linux第十九节课

第十九节——线程与同步代码块和锁

centos mysql 优化 第十九节课

第十九节 集群模式内各节点的通信和文件拷贝

centos mysql 实战 第十九节课

第十九节——spring练习之页面上用户的添加