假設你正在編寫一個必須實現HTTP協議的應用程序。協議非常複雜,可能允許多個命令,具體取決於它們處於哪個階段。實現協議的最佳方式是什麼?
作爲示例,請查看SMTP。如果在收到「rcpt」和「mail」之前發送「data」命令,則SMTP服務器必須拋出錯誤。
我的問題是:在代碼中處理這種協議的最佳方式是什麼?有沒有與此相關的設計模式?
編輯:這個問題涉及實施協議背後的理論。我知道使用庫是實踐中最好的方法。
假設你正在編寫一個必須實現HTTP協議的應用程序。協議非常複雜,可能允許多個命令,具體取決於它們處於哪個階段。實現協議的最佳方式是什麼?
作爲示例,請查看SMTP。如果在收到「rcpt」和「mail」之前發送「data」命令,則SMTP服務器必須拋出錯誤。
我的問題是:在代碼中處理這種協議的最佳方式是什麼?有沒有與此相關的設計模式?
編輯:這個問題涉及實施協議背後的理論。我知道使用庫是實踐中最好的方法。
狀態機
在我看來,一個狀態機模型和處理協議最簡單的方法。通過與收到的有效命令有關的幾個轉換可以達到狀態。然後每個狀態只允許某個子集的命令。
狀態機在編譯器構造中用於程序的詞法分析。我將協議實現的問題看作是一個特例。
處理這種協議的最好方法是使用庫。幾乎所有在地球上使用的計算機語言都有先前存在的,經過充分測試的庫來處理http和smtp。
@ fluffels @
澤德·肖(雜種的作者)agrees with you;他使用Ragel。
我與A28同意,最好的辦法是,要麼:
編寫自己的協議實現很可能會導致出現錯誤的執行互操作性問題。
一個有趣的工具是twisted這是python特有的,但相當聰明,包括許多現有協議(HTTP,SMTP,IRC等)的實現。
除非你想開發協議處理程序作爲練習,否則這是很好的建議。這些庫是通用的,並且傾向於得到很好的測試。查看Python標準庫以查看此現象的示例。 – ConcernedOfTunbridgeWells 2008-10-30 08:26:28