Сетевое программирование на сокетах
Общайтесь с сетью напрямую, по одному байту, с помощью модуля socket
socket — это тонкая обёртка Python над системным API BSD-сокетов. Всё, что находится выше — HTTP-клиенты, asyncio, веб-фреймворки, драйверы баз данных — в конечном счёте построено на этих вызовах. Понимание их снимает завесу тайны со всего стека.
- создавать TCP-сокет и понимать
AF_INET/SOCK_STREAM, - провести сервер через
bind->listen->accept, а клиент черезconnect, - отправлять и получать байты (никогда
str) и обрабатывать частичные чтения, - кадрировать сообщения, чтобы поток байтов превратился в отдельные сообщения,
- построить минимальный эхо/чат-сервер и рассуждать о его компромиссах.
1. Что такое сокет на самом деле
Сокет — это объект операционной системы, файлоподобный дескриптор, представляющий один конец сетевого разговора. Вы создаёте его, указывая семейство адресов и тип сокета:
import socket
# AF_INET -> адресация IPv4 (host, port)
# SOCK_STREAM -> TCP: упорядоченный, надёжный поток байтов
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Пара (host, port) — это адрес. Хост — это IP-адрес, например "127.0.0.1" (эта машина) или "0.0.0.0" (все интерфейсы); порт — это 16-битное число (0–65535), позволяющее одной машине держать множество независимых сервисов одновременно. Соединение однозначно определяется четвёркой (локальный ip, локальный порт, удалённый ip, удалённый порт), поэтому один порт сервера может обслуживать тысячи клиентов одновременно.