Pergunta

Digamos que você está escrevendo um aplicativo que deve implementar o protocolo HTTP. Protocolos são bastante complexas e podem permitir vários comandos, dependendo de qual estágio de uma transação em que estão.

Como um exemplo, olhar para SMTP. Um servidor SMTP deve lançar um erro se o comando "dados" é enviado antes de receber "rcpt" e "mail".

A minha pergunta é: qual é a melhor maneira de protocolos punho como este no código? Existem padrões de design relacionados com isso?

Edit: Esta questão relaciona-se com a teoria por trás protocolos de aplicação. Estou ciente de que o uso de uma biblioteca é a melhor abordagem na prática.

Foi útil?

Solução

Máquinas de Estado

Para minha mente, uma máquina de estado é a maneira mais fácil de modelo e punho protocolos. Um estado seria alcançado por várias transições relativas aos comandos válidas recebidas. Cada estado, então, permitir que apenas um determinado subconjunto de comandos.

As máquinas de estado são usadas na construção de compiladores para análise lexical de um programa. Eu vejo o problema da implementação do protocolo como um caso especial deste.

Outras dicas

As melhores maneiras de lidar com protocolos como isso é usar uma biblioteca. Quase todas as línguas de computador usado na terra preexistente, bem testado bibliotecas para lidar com http e SMTP.

@fluffels @

Zed Shaw (autor de Mongrel) concorda com você ; ele usa Ragel .

Eu concordo com a28, a melhor maneira é para qualquer um:

  • Use uma biblioteca que implementa o protocolo servidor
  • Escreva seu aplicativo como uma extensão para um servidor existente (extensão de servidor web por exemplo através de IIS, Apache APIs etc, Sendmail Milter etc) OR
  • Modificar um servidor existente para fazer chamadas RPC para a sua aplicação, uma vez que recebe solicitações.

Escrevendo sua própria implementação do protocolo é provável que resulte em uma implementação de buggy com problemas de interoperabilidade.

Uma ferramenta interessante de fazer isso é torcida que é específico-python, mas bastante inteligente e inclui implementações de inúmeros protocolos existentes (HTTP, SMTP, IRC etc).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top