Готовый сокет ещё не содержит всё сообщение
Selector сообщил, что сокет доступен для чтения. Это означает, что можно попробовать прочитать данные, а не что весь запрос уже пришёл.
В разборе модуля selectors показывают небольшой цикл обработки соединений. Сокеты переводят в неблокирующий режим, а данные накапливают в буфере конкретного соединения.
У TCP нет границ сообщений: один recv может вернуть часть запроса или несколько сообщений вместе. Нужен свой способ выделения сообщения — длина, разделитель или формат протокола.
Запись тоже бывает частичной. Неотправленный остаток сохраняют, а ожидание записи включают только при наличии данных. Иначе постоянно готовый к записи сокет может заставить цикл расходовать CPU впустую.
DefaultSelector выбирает доступный механизм платформы, но правила протокола и очистка соединений остаются задачей приложения.
#python #сети
Post #5078
492
