zoukankan      html  css  js  c++  java
  • python实战--Http代理服务器

    源代码如下:

    import socket
    import thread
    import urlparse
    import select
    
    BUFLEN=8192
    
    
    class Proxy(object):
        def __init__(self,conn,addr):
            self.source=conn
            self.request=""
            self.headers={}
            self.destnation=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            self.run()
    
        def get_headers(self):
            header=''
            while True:
                header+=self.source.recv(BUFLEN)
                index=header.find('
    ')
                if index >0:
                    break
            #firstLine,self.request=header.split('
    ',1)
            firstLine=header[:index]
            self.request=header[index+1:]
            self.headers['method'],self.headers['path'],self.headers['protocol']=firstLine.split()
    
        def conn_destnation(self):
            url=urlparse.urlparse(self.headers['path'])
            hostname=url[1]
            port="80"
            if hostname.find(':') >0:
                addr,port=hostname.split(':')
            else:
                addr=hostname
            port=int(port)
            ip=socket.gethostbyname(addr)
            print ip,port
            self.destnation.connect((ip,port))
            data="%s %s %s
    " %(self.headers['method'],self.headers['path'],self.headers['protocol'])
            self.destnation.send(data+self.request)
            print data+self.request
    
    
        def renderto(self):
            readsocket=[self.destnation]
            while True:
                data=''
                (rlist,wlist,elist)=select.select(readsocket,[],[],3)
                if rlist:
                    data=rlist[0].recv(BUFLEN)
                    if len(data)>0:
                        self.source.send(data)
                    else:
                        break
        def run(self):
            self.get_headers()
            self.conn_destnation()
            self.renderto()
    
    
    
    class Server(object):
    
        def __init__(self,host,port,handler=Proxy):
            self.host=host
            self.port=port
            self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.server.bind((host,port))
            self.server.listen(5)
            self.handler=handler
    
        def start(self):
            while True:
                try:
                    conn,addr=self.server.accept()
                    thread.start_new_thread(self.handler,(conn,addr))
                except:
                    pass
    
    
    if __name__=='__main__':
        s=Server('127.0.0.1',8080)
        s.start()
  • 相关阅读:
    Jmeter压测
    .NET .Core 选择日志框架
    边缘控制器在边缘计算中的作用
    为何选择NB-IOT,NB-IOT的特点是什么
    RS232协议是什么
    物联网在生活中的应用场景
    透传模块是什么 为何透传
    4G DTU相对于GPRS/3G DTU有什么优势
    MQTT协议和Modbus之间的区别是什么
    4G模块应该怎么选择
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/4937767.html
Copyright © 2011-2022 走看看