🔒🐍 Как написать прокси сервер на Python | Подробное руководство с примерами
Чтобы написать прокси-сервер на Python, вы можете использовать модуль socket
для создания сокета и прослушивания входящих соединений, а также модуль urllib.request
для перенаправления запросов.
import socket
import urllib.request
def proxy_server():
# Создание сокета
proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Привязка сокета к локальному хосту и порту
proxy_socket.bind(('localhost', 8000))
# Прослушивание входящих соединений
proxy_socket.listen(1)
while True:
# Принятие входящего соединения
client_socket, client_address = proxy_socket.accept()
# Чтение данных из клиентского сокета
request = client_socket.recv(1024)
# Перенаправление запроса
response = urllib.request.urlopen(request)
# Отправка ответа клиенту
client_socket.sendall(response.read())
# Закрытие клиентского сокета
client_socket.close()
# Запуск прокси-сервера
proxy_server()
Детальный ответ
Как написать прокси-сервер на Python
Прокси-сервер - это посредник между клиентом и сервером, который перенаправляет запросы и отвечает на них от имени клиента или сервера. Напишем прокси-сервер на языке программирования Python.
Для начала, нам понадобится библиотека socket, которая позволяет создавать и управлять сокетами. Sockets - это точки соединения между компьютерами, через которые они обмениваются данными.
import socket
def proxy_server():
# Создание сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Привязка сокета к локальному хосту и порту
server_address = ('localhost', 8888)
server_socket.bind(server_address)
# Слушаем входящие соединения
server_socket.listen(1)
print('Прокси-сервер запущен на порту 8888')
while True:
# Принятие входящих соединений
client_socket, client_address = server_socket.accept()
print(f'Установлено соединение с клиентом {client_address[0]}:{client_address[1]}')
# Получаем данные от клиента
data = client_socket.recv(1024)
# Выводим полученные данные
print(f'Получены данные от клиента: {data}')
# Формируем запрос к серверу
server_request = b'GET / HTTP/1.1\r\nHost: localhost\r\n\r\n'
# Создание сокета для соединения с сервером
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Подключение к серверу
server_socket.connect(('www.example.com', 80))
# Отправка запроса серверу
server_socket.sendall(server_request)
# Получение ответа от сервера
server_response = server_socket.recv(4096)
# Отправка ответа клиенту
client_socket.sendall(server_response)
# Закрытие соединений
client_socket.close()
server_socket.close()
# Закрытие прослушивающего сокета
server_socket.close()
После импорта библиотеки socket, мы создаем функцию proxy_server(), которая будет выполнять код прокси-сервера. Внутри этой функции мы создаем сокет сервера, привязываем его к локальному хосту и порту, и начинаем слушать входящие соединения. Затем мы входим в бесконечный цикл, который будет обрабатывать каждое входящее соединение.
Внутри цикла мы принимаем входящее соединение, получаем данные от клиента и выводим их. Затем мы формируем запрос к серверу, создаем сокет для соединения с сервером, отправляем запрос и получаем ответ от сервера. После этого мы отправляем ответ клиенту и закрываем соединения.
В конце кода прокси-сервера, мы закрываем прослушивающий сокет.
Чтобы запустить прокси-сервер, вы можете вызвать функцию proxy_server() из основного блока кода после определения функции. После запуска сервер будет слушать входящие соединения на порту 8888.