Каков наилучший способ реализации протоколов?
-
05-07-2019 - |
Вопрос
Допустим, вы пишете приложение, которое должно реализовывать протокол HTTP.Протоколы довольно сложны и могут допускать несколько команд в зависимости от того, на какой стадии транзакции они находятся.
В качестве примера рассмотрим SMTP.SMTP-сервер должен выдать ошибку, если команда "data" отправлена до получения "rcpt" и "mail".
Мой вопрос заключается в следующем:каков наилучший способ обработки таких протоколов, как этот, в коде?Существуют ли какие-либо шаблоны проектирования, связанные с этим?
Редактировать:Этот вопрос относится к теории, лежащей в основе реализации протоколов.Я знаю, что использование библиотеки - лучший подход на практике.
Решение
Государственные машины
На мой взгляд, конечный автомат - это самый простой способ для моделирования и обработки протоколов. Состояние будет достигнуто несколькими переходами, относящимися к полученным действительным командам. Каждое состояние будет разрешать только определенное подмножество команд.
Конечные автоматы используются в построении компилятора для лексического анализа программы. Я вижу проблему реализации протокола как частный случай этого.
Другие советы
Лучший способ обработки таких протоколов - использовать библиотеку. Почти каждый компьютерный язык, используемый на земле, имеет уже существующие, хорошо протестированные библиотеки для работы с http и smtp.
@флаффели@
Зед Шоу (автор книги "Монгрел") согласен с вами;он использует Раджель.
Я согласен с a28, лучший способ - это либо:
- Используйте библиотеку, которая реализует сервер протоколов
- Напишите свое приложение как расширение к существующему серверу (например,расширение веб-сервера через IIS, Apache API и т.д., Sendmail Milter и т.д.) Или
- Измените существующий сервер, чтобы он выполнял RPC-вызовы вашего приложения по мере получения запросов.
Написание вашей собственной реализации протокола, скорее всего, приведет к ошибочной реализации с проблемами интероперабельности.
Интересным инструментом для этого является скрученный который специфичен для python, но довольно умен и включает в себя реализации многочисленных существующих протоколов (HTTP, SMTP, IRC и т.д.).