zoukankan      html  css  js  c++  java
  • 面向对象epoll并发

    面向对象epoll

    # -*- coding: utf-8 -*-
    import socket
    import selectors
    import re
    import sys
    
    
    HTML_ROOT = "./static"
    WSGI_ROOT = "./wsgipy"
    
    class Httpserver:
        def __init__(self):
            self.server = socket.socket()
            self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 释放端口
            self.epoll_selector = selectors.EpollSelector()
    
        def bind(self, port):
            self.server.bind(('', port))
    
        def start(self):
            self.server.listen(1000)
    # self.server为套接字对象(也是server_conn的参数), self.server_conn为方法(必须由一个参数接收该对象) self.epoll_selector.register(self.server, selectors.EVENT_READ, self.server_conn)
    while True: events = self.epoll_selector.select() for event, n in events: file_obj = event.fileobj callback = event.data callback(file_obj) def server_conn(self, server): conn, addr = server.accept() self.epoll_selector.register(conn, selectors.EVENT_READ, self.server_recv) def server_recv(self, conn): recv_data = conn.recv(1024) if recv_data: response_data_line = recv_data.splitlines()[0] file_path = re.match(r'w+ +(/[^ ]*) ', response_data_line.decode()).groups()[0] # if file_path == '/favicon.ico': # response_header = 'HTTP/1.1 200 OK ' # response_header += "Content-Type: text/image " print(file_path)
           # 动态执行py文件
    if file_path.endswith('.py'): try: module = __import__(file_path[1:-3]) except Exception: response_header = 'HTTP/1.1 404 NotFound ' send_html_content = 'no cun zai' else: send_html_content = module.application({}, self.start_response) response_header = self.response_header else: if file_path == '/': file_path = '/index.html' file_path = HTML_ROOT + file_path send_html_content = self.read_file(file_path) if not send_html_content: response_header = 'HTTP/1.1 404 NotFound ' send_html_content = 'This page is not found.' else: response_header = 'HTTP/1.1 200 OK ' response_server_version = 'super: 1.1 ' send_data = response_header + response_server_version + ' ' + send_html_content conn.send(send_data.encode()) self.epoll_selector.unregister(conn) conn.close() def start_response(self, status, headers): response_header = "HTTP/1.1" + status + " " + "super: 1.1 " for i in headers: response_header += "%s: %s " % i self.response_header = response_header def read_file(self, file_path): try: with open(file_path, 'rb') as f: content = f.read() except Exception: return False print(file_path) return content.decode() if __name__ == '__main__': # sys.path.insert(1, HTML_ROOT) # sys.path.insert(1, WSGI_ROOT) server = Httpserver() server.bind(8000) server.start()
  • 相关阅读:
    GB 51411-2020 金属矿山土地复垦工程设计标准
    GB/T 51413-2020 有色金属工业余热利用设计标准
    DL/T 1907.1-2018等最新电力行业标准
    GB 50205-2020 钢结构工程施工质量验收标准
    DL/T 5210.6-2019 电力建设施工质量验收规程 第6部分:调整试验
    GB/T 38640-2020 盲用数字出版格式
    GB 50325-2020 民用建筑工程室内环境污染控制标准(含条文说明)
    GB 50216-2019 铁路工程结构可靠性设计统一标准
    最新发布的国家标准下载(2020-5-21)
    bind、apply、call的区别
  • 原文地址:https://www.cnblogs.com/tangpg/p/10629591.html
Copyright © 2011-2022 走看看