Domanda

Supponi di scrivere un'applicazione che deve implementare il protocollo HTTP. I protocolli sono piuttosto complessi e possono consentire diversi comandi a seconda dello stadio di una transazione in cui si trovano.

Ad esempio, guarda SMTP. Un server SMTP deve generare un errore se i "dati" il comando viene inviato prima di ricevere " rcpt " e " mail " ;.

La mia domanda è: qual è il modo migliore per gestire protocolli come questo nel codice? Ci sono modelli di progettazione correlati a questo?

Modifica: questa domanda riguarda la teoria alla base dell'implementazione dei protocolli. Sono consapevole che l'utilizzo di una libreria è l'approccio migliore in pratica.

È stato utile?

Soluzione

Macchine statali

A mio avviso, una macchina a stati è il modo più semplice per modellare e gestire i protocolli. Uno stato verrebbe raggiunto da diverse transizioni relative ai comandi validi ricevuti. Ciascuno stato consentirebbe quindi solo un determinato sottoinsieme di comandi.

Le macchine a stati vengono utilizzate nella costruzione di compilatori per l'analisi lessicale di un programma. Vedo il problema dell'implementazione del protocollo come un caso speciale di questo.

Altri suggerimenti

Il modo migliore per gestire protocolli come questo è usare una libreria. Quasi ogni linguaggio informatico utilizzato sulla terra ha librerie preesistenti e ben testate per gestire http e smtp.

@fluffels @

Zed Shaw (autore di Mongrel) è d'accordo con te ; usa Ragel .

Sono d'accordo con a28, il modo migliore è di:

  • Utilizza una libreria che implementa il server di protocollo
  • Scrivi la tua applicazione come estensione a un server esistente (ad es. estensione del server Web tramite IIS, API Apache ecc., Sendmail Milter ecc.) OPPURE
  • Modifica un server esistente per effettuare chiamate RPC alla tua applicazione mentre riceve richieste.

La scrittura della propria implementazione del protocollo potrebbe comportare un'implementazione errata con problemi di interoperabilità.

Uno strumento interessante per farlo è twisted che è specifico di Python ma piuttosto intelligente e include implementazioni di numerosi protocolli esistenti (HTTP, SMTP, IRC ecc.).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top