题
假设您正在编写一个必须实现 HTTP 协议的应用程序。协议非常复杂,可能允许多个命令,具体取决于它们所处的交易阶段。
举个例子,看看 SMTP。如果在接收“rcpt”和“mail”之前发送“data”命令,则 SMTP 服务器必须抛出错误。
我的问题是:在代码中处理此类协议的最佳方法是什么?有没有与此相关的设计模式?
编辑:这个问题涉及实现协议背后的理论。我知道使用库是实践中最好的方法。
解决方案
状态机
在我看来,状态机是建模和处理协议的最简单方法。通过与所接收的有效命令相关的若干转换将到达状态。然后,每个州只允许某个命令子集。
状态机用于编译器构造,用于程序的词法分析。我将协议实现的问题视为一种特殊情况。
其他提示
处理此类协议的最佳方法是使用库。几乎所有在地球上使用的计算机语言都有预先存在的,经过良好测试的库来处理http和smtp。
我同意a28,最好的方法是:
- 使用实现协议服务器的库
- 将您的应用程序编写为现有服务器的扩展(例如通过 IIS、Apache API 等、Sendmail Milter 等进行 Web 服务器扩展)或
- 修改现有服务器以在接收请求时对您的应用程序进行 RPC 调用。
编写您自己的协议实现很可能会导致存在互操作性问题的错误实现。
执行此操作的一个有趣的工具是 扭曲的 它是 Python 特有的,但相当聪明,包括许多现有协议(HTTP、SMTP、IRC 等)的实现。
不隶属于 StackOverflow