我想用python创建一个非常简单的代理(主要是为了理解它是如何工作的)。我在谈论一个通用的TCP代理,而不仅仅是http。 我已经构建了以下代码,但是,它似乎只能以一种方式工作:即请求已发送但我从未得到答案。这是代码:
import socket
import argparse
#Args
parser = argparse.ArgumentParser(description='ProxyDescription')
parser.add_argument('-l', '--listen', action='store', help='Listening port', default=80, type=int)
parser.add_argument('destination', action='store', help='Destination host')
parser.add_argument('port', action='store', help='Destination port', type=int)
args = parser.parse_args()
#Server
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.bind(('', args.listen))
s1.listen(1)
conn1, addr1 = s1.accept()
#Client
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.connect((args.destination, args.port))
s2.setblocking(0)
print "Connected by ", addr1
while 1:
datato = conn1.recv(1024)
if not datato:
print "breaking to"
break
s2.send(datato)
print "data send : " + datato
try:
datafrom = s2.recv(1024)
print "reveived data : " + datafrom
if not datafrom:
print "breakinf from"
break
print "datafrom: " + datafrom
conn1.send(datafrom)
except socket.error, msg:
print "error rcving: " + str(socket.error) + " || " + str(msg)
continue
print "the end ... closing"
conn1.close()
s2.close()
我的测试只是启动此脚本并通过它进行远程登录。如果我看看wireshark,我看到服务器完全理解了请求,我得到了答案,但是,我从来没有在telnet中得到答案。 (在谷歌上用简单的GET /测试) 我觉得这个问题与“阻塞”/“非阻塞”套接字有关但我无法真正理解它在哪里。
答案 0 :(得分:8)
我写了一篇关于在python中构建代理的文章,它以异步方式工作,可以处理大量的连接。这是链接:http://voorloopnul.com/blog/a-python-proxy-in-less-than-100-lines-of-code/(它只使用默认库。)
答案 1 :(得分:4)
可能这个食谱可以帮助你http://code.activestate.com/recipes/114642/