首页 > 解决方案 > 创建一个 python 代理服务器

问题描述

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

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

在重写脚本以提供我需要的 3.0 版本后,它仍然无法正常工作。

我将很快解释我正在尝试做什么,一切都显示在这张图片中:

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

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

标签: pythonpython-3.xproxy

解决方案


几年前我用这个做了一个服务器

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


推荐阅读