# encoding:utf-8 import socket import thread import re def getAddr(d): a = re.search("Host: (.*)\r\n", d) host = a.group(1) a = host.split(":") if len(a) == 1: return (a[0], 80) else: return (a[0], int(a[1])) def client(conn, caddr): while 1: try: data = conn.recv(4096) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) addr = getAddr(data) print "目的服务器:",addr s.connect(addr) print \'发给目的服务器数据:\',data s.sendall(data)#将请求数据发给目的服务器 d = s.recv(40960)#接收目的服务器发过来的数据 s.close()#断开与目的服务器的连接 print \'接收目的服务器数据:\',d conn.sendall(d)#发送给代理的客户端 except Exception, e: print \'代理的客户端异常:%s, ERROR:%s\'%(caddr,e) conn.close() break def serve(PORT = 10086): # 创建 IP = "0.0.0.0" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((IP, PORT)) s.listen(10) print \'proxy start...\' while True: conn, addr = s.accept() print \'conn:\', conn print "addr:", addr thread.start_new_thread(client, (conn, addr)) try: serve() except Exception as e: print \'代理服务器异常\',e print \'server end!!!\'
http 代理服务器。 无需指定目的服务器,自动读取地址并连接。