与c相比,中的套接字编程()特别用户友好。程序员何必害怕有关套接字的详尽信息。在中,用户有更多机会专注于应用程序层而不是网路层。在本教程中,我们将开发一个才能处理HTTP流量的简单多线程代理服务器。它将主要基于基本的套接字编程思想。
这是代理服务器的简单实现。在接出来的教程中,我们将逐渐将其开发为一个十分有用的服务器。
首先,我们将通过3个简单的步骤来完成该过程
1.创建一个传入套接字()
我们在服务器类的方式中创建一个套接字。这将为传入的联接创建一个套接字。之后,我们绑定套接字国外网站代理服务器,之后等待顾客端联接。
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 = {}
2.接受顾客端联接和处理
这是所有步骤中最简单但最重要的步骤。我们等待顾客的联接恳求,一旦构建成功联接,我们就将恳求分派到一个单独的线程中,使自己可用于下一个恳求。这使我们可以同时处理多个恳求,因而将服务器的性能提升了数倍。
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()
3.重定向流量
代理服务器的主要功能是充当源和目标之间的中介。在这儿,我们将从源中获取数据,之后将其传递给顾客端。
1)首先,我们从接收到的恳求数据中提取URL。
# 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]
2)之后,我们找到恳求的目标地址。地址是(ss,)的元组。我们将从该地址接收数据。
3)如今,我们设置到目标服务器(或远程服务器)的新联接,之后将原始恳求的副本发送到服务器。之后国外网站代理服务器,服务器将用一个响应来响应。所有响应消息都使用RFC822的通用消息格式。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(config['CONNECTION_TIMEOUT'])
s.connect((webserver, port))
s.sendall(request)
4)之后,我们将服务器的响应重定向到顾客端。conn是与顾客端的原始联接。该响应可能小于我们在一个调用中收到的,为此,空响应表示响应结束。
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
之后,我们适当地关掉服务器联接并进行错误处理,以确保服务器按预期工作。
怎么测试服务器?
1.在终端上运行服务器。使其保持运行并切换到您喜欢的浏览器。
2.转入浏览器的代理设置,之后将代理服务器修改为“”,并将端口修改为“12345”。