5

假设您正在编写一个必须实现 HTTP 协议的应用程序。协议非常复杂,并且可能允许多个命令,具体取决于它们处于事务的哪个阶段。

例如,看一下 SMTP。如果在接收“rcpt”和“mail”之前发送“data”命令,SMTP 服务器必须抛出错误。

我的问题是:在代码中处理此类协议的最佳方法是什么?有没有与此相关的设计模式?

编辑:这个问题与实现协议背后的理论有关。我知道使用库是实践中最好的方法。

4

4 回答 4

12

状态机

在我看来,状态机是建模和处理协议的最简单方法。与接收到的有效命令相关的几个转换将达到一个状态。然后每个状态将只允许某个命令子集。

状态机在编译器构造中用于程序的词法分析。我认为协议实现的问题是这种情况的一个特例。

于 2008-10-30T07:32:04.683 回答
1

处理此类协议的最佳方法是使用库。几乎地球上使用的每一种计算机语言都有预先存在的、经过良好测试的库来处理 http 和 smtp。

于 2008-10-30T07:32:44.323 回答
0

@绒毛@

Zed Shaw(Mongrel 的作者)同意你的看法;他使用Ragel

于 2008-10-30T12:31:24.423 回答
-1

我同意 a28,最好的方法是:

  • 使用实现协议服务器的库
  • 将您的应用程序编写为现有服务器的扩展(例如通过 IIS、Apache API 等的 Web 服务器扩展、Sendmail Milter 等)或
  • 修改现有服务器以在应用程序接收请求时对其进行 RPC 调用。

编写您自己的协议实现可能会导致具有互操作性问题的错误实现。

一个有趣的工具是twisted,它是python特有的,但相当聪明,包括许多现有协议(HTTP、SMTP、IRC等)的实现。

于 2008-10-30T12:39:22.333 回答