面向对象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. 基于redis的乐观锁实践

    redis真是一个分布式应用场景下的好东西,对于我们的应用设计,功劳大大的! 今天要研究的是基于redis的事务机制以及watch指令(CAS)实现乐观锁的过程. 所谓乐观锁,就是利用版本号比较机制, ...

  2. 代理本地局域网其他PC上网的设置

  3. Team Foundation Server 2010简体中文版

    文件名称:Team Foundation Server 2010简体中文版 文件大小:1.8 GBhttp://www.google.com/profiles/dedecms.com 下载地址: th ...

  4. centos su命令

    有很多指令都只可以用 root 身份去执行,因此我们需要成为 root 用户.要这样做,我们可以使用 su 指令(更替用户).su 指令有下列格式: su - <user>或su < ...

  5. 删除右键菜单中的Git

    在打开的注册表中找到:HKEY_CLASSES_ROOT,并点HKEY_CLASSES_ROOT前面的小三角:找到Directory,点击前面的小三角:找到Background,点击前面的小三角:打开 ...

  6. 黄聪:ffmpeg参数说明(转载)

    ffmpeg.exe -i F:\闪客之家\闪客之歌.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\11.flv ffmpeg -i F:\01.wm ...

  7. 开始使用GoJS

    GoJS是一个用于实现交互式图表的JavaScript库.本页将向您展示使用GoJS的必要条件. 由于GoJS是一个依赖于HTML5功能的JavaScript库,因此您需要确保您的页面声明它是一个HT ...

  8. Razor语法记录

    虽然现在用着ASP.NET MVC但是cshtml使用Razor的标准形式去布局用的还是很少,这里就一点点把用到的关键点慢慢记下来,方便自己日后回忆吧! 1.将Action中返回的html字符串转换为 ...

  9. maven不同环境的profile配置

    1.开发的时候经常需要加载不同的环境,比如本地开发环境dev,生产环境product.如果需要手动去修改的话就太麻烦了,自己实现了maven资源替换,然后多环境下的配置文件管理的demo,在此贴出来. ...

  10. Scrapy学习篇(二)之常用命令行工具

    简介 Scrapy是通过Scrapy命令行工具进行控制的,包括创建新的项目,爬虫的启动,相关的设置,Scrapy提供了两种内置的命令,分别是全局命令和项目命令,顾名思义,全局命令就是在任意位置都可以执 ...