質問

HTTPプロトコルを実装する必要があるアプリケーションを作成しているとします。プロトコルは非常に複雑で、トランザクションのどの段階にあるかに応じて、いくつかのコマンドが許可される場合があります。

例として、SMTPを見てください。 " data"が送信された場合、SMTPサーバーはエラーをスローする必要があります。コマンドは" rcpt"を受信する前に送信されます。および「メール」。

私の質問は、このようなプロトコルをコードで処理する最良の方法は何ですか?これに関連するデザインパターンはありますか?

編集:この質問は、プロトコルの実装の背後にある理論に関連しています。ライブラリを使用することは、実践上最良のアプローチであることを認識しています。

役に立ちましたか?

解決

ステートマシン

私の考えでは、プロトコルをモデル化して処理する最も簡単な方法はステートマシンです。状態は、受信した有効なコマンドに関連するいくつかの遷移によって到達します。各状態では、コマンドの特定のサブセットのみが許可されます。

ステートマシンは、プログラムの字句解析のためにコンパイラの構築に使用されます。プロトコル実装の問題は、この特殊なケースだと思います。

他のヒント

このようなプロトコルを処理する最良の方法は、ライブラリを使用することです。地球上で使用されるほとんどすべてのコンピューター言語には、httpおよびsmtpを処理するための既存の十分にテストされたライブラリがあります。

@fluffels @

Zed Shaw(Mongrelの著者)同意します;彼は Ragel を使用しています。

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

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

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

これを行うための興味深いツールはツイストです。これはpython固有ですが、かなり賢く、多数の既存のプロトコル(HTTP、SMTP、IRCなど)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top