Основные библиотеки для сетевого программирования на Python
Сетевые библиотеки Python: решения и варианты
Библиотека socket - базовый инструмент сетевого взаимодействия
Библиотека socket входит в стандартную поставку Python и предоставляет низкоуровневый интерфейс для работы с сокетами. Она позволяет создавать как TCP, так и UDP соединения, реализовывать собственные протоколы или взаимодействовать с существующими.
import socket
# TCP сервер
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind(('localhost', 8888))
server_sock.listen(1)
conn, addr = server_sock.accept()
data = conn.recv(1024)
print(f'Получено: {data.decode()}')
conn.send(b'Hello from server')
conn.close()библиотека сети python (сетевые библиотеки python)
# TCP клиент
client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sock.connect(('localhost', 8888))
client_sock.send(b'Hello, server!')
response = client_sock.recv(1024)
print(f'Ответ: {response.decode()}')
client_sock.close()
Пояснение: сначала создаётся сокет с параметрами AF_INET (IPv4) и SOCK_STREAM (TCP). Сервер привязывается к адресу и порту, затем слушает входящие соединения. accept блокирует выполнение до появления клиента. Полученные данные декодируются из байтов.
Цели: разработка собственных сетевых сервисов, тестирование протоколов, изучение основ TCP/UDP.
Типичные ошибки: забыть закрыть сокет (утечка ресурсов), неверное указание порта (занят или требует прав), блокирующие вызовы без таймаута. Решение: использовать менеджер контекста with или явно вызывать close, проверять доступность порта, устанавливать таймаут через settimeout.
Как выполнить HTTP-запросы с удобным API?
Библиотека requests (сторонняя) значительно упрощает работу с HTTP. Она автоматически обрабатывает куки, сессии, кодировки.
import requests
response = requests.get('https://api.github.com')
print(response.status_code)
print(response.json())
Пояснение: get возвращает объект Response с методами status_code, json(), text. Сессии позволяют сохранять куки между запросами.
Цели: взаимодействие с REST API, веб-скрапинг, автоматизация HTTP-запросов.
Типичные ошибки: неправильная обработка ошибок (игнорирование кодов 4xx/5xx), отсутствие таймаута (зависание), игнорирование контроле SSL. Решение: проверять response.raise_for_status(), добавлять параметр timeout, устанавливать verify=False для самоподписанных сертификатов (с осторожностью).
Как организовать асинхронные HTTP-запросы?
Библиотека aiohttp предоставляет асинхронный HTTP-клиент и сервер на базе asyncio. Позволяет одновременно выполнять множество запросов без блокировок.
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://example.com')
print(html[:100])
asyncio.run(main())
Пояснение: используется async/await. ClientSession управляет соединениями и куками. Асинхронный контекстный менеджер гарантирует освобождение ресурсов.
Цели: высокопроизводительные парсеры, сбор данных с множества страниц, микросервисы на основе asyncio.
Типичные ошибки: забыть дождаться завершения всех корутин (использовать asyncio.gather), перегрузка сервера из-за слишком большого числа одновременных запросов, неправильная обработка исключений в асинхронных задачах. Решение: ограничивать количество одновременных запросов через asyncio.Semaphore, использовать try-except в корутинах.
Как подключиться к удаленному серверу по SSH и выполнить команды?
Библиотека paramiko реализует протокол SSHv2 на чистом Python. Поддерживает аутентификацию по паролю и ключам, запуск команд, передачу файлов.
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.1.1', username='user', password='pass')
stdin, stdout, stderr = client.exec_command('ls -la')
print(stdout.read().decode())
client.close()
Пояснение: SSHClient автоматически управляет ключами хоста. AutoAddPolicy добавляет неизвестные ключи (небезопасно для продакшена). exec_command возвращает три потока: stdin, stdout, stderr.
Цели: удаленное администрирование, автоматизация задач на серверах, передача файлов через SFTP.
Типичные ошибки: неправильное указание порта (по умолчанию 22), проблемы с аутентификацией (неверный ключ или пароль), зависание при выполнении команд без закрытия канала. Решение: указывать порт явно, использовать paramiko.RSAKey.from_private_key_file, добавлять таймаут при создании клиента.
Как отправлять и анализировать сетевые пакеты на низком уровне?
Библиотека scapy позволяет создавать, отправлять и перехватывать пакеты любых протоколов (IP, TCP, UDP, ARP, DNS и др.). Подходит для тестирования сети и анализа трафика.
from scapy.all import IP, ICMP, sr1
# Отправка ICMP echo-запроса (ping)
packet = IP(dst='8.8.8.8')/ICMP()
response = sr1(packet, timeout=2)
if response:
print(response.show())
else:
print('Нет ответа')
Пояснение: sr1 отправляет пакет и ждёт один ответ. IP создаёт IP-заголовок, ICMP добавляет ICMP-тип. Результат содержит поля ответного пакета.
Цели: диагностика сети, создание снифферов, изучение сетевых протоколов, тестирование на проникновение.
Типичные ошибки: необходимость прав root для отправки сырых пакетов, неверная сборка пакета (несоответствие полей), блокировка антивирусом или файрволом. Решение: запускать скрипт от root/sudo, тщательно проверять поля, отключать файрвол для тестов.
Расширенные примеры и сценарии использования
Многопоточный TCP сервер на socket
import socket
import threading
def handle_client(conn, addr):
print(f'Подключён {addr}')
while True:
data = conn.recv(1024)
if not data:
break
conn.send(b'Echo: '+ data)
conn.close()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 9999))
server.listen(5)
print('Сервер запущен на порту 9999')
while True:
conn, addr = server.accept()
threading.Thread(target=handle_client, args=(conn, addr)).start()
Запуск сервера. При подключении клиента (например, telnet localhost 9999) сервер отправляет полученное сообщение обратно.
Пояснение: каждый клиент обрабатывается в отдельном потоке, что позволяет обслуживать множество подключений.
Асинхронный сбор данных с ограничением параллелизма (aiohttp)
import aiohttp
import asyncio
semaphore = asyncio.Semaphore(10)
async def fetch(session, url):
async with semaphore:
async with session.get(url) as response:
return await response.text()
async def main():
urls = [f'http://example.com?page={i}' for i in range(100)]
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
print(f'Загружено {len(results)} страниц')
asyncio.run(main())
Вывод: Загружено 100 страниц
Пояснение: Semaphore ограничивает число одновременных запросов до 10, предотвращая перегрузку.
Передача файла по SFTP с использованием paramiko
import paramiko
transport = paramiko.Transport(('192.168.1.1', 22))
transport.connect(username='user', password='pass')
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put('local_file.txt', '/remote/path/file.txt')
sftp.get('/remote/path/file.txt', 'downloaded_file.txt')
sftp.close()
transport.close()
Файлы успешно переданы, ошибок нет.
Пояснение: используется отдельный транспорт для SSH, затем SFTP-клиент для операций с файлами.
Сниффинг TCP трафика с фильтрацией (scapy)
from scapy.all import sniff, IP, TCP
def packet_callback(packet):
if IP in packet and TCP in packet:
src = packet[IP].src
dst = packet[IP].dst
sport = packet[TCP].sport
dport = packet[TCP].dport
print(f'{src}:{sport} -> {dst}:{dport} (length {len(packet)})')
sniff(filter='tcp and port 80', prn=packet_callback, count=5)
При прохождении HTTP-трафика выводятся строки вида: 192.168.1.2:54321 -> 93.184.216.34:80 (length 123)
Пояснение: функция sniff захватывает пакеты, фильтр 'tcp and port 80' оставляет только TCP трафик на 80 порт. Callback обрабатывает каждый пакет.