创建 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
大家好,我正在尝试使用 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