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

@ fluffels @

Zed Shaw(Mongrelの作者)はあなたに同意します; 彼はRagelを使用しています。

于 2008-10-30T12:31:24.423 に答える
-1

私はa28に同意します。最善の方法は次のいずれかです。

  • プロトコル サーバーを実装するライブラリを使用する
  • アプリケーションを既存のサーバーの拡張機能として作成します (例: IIS 経由の Web サーバー拡張機能、Apache API など、Sendmail Milter など) または
  • 既存のサーバーを変更して、リクエストの受信時にアプリケーションへの RPC 呼び出しを行います。

プロトコルの独自の実装を作成すると、相互運用性の問題を伴うバグのある実装になる可能性があります。

これを行うための興味深いツールはtwistedです。これは python 固有ですが、かなり巧妙で、多数の既存のプロトコル (HTTP、SMTP、IRC など) の実装が含まれています。

于 2008-10-30T12:39:22.333 に答える