python - 如何在python中创建一个简单的代理?

标签 python sockets proxy

我想用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()

我的测试只是通过它启动这个脚本和telnet。如果我使用wireshark,我会看到服务器完全理解了请求,并且我确实得到了一个答案,但是,我从来没有在telnet中得到答案。(使用简单的get/on google进行测试)
我觉得这个问题和“阻塞”/“非阻塞”插座有关,但我不太明白它在哪里。

最佳答案

我写了一篇关于用Python构建代理的小文章,它以异步方式工作,可以处理大量的连接。以下是链接:http://voorloopnul.com/blog/a-python-proxy-in-less-than-100-lines-of-code/(它只使用默认库。)

关于python - 如何在python中创建一个简单的代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9852045/

相关文章:

python - Django 管理服务器在 127.0.0.1 :<port>/admin/URL is hit 时关闭

Python Pandas read_csv 跳过行但保留标题

java - ObjectInputStream 不会从输出流中读取所有对象

c# - 到特定客户端的 TCP C# 数据包

javascript - 如何在防火墙后使用 mozilla Rhino?

php - 为什么这个 API 在通过 php 代理调用时不再起作用?我该如何解决?

Java:检查给定的IP和端口是否是代理服务器

python - Flask 教程 : Why do we use the app context for the DB connection?

python - 不区分大小写的集合交集

php - MAMP "Apache couldn' 无法启动,因为端口正在使用 ."AND "无法通过/tmp/mysql.sock 连接到本地 MySQL 服务器