Сетевое программирование на Python
См. также: Работа с файлами, сетью и внешними API · Асинхронность и многопоточность · раздел «Сети»
Зачем учить сокеты, если есть requests и FastAPI
В повседневной работе Python-разработчик чаще пишет requests.get(...) или поднимает API на FastAPI — см. главу про файлы, сеть и API.
Под капотом и requests, и браузер, и Uvicorn используют сокеты — интерфейс ОС для обмена байтами по сети.
Понимание сокетов помогает:
- разбираться в «connection refused», timeout, «broken pipe»;
- писать свои протоколы (чат, игра, IoT);
- читать сетевую документацию без ощущения «магии библиотеки».
Модуль socket — в стандартной библиотеке Python.
Слои — от приложения до провода
Ваш код (HTTP, JSON, свой протокол)
↓
HTTP / WebSocket / TLS
↓
TCP или UDP
↓
IP (127.0.0.1, 192.168…)
↓
Сетевой интерфейс
HTTP — правила текста поверх TCP. Сокет — уровень ниже: «отправь эти байты на порт».
Словарь
| Термин | Простыми словами |
|---|---|
| IP-адрес | «Номер» машины в сети, например 127.0.0.1 (localhost) |
| Порт | Номер службы на машине: 80/443 — веб, учебник — 50007 |
| TCP | Надёжный поток байтов |
| UDP | Пакеты без гарантии доставки |
| Клиент | Вызывает connect |
| Сервер | bind + listen + accept |
| Сокет | Канал для send / recv |
Модель клиент–сервер
Сокеты работают с байтами (b"текст"), не со строками. Кодировку (UTF-8) выбирает ваш код.
TCP — эхо-сервер — разбор построчно
import socket
HOST = "127.0.0.1"
PORT = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((HOST, PORT))
server.listen(1)
conn, addr = server.accept()
with conn:
print("Подключение:", addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
| Строка | Смысл |
|---|---|
AF_INET | IPv4 |
SOCK_STREAM | TCP |
SO_REUSEADDR | Быстрее перезапуск после остановки |
bind / listen | Занять порт и ждать |
accept() | Ждать клиента |
recv(1024) | До 1024 байт за вызов |
if not data | Клиент закрыл соединение |
sendall | Отправить все байты |
Клиент:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client:
client.connect(("127.0.0.1", 50007))
client.sendall(b"ping")
print(client.recv(1024))
Длинные сообщения читают в цикле или по заголовку с длиной.
UDP
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b"hello", ("127.0.0.1", 50008))
data, addr = sock.recvfrom(1024)
sock.close()
sendto / recvfrom — без долгой сессии, как у TCP.
Несколько клиентов
| Подход | Когда |
|---|---|
| Поток на соединение | Мало клиентов, простая логика |
asyncio | Много I/O |
| Nginx + Uvicorn | Продакшен HTTP |
import threading
def handle(conn):
with conn:
while True:
chunk = conn.recv(4096)
if not chunk:
break
conn.sendall(chunk)
asyncio
import asyncio
async def tcp_echo_client():
reader, writer = await asyncio.open_connection("127.0.0.1", 50007)
writer.write(b"async ping\n")
await writer.drain()
data = await reader.read(100)
print(data.decode())
writer.close()
await writer.wait_closed()
asyncio.run(tcp_echo_client())
Связь с HTTP
HTTP-запрос — текст в TCP-потоке. requests открывает сокет, при HTTPS добавляет TLS.
| Настройка | Уровень |
|---|---|
timeout | Ожидание байтов на сокете |
| Keep-Alive | Один TCP на несколько запросов |
В проектах HTTP отдают WSGI/ASGI — веб и API.
Ошибки и безопасность
| Ситуация | Поведение |
|---|---|
| Порт занят | Address already in use |
| Сервер выключен | Connection refused |
| Разрыв | recv → b"" |
| Таймаут | settimeout → TimeoutError |
На байтах из сети не вызывайте eval / pickle от незнакомых клиентов. Лучше JSON + длина сообщения.
Когда что выбирать
| Задача | Инструмент |
|---|---|
| REST, веб | requests, Flask, FastAPI, Django |
| Двусторонний канал | WebSocket |
| Мелкие пакеты, потеря допустима | UDP |
| Учебный разбор транспорта | socket, asyncio |
Связанные материалы
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Python как язык общего назначения - философия, ключевые свойства и области применения в современной разработке. Python — это высокоуровневый язык программирования общего назначения, который отличается читаемым синтаксисом и широким спектром применения. Принципы, которые делают код понятным, поддерживаемым и расширяемым. Примеры реализации типовых приложений. Каждый пример сопровождается разбором ключевых концепций языка. Наверняка каждый новичок, решивший перейти в что-то стандартное в Python, открывает себе этот файл. Как устроен Python, что входит в комплект и какие есть реализации. Структурные каркасы для построения приложений, как они устроены. Фреймворки, библиотеки, инструменты сборки, среды выполнения, системы тестирования и специализированные платформы, объединённые общей философией ясности, простоты и гибкости. Что такое модули, как устроены механизмы импорта и загрузки. Управление изолированной средой и зависимостями проекта. История Python - ключевые этапы развития языка, сообщества и экосистемы инструментов. Философия Python не зафиксирована в официальных стандартах, но она глубоко интегрирована в язык, его стандартную библиотеку, документацию и культуру разработчиков.Python - язык общего назначения
Что требуется знать перед началом изучения языка программирования Python
Рекомендации по разработке на Python
Простые приложения на Python
Встроенный модуль builtins и типизация в Python
Архитектура интерпретатора Python
Фреймворки и библиотеки Python
Экосистема Python-приложений
Модули в Python
Виртуальные окружения и управление зависимостями
История языка Python
Философия Python - Zen of Python