python的http代理服务脚本性能优化proxyHandler.py
2017-11-29 11:18
579 查看
#coding=utf-8 import socket import urlparse import select import threading 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 receive(self,sock, n, timeout=20): (rlist,wlist,elist) =select.select([sock], [], [], timeout) if sock in rlist: return sock.recv(n) else: raise RuntimeError, "timed out on %r" % (sock,) def stream_examine(self, proto, addr): s = socket.socket(proto, socket.SOCK_STREAM) s.connect(addr) s.sendall() buf = data = self.receive(s, BUFLEN) while data and '\n' not in buf: data = self.receive(s, 100) buf += data s.close() def get_headers(self): header='' while True: header+=self.source.recv(BUFLEN) index=header.find('\n') if index >0: break 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\r\n" %(self.headers['method'],self.headers['path'],self.headers['protocol']) self.destnation.send(data+self.request) print data+"\n"+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): self.host=host self.port=port self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.server.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) self.server.bind((host,port)) self.server.listen(5) def start(self): while True: try: conn,addr=self.server.accept() Proxy(conn,addr) except: conn.close() def test(): s=Server(HOSTIP,8888) threads = [] for i in range(40): t = threading.Thread(target=s.start,args=()) t.daemon = True # In case this function raises. threads.append(t) for t in threads: t.start() for t in threads: t.join() if __name__=='__main__': test()HOSTIP:表示服务ID
相关文章推荐
- Python针对特定服务定制的代理工具V2.0------(proxyHandler.py)
- Python针对特定服务定制的代理工具V2.0------(proxyHandler.py)
- Python针对特定服务定制的代理工具V2.0------(proxyHandler.py)
- Python针对特定服务定制的代理工具V2.0------(proxyHandler.py)
- dumpheaders_http_threading_server.py脚本的Python 3.5迁移版
- 性能测试篇 :Jmeter HTTP代理服务器录制压力脚本
- Python针对特定服务定制的代理工具V2.0------(server.py)
- http代理的脚本http_proxy.py
- Python针对特定服务定制的代理工具V2.0------(zipdeal.py)
- Python针对特定服务定制的代理工具V2.0----------(__init__.py与Run.py)
- Py之Crawler:利用python尝试获取cn-proxy代理的IP地址——Jason niu
- Windows 10上修改Python 3.5的server.py,使得其http server脚本可以正确处理中文目录文件名
- Python针对特定服务定制的代理工具V2.0------(server.py)
- 基于Python SimpleHTTPServer.py的修改脚本:HTTP文件服务器,修正中文目录列表,支持视频文件在线播放
- Python针对特定服务定制的代理工具V2.0------(server.py)
- Python针对特定服务定制的代理工具V2.0----------(__init__.py与Run.py)
- Python针对特定服务定制的代理工具V2.0----------(__init__.py与Run.py)
- Python针对特定服务定制的代理工具V2.0------(zipdeal.py)
- Python针对特定服务定制的代理工具V2.0------(server.py)
- python 免费http代理服务接口