Python用epoll实现简易HTTP服务端

昨天下午一直在倒腾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
有个撒比在边上看我要关 了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值