面向对象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. 根据时间段获取时间段内所有时间点(js)

    Date.prototype.format=function (){var s='';s+=this.getFullYear()+'-';// 获取年份.s+=(this.getMonth()+1)+ ...

  2. CheckFail设计很垃圾

        function checkFail(node, onError, fuckIE) {         var id = node.src;//检测是否死链         node.onlo ...

  3. 【亲测】<g++/gcc>CentOS下g++: command not found问题的解决(c++环境安装)

    CentOS下g++: command not found问题的解决 2017年02月27日 18:09:06 阅读数:5174 标签: centosgcc 更多 个人分类: 问题分析   版权声明: ...

  4. Java第10次实验(网络)

    参考资料 本次作业参考文件 正则表达式参考资料 漫画:HTTP 协议极简教程,傻瓜都能看懂! 注:主要根据实验任务书的指导完成本次实验. 第1次实验 1. 网络基础 ipconfig.ping Con ...

  5. 胖子哥的大数据之路(7)- 传统企业切入核心or外围

    一.引言 昨天和一个做互联网大数据(零售行业)的朋友交流,关于大数据传统企业实施的切入点产生了争执,主要围绕两个问题进行了深入的探讨: 问题1:对于一个传统企业而言什么是核心业务,什么是外围业务? 问 ...

  6. 运营站点-开放robots后,站内google搜索数量第二天10条左右,第5天搜录9920条,可喜可贺

    开放robots后,站内google搜索数量第二天10条左右,第5天搜录9920条,可喜可贺 2014年4月29日 16:17:56 到目前为之已搜录14000多条,已有客户在网站注册,加入购物车

  7. ALGO-121_蓝桥杯_算法训练_猴子分苹果

    问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果.第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一 ...

  8. 【springboot】之利用shell脚本优雅启动,关闭springboot服务

    springbot开发api接口服务,生产环境中一般都是运行独立的jar,在部署过程中涉及到服务的优雅启动,关闭, springboot官方文档给出的有两种方式, 1.使用http shutdown ...

  9. Ubuntu 14.10 下Hadoop HttpFS 配置

    因为hadoop集群中需要配置一个图形化管理数据的截面,后来找到HUE,那么在配置HUE的过程中,发现需要配置httpfs,因为配置了httpfs,hue才能去操作hdfs中的数据. HttpFs能干 ...

  10. 一个简单的基于多进程实现并发的Socket程序

    在单进程的socket的程序的基础上,实现多进程并发效果的思路具体是:在server端开启“链接循环”,每建立一次链接就生成一个Process对象进行server-client的互动,而client端 ...