2008-10-30 18 views
5

Powiedz, że piszesz aplikację, która musi implementować protokół HTTP. Protokoły są dość złożone i mogą zezwalać na kilka poleceń w zależności od etapu transakcji.Jaki jest najlepszy sposób implementacji protokołów?

Jako przykład spójrz na SMTP. Serwer SMTP musi zgłosić błąd, jeśli polecenie "dane" zostanie wysłane przed otrzymaniem "rcpt" i "mail".

Moje pytanie brzmi: jaki jest najlepszy sposób obsługi protokołów takich jak ten w kodzie? Czy są jakieś wzorce związane z tym?

Edycja: To pytanie dotyczy teorii implementującej protokoły. Zdaję sobie sprawę, że korzystanie z biblioteki to najlepsze podejście w praktyce.

Odpowiedz

12

Machines państwowe

Do mojego umysłu, stan maszyny jest najprostszym sposobem, aby modelować i obsługiwać protokoły. Stan zostałby osiągnięty przez kilka przejść związanych z ważnymi odebranymi poleceniami. Każdy stan umożliwiłby wtedy tylko pewien podzbiór poleceń.

Maszyny stanów są używane w konstrukcji kompilatorów do analizy leksykalnej programu. W tym szczególny przypadek widzę problem implementacji protokołu.

1

Najlepszym sposobem na obsługę takich protokołów jest korzystanie z biblioteki. Prawie każdy język używany na Ziemi ma istniejące, dobrze przetestowane biblioteki do obsługi http i smtp.

+1

Jeśli nie chcesz opracować programu obsługi protokołu jako ćwiczenia, jest to dobra rada. Biblioteki te mają charakter ogólny i zwykle są dobrze testowane. Spójrz na standardową bibliotekę Python, aby zobaczyć przykład tego zjawiska. – ConcernedOfTunbridgeWells

+0

Dzięki. Moje pytanie dotyczyło raczej sposobu realizacji ich jako pytania teoretycznego. Jeśli będę musiał ich użyć w praktyce, zdecydowanie skorzystam z biblioteki. – fluffels

-1

zgadzam się z A28, najlepszym sposobem jest albo:

  • korzystać z biblioteki, który implementuje serwer protokołu
  • Napisz swoją aplikację jako rozszerzenie istniejącego serwera (np rozszerzenie serwera WWW za pośrednictwem IIS , API Apache itp., Sendmail Milter itp.) LUB
  • Zmodyfikuj istniejący serwer, aby wywoływać wywołania RPC do aplikacji podczas odbierania żądań.

Napisanie własnej implementacji protokołu może spowodować błędne wdrożenie z problemami z interoperacyjnością.

Interesującym narzędziem do tego jest twisted, który jest specyficzny dla Pythona, ale raczej sprytny i zawiera implementacje wielu istniejących protokołów (HTTP, SMTP, IRC itp.).

Powiązane problemy