2008-10-30 105 views
5

假設你正在編寫一個必須實現HTTP協議的應用程序。協議非常複雜,可能允許多個命令,具體取決於它們處於哪個階段。實現協議的最佳方式是什麼?

作爲示例,請查看SMTP。如果在收到「rcpt」和「mail」之前發送「data」命令,則SMTP服務器必須拋出錯誤。

我的問題是:在代碼中處理這種協議的最佳方式是什麼?有沒有與此相關的設計模式?

編輯:這個問題涉及實施協議背後的理論。我知道使用庫是實踐中最好的方法。

回答

12

狀態機

在我看來,一個狀態機模型和處理協議最簡單的方法。通過與收到的有效命令有關的幾個轉換可以達到狀態。然後每個狀態只允許某個子集的命令。

狀態機在編譯器構造中用於程序的詞法分析。我將協議實現的問題看作是一個特例。

1

處理這種協議的最好方法是使用庫。幾乎所有在地球上使用的計算機語言都有先前存在的,經過充分測試的庫來處理http和smtp。

+1

除非你想開發協議處理程序作爲練習,否則這是很好的建議。這些庫是通用的,並且傾向於得到很好的測試。查看Python標準庫以查看此現象的示例。 – ConcernedOfTunbridgeWells 2008-10-30 08:26:28

-1

我與A28同意,最好的辦法是,要麼:

  • 使用它實現了協議服務器庫
  • 寫您的擴展到現有服務器應用程序(通過IIS如Web服務器擴展,Apache API等,Sendmail Milter等)或
  • 修改現有服務器以在您的應用程序接收請求時對其進行RPC調用。

編寫自己的協議實現很可能會導致出現錯誤的執行互操作性問題。

一個有趣的工具是twisted這是python特有的,但相當聰明,包括許多現有協議(HTTP,SMTP,IRC等)的實現。

相關問題