昨天下午一直在倒腾Kali
一直没写作业 结果别人就开始写了
东哥也没说用线程进程或者select或者epoll实现
课件上的epoll也没讲全
但是我想了想 反正今天刚学epoll而且epoll性能远优于其它几种 就试1试…
开始写了
.
.
.
(半小时过去了)
.
.
.
别的小伙伴已经拿select写的都能显示index了 嘛p的我还在研究epoll(毕竟东哥课件上epoll不太全,但由于epoll是全双工 这里EPOLLIN| LET就可完成收和发的任务..
(以后epoll功能学的纯青后来改写..)
.
.
这里python用epoll实现一个简易HTTP服务端的功能:
没封装的yo~
基本能看懂
{很菜 大神请左拐..}
#coding=utf-8
import socket
import select
import re
import os
#x= raw_input('请输入您要访问的页面:')
responeseDir={'200':'HTTP/1.1 200 OK','404':'HTTP/1.1 404 Not Found','Content-Type':'text/html',}
def join_send():
tempDir = re.search(r'GET (.*) HTTP',recvData).group(1)
# /favicon.ico
print 'tempDir is :%s'%tempDir
# 没有加具体文件 默认访问根目录
if tempDir=='/':
fileDir='./index.html'
# 带访问文件 因为正则处理之后不加点 为了方便open 文件在当前目录打开
else:
fileDir = '.'+tempDir
try:
f=open(fileDir,'r')
except Exception, e:
conn.send(responeseDir['404']+'Content-Type: text/html\r\n\r\n'+open('404.html','r').read())
print e
# 组包
else:
#f=open(fileDir,'r')
content=f.read()
message1=responeseDir['200']
# 如果后缀是图片 的处理 image/png
print
print tempDir[-3:]
print
if 'png'==tempDir[-3:]:
types = 'png'
# 文件后缀不是图片 以html打开
elif 'jpg'==tempDir[-3:]:
types = 'jpg'
else:
types = 'html'
# get GET request type
#form=re.search(r'[aA]ccept:.*\n',fileDir).group()
#form=form[:-1]
message2='Content-Type:text/'+types+'\r\n\r\n'
message=message1+message2+content
print '>'*30
print '正在发送应答包.........\n%s'%message
conn.send(message)
f.close()
host, port='',8083
# socket 设置
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host, port))
s.listen(5)
print 'Serving on port >> %s ..'% port
# 创建一个epoll对象
epoll=select.epoll()
epoll.register(s.fileno(),select.EPOLLIN|select.EPOLLET)
connections = {}
addresses = {}
# main
while True:
epoll_list=epoll.poll()
for fd,events in epoll_list:
# 监听包
# 如果是新的套接字
if fd == s.fileno():
conn,addr=s.accept()
print('有新的客户端到来%s'%str(addr))
# 将连接 socket 设置为 非阻塞
conn.setblocking(0)
# 向epoll注册 可读
epoll.register(conn.fileno(), select.EPOLLIN | select.EPOLLET)
connections[conn.fileno()] = conn
addresses[conn.fileno()] = addr
#EPOLL IN : 可读模式 即为[可收数据]模式
elif events == select.EPOLLIN:
# 从激活 fd 上接收
# connections[fd] 就是新的套接字
while True:
try:
recvData = connections[fd].recv(1024)
#print recvData
if len(recvData)>0:
# 打印数据
print('[+] 正在获取请求文件路径 >> >> >> >>')
join_send()
else:
# 从 epoll 中移除该 连接 fd
epoll.unregister(fd)
# server 侧主动关闭该 连接 fd
connections[fd].close()
break
except Exception, msg:
print msg
epoll.unregister(fd)
connections[fd].close()
break
#可写
elif events ==select.EPOLLOUT:
# 更新 epoll 句柄中连接 fd 注册事件为 可读
epoll.modify(fd, select.EPOLLIN | select.EPOLLET)
else:
# 其他 epoll 事件不进行处理
continue
最近没功夫写自己认为有用的代码
有空就好了
希望国庆快来
明天学sql
有个撒比在边上看我要关 了