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()
  • 相关阅读:
    解决:IIS APPPOOLDefaultAppPool 登录失败的问题
    C#操作txt文件并清空添加操作
    linux修改yum本地源的方法
    CentOS防火墙开启、关闭与开放指定端口
    CentOS配置SSH远程连接
    判断js对象是否拥有某一个属性的js代码
    bash脚本输入密码不回显问题的解决方法
    js控制表单操作的常用代码小结
    绝版Node--Sequlize搭建服务(Node全栈之路 二)
    绝版Node--Sequlize搭建服务(Node全栈之路)
  • 原文地址:https://www.cnblogs.com/tangpg/p/10629591.html
Copyright © 2011-2022 走看看