python - 创建一个 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 地址 - 这是该脚本的正确操作,但我的作品都没有。也许有任何现成的解决方案来解决这个问题?
解决方案
几年前我用这个做了一个服务器
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
推荐阅读
- c++ - C++ 写入 CSV 文件
- android - 如何将可流动列表转换为具有上一项累积总和的新可流动列表
- powershell - 需要使用 powershell 脚本比较两个 CSV 文件
- powerbi - 如何将 Power Bi 报表生成器 v15.6 连接到 Power Bi 报表服务器
- json - Powershell - 创建一个基本的 JSON 文件
- python - 在树莓派 4 上安装 TensorFlow 2.3.0
- firebase - 使用 Firebase 托管将参数发送到 Cloud Functions
- python - Pandas 在运行 pd.crosstab 之前检查行中的键值,如果不存在则添加已知键值
- c# - 来自后台工作者冲突的查询?
- git - .gitignore 看似已删除的文件