Этот набор примеров серверов я написал, преследуя две основные цели.
Во-первых, для себя. Иногда надо иметь небольшой сервер
для тестов или для быстрых экспериментов. Этот сервер должен
быть просто скелетиком сервера. От него не требуется устойчивости или
производительности, но от него требуется простота кода и
вполне конкретный дизайн. И, конечно, надо чтобы он работал,
а не был набором функций «сделай сам».
Таковыми являются эти примеры.
Во-вторых, чтобы скомпенсировать
недостатки многочисленных источников информации на эту тему.
Основные преимущества таковы.
Каждый пример является полноценной программой, которую можно запустить.
Примеры не используют какие-либо фреймворки и демонстрируют
самые базовые механизмы. Зная эти механизмы легко можно
освоить и разумно использовать фреймворк.
Примеры не перегружены деталями. Сетевое программирование
всегда связно с обработкой множества ситуаций, состояний, исключений...
Здесь им уделяется минимальное внимание, чтобы была видна именно
структура приложения.
Чтобы не было скучно, это написано на Python 3. Надеюсь, в далёком
будущем, где живёшь ты, читатель, Python 3 уже восторжествовал :-)
Осторожно! Недостатки
Перечисленные достоинства приводят к появлению соответствующих недостатков.
Приведённый здесь код нельзя использовать «в бою».
Тут не отслеживаются многие, даже самые примитивные
и распространённые, аварийные ситуации типа
«мы пытаемся передать ответ клиенту, а он уже отключился»
(Broken pipe).
Если вы ничего не знаете о серверах и хотите написать сервер,
мне кажется оптимальным такой подход:
если требуется, почитать что-нибудь очень обзорное,
почитать эти заметки, чтобы понимать, как что-то работает в принципе,
посмотреть в сторону стандартных библиотек, скорее всего, там
есть всё, что вам нужно,
если вы видите, что ваша задача на столько не стандартна
или имеются требования, для удовлетворения которых стандартная
библиотека требует переопределить все методы
(например, писать все события в graphite), то имеет смысл
взять за основу стандартную библиотеку и взяться писать свою
реализацию сервера. При реализации своего сервера, обязательно
изучите реализацию хотя бы asyncore.py. Хотя бы на предмет
обработки исключений.