zoukankan      html  css  js  c++  java
  • 第十九节 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()
  • 相关阅读:
    团队绩效打分
    软件对标分析
    目前校园百晓生APP与CSDN软件的对比
    Alpha版
    团队项目第一阶段成果展示
    意见汇总
    团队第一阶段冲刺评价
    冲刺(十)
    【WPF学习】第五十八章 理解逻辑树和可视化树
    【WPF学习】第五十七章 使用代码创建故事板
  • 原文地址:https://www.cnblogs.com/kogmaw/p/12602516.html
Copyright © 2011-2022 走看看