面向对象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\r\n'
# response_header += "Content-Type: text/image\r\n"
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\r\n'
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\r\n'
send_html_content = 'This page is not found.'
else:
response_header = 'HTTP/1.1 200 OK\r\n'
response_server_version = 'super: 1.1\r\n'
send_data = response_header + response_server_version + '\r\n' + 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 + "\r\n" + "super: 1.1\r\n"
for i in headers:
response_header += "%s: %s\r\n" % 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()

面向对象epoll并发的更多相关文章

  1. python实现并发服务器实现方式(多线程/多进程/select/epoll)

    python实现并发服务器实现方式(多线程/多进程/select/epoll)   并发服务器开发 并发服务器开发,使得一个服务器可以近乎同一时刻为多个客户端提供服务.实现并发的方式有多种,下面以多进 ...

  2. [转载]并发编程之Operation Queue和GCD

    并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...

  3. 【转】并发编程之Operation Queue

    http://blog.xcodev.com/blog/2013/10/28/operation-queue-intro/ 随着移动设备的更新换代,移动设备的性能也不断提高,现在流行的CPU已经进入双 ...

  4. JDFS:一款分布式文件管理实用程序第一篇(线程池、epoll、上传、下载)

    一 前言 截止目前,笔者在博客园上面已经发表了3篇关于网络下载的文章,这三篇博客实现了基于socket的http多线程远程断点下载实用程序.笔者打算在此基础上开发出一款分布式文件管理实用程序,截止目前 ...

  5. Socket编程实践(11) --epoll原理与封装

    常用模型的特点 Linux 下设计并发网络程序,有典型的Apache模型(Process Per Connection,PPC), TPC(Thread Per Connection)模型,以及 se ...

  6. 基于EPOLL模型的局域网聊天室和Echo服务器

    一.EPOLL的优点 在Linux中,select/poll/epoll是I/O多路复用的三种方式,epoll是Linux系统上独有的高效率I/O多路复用方式,区别于select/poll.先说sel ...

  7. 【Network】高性能 UDP 应该怎么做?

    参考资料: EPOLL-UDP-GOLANG golang udp epoll - Google 搜索 go - golang: working with multiple client/server ...

  8. 采访:Go语言编程

    Go语言是由Google在2009年11月份公布的,它的目标是要应对软件开发所面临的最新挑战.Go语言特别被设计为快速(包括在编译时).支持多核的语言,并且兼顾了动态语言的简单性和静态类型语言的安全性 ...

  9. 使用multiprocessing模块操作进程

    1.Process模块介绍 process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. Process([group [, target [, name [, args [, kwa ...

随机推荐

  1. 深入理解java虚拟机读后总结(个人总结记录)

    1.jvm布局:   jdk1.6版本JVM布局分为:heap(堆),method(方法区),stack(虚拟机栈),native stack(本地方法栈),程序计数器共五大区域. 其中方法区包含运行 ...

  2. msp430及stm32中基本的C编程知识

    为什么我使用P1OUT ^= 0x01;和P1OUT = 0x01 ^是异或计算符号 所以 每次运算都是反转的.而不不加这个运算符就是一直保持1的状态. p1out|=bit6的意思p1out的值如果 ...

  3. Delphi实现菜单项上出现提示

    type TMenuHintWindow = class(THintWindow) private FTimerShow: TTimer; FTimerHide: TTimer; procedure ...

  4. MTP 设备不显示

    win7 资源管理器(我的电脑)中不显示,但应用宝,豌豆荚工具能访问文件. 环境:WIN7 64位,手机HTC U11+ . 解决: 在设备管理器,计算机名称上右键-扫描检测硬件改动,等安装完手机驱动 ...

  5. 使用influxQL进行数据检索(说明)

    非官方:InfluxDB 基本命令操作文档 原地址:https://docs.influxdata.com/influxdb/v1.6/query_language/data_exploration/ ...

  6. 黄聪:移动应用抓包调试利器Charles

    一.Charles是什么?   Charles是在 Mac或Windows下常用的http协议网络包截取工具,是一款屌的不行的抓包工具,在平常的测试与调式过程中,掌握此工具就基本可以不用其他抓包工具了 ...

  7. 黄聪:PHP如何实现延迟一定时间后自动刷新当前页面、自动跳转header("refresh:1;url={$url}");

    //1秒后自动跳转 header("refresh:1;url={$url}"); exit; //1秒后自动刷新当前页面header("refresh:1;" ...

  8. 【git】之修改git仓库地址

    方法1 git remote set-url origin <url> 方法2 git remote rm origin git remote add origin [url] 方法三 直 ...

  9. Maven打包将所有的依赖都打入

    附上pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  10. PAT 乙级1030 完美数列(25) C++版

    1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...