假设您正在编写一个必须实现 HTTP 协议的应用程序。协议非常复杂,并且可能允许多个命令,具体取决于它们处于事务的哪个阶段。
例如,看一下 SMTP。如果在接收“rcpt”和“mail”之前发送“data”命令,SMTP 服务器必须抛出错误。
我的问题是:在代码中处理此类协议的最佳方法是什么?有没有与此相关的设计模式?
编辑:这个问题与实现协议背后的理论有关。我知道使用库是实践中最好的方法。
假设您正在编写一个必须实现 HTTP 协议的应用程序。协议非常复杂,并且可能允许多个命令,具体取决于它们处于事务的哪个阶段。
例如,看一下 SMTP。如果在接收“rcpt”和“mail”之前发送“data”命令,SMTP 服务器必须抛出错误。
我的问题是:在代码中处理此类协议的最佳方法是什么?有没有与此相关的设计模式?
编辑:这个问题与实现协议背后的理论有关。我知道使用库是实践中最好的方法。
状态机
在我看来,状态机是建模和处理协议的最简单方法。与接收到的有效命令相关的几个转换将达到一个状态。然后每个状态将只允许某个命令子集。
状态机在编译器构造中用于程序的词法分析。我认为协议实现的问题是这种情况的一个特例。
处理此类协议的最佳方法是使用库。几乎地球上使用的每一种计算机语言都有预先存在的、经过良好测试的库来处理 http 和 smtp。
我同意 a28,最好的方法是:
编写您自己的协议实现可能会导致具有互操作性问题的错误实现。
一个有趣的工具是twisted,它是python特有的,但相当聪明,包括许多现有协议(HTTP、SMTP、IRC等)的实现。