Основные библиотеки для сетевого программирования на 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 обрабатывает каждый пакет.

Сетевые библиотеки Python - comments

En
библиотека сети python (python)