面向对象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. Eclipse提交代码到Spark集群上运行

    Spark集群master节点:      192.168.168.200 Eclipse运行windows主机: 192.168.168.100 场景: 为了测试在Eclipse上开发的代码在Spa ...

  2. 基于zookeeper的activemq的主从集群配置

    项目,要用到消息队列,这里采用activemq,相对使用简单点.这里重点是环境部署. 0. 服务器环境 RedHat710.90.7.210.90.7.1010.90.2.102 1. 下载安装zoo ...

  3. PHP性能监测的工具介绍 - XHProf -参考自https://jingyan.baidu.com/article/7082dc1c173359e40a89bd95.html

    XHProf 这个软件本是Facebook内部的一个应用工具,2009年3月份开源,为PHP的性能监测提供了很好的工具.官方的介绍中提到: 方法/步骤     XHProf 这个软件本是Faceboo ...

  4. 线程event事件函数实现红绿灯

    #!/usr/bin/env python # -*- coding: utf-8 -*- # author aliex-hrg import threading,time event = threa ...

  5. 黄聪:超实用的PHPExcel[导入][导出]实现方法总结

    首先需要去官网https://github.com/PHPOffice/PHPExcel/下载PHPExcel,下载后只需要Classes目录下的文件即可. 1.PHPExcel导出方法实现过程 /* ...

  6. 构建自己的代码库在Code-Google上

    多年工作的代码,有不少可以抽象出来作为工具类的.如果每次都把项目的工具类存放到U盘.必然会造成维护的问题.主要是你不可能天天的带u盘 去代码里复制粘贴.去code.google.com建立自己的代码库 ...

  7. P1164小A点菜

    传送 这是一个典型的背包方案问题,设f[j]为当前价值为j的方案数,则f[j]=f[j]+f[j-a[i]],即当前方案数为选这个的方案数和不选这个东西的方案数,代码如下 #include<io ...

  8. Dubbo(4)消费Dubbo服务

    消费就是一个远程调用服务的过程: 1.项目结构:     2.项目依赖pom.xml: <project xmlns="http://maven.apache.org/POM/4.0. ...

  9. csrf攻击 使用js 调用 php文件的方法(还没实践)

    https://www.cnblogs.com/Im-Victor/p/9306535.html

  10. mysql默认8小时连接断开机制解决

    转载连接:http://www.myexception.cn/database/1639209.html 本文提供了对c3p0与DBCP连接池连接MySql数据库时, 8小时内无请求自动断开连接的解决 ...