socket — Низкоуровневый сетевой интерфейс

Модуль socket предоставляет доступ к низкоуровневым сокетам операционной системы (BSD Sockets). Это абсолютный фундамент всех сетевых коммуникаций в Python. Любой HTTP-сервер, база данных или чат работает через сокеты. Для прикладной разработки чаще используют requests или asyncio, но знание socket необходимо для понимания работы сети.

import socket

Создание простого TCP Клиента

Клиент создает сокет, подключается к удаленному компьютеру по IP и Порту, шлет байты и принимает ответ.

import socket

# 1. Создание объекта сокета (IPv4, протокол TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # 2. Подключение к серверу (кортеж из IP/Домена и Порта)
    s.connect(("example.com", 80))
    
    # 3. Отправка сырых байт (HTTP GET запрос)
    message = b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
    s.sendall(message)
    
    # 4. Получение байт (читаем до 4096 байт)
    response = s.recv(4096)
    print(response.decode('utf-8')) # Печатаем HTML ответ
finally:
    # 5. Обязательное закрытие! Лучше использовать 'with' менеджер контекста.
    s.close()

Создание ECHO TCP Сервера

Сервер должен "забиндить" (привязать) себя к локальному порту и слушать входящие подключения. Данный сервер принимает сообщение клиента и отправляет его обратно (ECHO).

import socket

# Менеджер контекста with сам вызовет s.close() в конце
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # Фикс ошибки "Port is already in use" (Разрешает переиспользование порта)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    # 1. Привязка к IP и порту. Пустая строка '' значит слушать все интерфейсы (0.0.0.0)
    s.bind(('', 65432))
    
    # 2. Слушаем (до 5 подключений могут висеть в очереди ожидания)
    s.listen(5)
    print("Сервер запущен. Порт 65432...")
    
    # 3. Принятие подключения. Скрипт ЗАМОРОЗИТСЯ на этой строке, пока кто-то не подключится!
    conn, addr = s.accept()
    
    with conn: # Закроет подключение клиента после выхода
        print(f"Подключился: {addr}")
        while True:
            data = conn.recv(1024) # Читаем порцию байт от клиента
            if not data:
                break # Если данных нет, клиент отключился
            
            # Отправляем эти же данные обратно
            conn.sendall(data)

Полный справочник API (API Reference)

Главные константы

Константа Описание
socket.AF_INET Семейство адресов: IPv4 (Например, 127.0.0.1 или 192.168.0.5).
socket.AF_INET6 Семейство адресов: IPv6 (Новый длинный формат адресов).
socket.SOCK_STREAM Тип сокета: TCP-протокол. Надежный поток, пакеты 100% дойдут в нужном порядке.
socket.SOCK_DGRAM Тип сокета: UDP-протокол. Быстрая доставка отдельных сообщений без гарантии целостности (используется для видео-стриминга, онлайн-игр).

Методы объекта сокета

Метод Описание
socket(family, type) Конструктор. Создает новый сокет.
s.bind((ip, port)) (Для серверов). Привязывает сокет к локальному IP и порту.
s.listen([limit]) (Для серверов). Переводит порт в режим прослушки. limit — размер очереди.
s.accept() (Для серверов). Ждет (блокирует скрипт) нового клиента. Возвращает кортеж (объект_сокета_клиента, адрес_клиента).
s.connect((ip, port)) (Для клиентов). Пытается присоединиться к запущенному серверу.
s.sendall(bytes) Отправляет данные (тип bytes), гарантируя отправку всей порции.
s.recv(bufsize) Читает (принимает) bufsize байт из сети. Если вернет пустые байты b'', значит соединение разорвано.
s.settimeout(sec) Устанавливает максимальное время (в секундах) ожидания ответа, после которого выкидывает TimeoutError.
s.close() Разрывает соединение и освобождает порт в ОС.