创建 python 代理服务器

Creating a python proxy server

大家好,我正在尝试使用 python 编程语言创建代理服务器。

我在 http://voorloopnul.com/blog/a-python-proxy-in-less-than-100-lines-of-code/ 找到了这样的解决方案,尽管问题是脚本是用 Python 2.7 版本编写的,但我正在用 Python 3.0 版本编写。

为我需要的 3.0 版本重写脚本后,它仍然无法运行。

我将很快解释我正在尝试做什么,所有内容都显示在这张图片中:

他们之间有用户-网站和代理服务器。

如果建议,该代理服务器 - 是具有 windows OS 的常规计算机,在其上启动此脚本。用户知道代理服务器的 IP 地址,在浏览器 Firefox 的设置中输入它并移动到网站 myip.com 在这个网站上显示服务器的 IP 地址 - 这是正确的操作脚本,但都不是我的作品。也许这个问题有现成的解决方案?

几年前我用 this

做了一个服务器
def __init__(self, config):
    # Shutdown on Ctrl+C
    signal.signal(signal.SIGINT, self.shutdown) 

    # Create a TCP socket
    self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Re-use the socket
    self.serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # bind the socket to a public host, and a port   
    self.serverSocket.bind((config['HOST_NAME'], config['BIND_PORT']))

    self.serverSocket.listen(10) # become a server socket
    self.__clients = {}

while True:

    # Establish the connection
    (clientSocket, client_address) = self.serverSocket.accept() 

    d = threading.Thread(name=self._getClientName(client_address), 
    target = self.proxy_thread, args=(clientSocket, client_address))
    d.setDaemon(True)
    d.start()

# get the request from browser
request = conn.recv(config['MAX_REQUEST_LEN']) 

# parse the first line
first_line = request.split('\n')[0]

# get url
url = first_line.split(' ')[1]


http_pos = url.find("://") # find pos of ://
if (http_pos==-1):
    temp = url
else:
    temp = url[(http_pos+3):] # get the rest of url

port_pos = temp.find(":") # find the port pos (if any)

# find end of web server
webserver_pos = temp.find("/")
if webserver_pos == -1:
    webserver_pos = len(temp)

webserver = ""
port = -1
if (port_pos==-1 or webserver_pos < port_pos): 

    # default port 
    port = 80 
    webserver = temp[:webserver_pos] 

else: # specific port 
    port = int((temp[(port_pos+1):])[:webserver_pos-port_pos-1])
    webserver = temp[:port_pos] 


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.settimeout(config['CONNECTION_TIMEOUT'])
s.connect((webserver, port))
s.sendall(request)

while 1:
    # receive data from web server
    data = s.recv(config['MAX_REQUEST_LEN'])

    if (len(data) > 0):
        conn.send(data) # send to browser/client
    else:
        break