2010-03-15 12 views
32

Voici une question générique. Je ne cherche pas la meilleure réponse, j'aimerais juste que vous exprimiez vos pratiques préférées. Je veux implémenter un protocole réseau en Java (mais c'est une question plutôt générale, j'ai fait face aux mêmes problèmes en C++), ce n'est pas la première fois, comme je l'ai déjà fait. Mais je pense qu'il me manque un bon moyen de l'implémenter. En fait, il s'agit généralement d'échanger des messages texte et des tampons d'octets entre les hôtes, de stocker l'état et d'attendre que le prochain message arrive. Le problème est que je finis généralement avec un tas de switch et des instructions plus ou moins complexes si elles réagissent à différents statuts/messages. Le tout devient habituellement compliqué et difficile à entretenir. Sans compter que parfois ce qui sort a quelque "angle mort", je veux dire des statuts du protocole qui n'ont pas été couverts et qui se comportent de façon imprévisible. J'ai essayé d'écrire des classes de machine d'état, qui s'occupent de vérifier les états de début et de fin pour chaque action de manière plus ou moins intelligente. Cela rend la programmation du protocole très compliquée car je dois écrire des lignes et des lignes de code pour couvrir toutes les situations possibles. Ce que j'aimerais, c'est quelque chose comme un bon motif, ou une bonne pratique qui est utilisée dans la programmation de protocoles complexes, facile à entretenir et à étendre et très lisible.Comment implémenter un protocole réseau?

Quelles sont vos suggestions?

Répondre

15

Lire sur le état motif de conception pour apprendre à éviter beaucoup d'instructions de commutation.


« parfois ce qui sort a une « tache aveugle », je veux dire les statuts du protocole qui ne sont pas couverts ... »

État peut aider à éviter les lacunes. Il ne peut pas garantir un bon design, il faut encore le faire.

"... car je dois écrire des lignes et des lignes de code pour couvrir toutes les situations possibles."

Ceci ne doit pas être considéré comme un fardeau ou un problème: Vous devez écrire des lignes de code pour couvrir toutes les situations possibles.

L'état peut vous aider car vous pouvez tirer parti de l'héritage. Il ne peut pas garantir un bon design, il faut encore le faire.

+0

Dans le livre "Desing Patterns" (http://en.wikipedia.org/wiki/Design_Patterns) ce modèle est appliqué au problème impliqué. – Dmitry

+0

J'ai eu un coup d'oeil sur wikipedia et semble très intelligent et il résoudrait beaucoup de problèmes que j'ai. Je devrais acheter ce foutu Design Patterns livre ... :) – gotch4

+0

@ gotch4 - Parcourez une bonne librairie. GOF est l'un de ces articles que vous êtes supposé faire génuflexion en public, mais la vérité est qu'il existe de meilleurs modèles de livres là-bas maintenant. La plupart couvriront le modèle de l'État afin de faire le tour pour un que vous vous sentez à l'aise avec. – Duck

1

Si vous utilisez Java, pensez à regarder Apache MINA, sa documentation et les exemples devraient vous inspirer de la bonne façon.

6

La conception d'un protocole concerne généralement l'espace d'application dans lequel vous travaillez. Par exemple, http traite uniquement de la gestion de pages Web, de graphiques et de messages, tandis que FTP traite uniquement du transfert de fichiers. Bref, pour commencer, vous devez décider de l'espace d'application dans lequel vous vous trouvez, puis définir les actions à effectuer. Enfin, avant de commencer à concevoir votre protocole, vous devriez sérieusement rechercher sérieusement une autre pile de protocoles qui fait ce que vous voulez faire et éviter d'implémenter une pile de protocole altoether. Ce n'est qu'après avoir déterminé que quelque chose d'autre pré-construit absolument ne fonctionnera pas pour vous devriez commencer à construire votre propre pile de protocole.

3

Finite State Machine est ce que vous voulez

FSM

Alors vous définissez un tas d'états que vous pouvez être en tant que récepteur ou émetteur (ralenti, connecting_phase1, connecting_phase2, paquet prévu, .. .)

Définissez ensuite tous les événements possibles (packet1 arrive, ferme net, ...)

enfin vous avez une table qui dit « quand dans l'état x et n événement se faire func y et la transition vers l'état q '- pour chaque état et d'événement (beaucoup seront nuls ou dups)

Edit - comment faire un EFM (croquis rugueux)

struct FSMNode 
{ 
     int m_nextState; 
     void (m_func*); 
} 
FSMNode states[NUMSTATES][NUMEVENTS]= 
    { // state 0 
     {3, bang}, // event 0 
     {2,wiz}, 
     {1, fertang} 
    } 
    { 
     {1, noop}, // event 0 
     {1, noop}, 
     {3, ole} 
    } 
    ....... 
    FSMNode node = states[mystate][event]; 
    node.m_func(context); 
    mystate = node.m_nextState; 

Je suis sûr que c'est plein de syntaxe non valide - mais je l'espère vous obtenez la dérive

+0

bien sûr que je le sais. Ce que je veux savoir sont les meilleures pratiques pour implémenter ce FSM et la table ... c'est ma vraie question – gotch4

2

Pourquoi ne pas utiliser XML comme protocole? Vous pouvez encapsuler et classer toutes vos données à l'intérieur des noeuds XML.

+0

Ce n'est pas le problème ... Je sais que je dois implémenter des codecs ... – gotch4

+0

Je l'ai suggéré car c'est un format ouvert utilisé largement sur Internet aujourd'hui. Je ne dis pas que vous ne savez pas comment implémenter des codecs. J'essaie juste de gagner du temps, comme cela m'est arrivé dans des projets concrets où j'ai choisi ce format de protocole. – Andres

+0

En fait, c'est mon choix habituel ... mais mon souci n'est pas au sujet de la mise en forme des données, est plus sur la tenue du statut du protocole et la mise en œuvre. – gotch4

2

Je ne peux pas vous donner un exemple moi-même, mais que diriez-vous de voir comment d'autres personnes (compétentes) le font?

Comme celui-ci? http://anonsvn.jboss.org/repos/netty/trunk/src/main/java/org/jboss/netty/handler/codec/http/

P.S. d'ailleurs, je recommande réellement d'utiliser netty comme cadre de votre réseau et de construire votre protocole en plus de celui-ci. Il devrait être très facile, et vous vous débarrasserez probablement de tas de maux de tête ...

+0

Le lien est cassé. – Piovezan

3

En C++, vous pouvez utiliser la bibliothèque Boost :: Spirit pour analyser votre message de protocole facilement. La seule "difficulté" est de définir la grammaire de votre protocole de message. Jetez un oeil au code source Gnutella pour voir comment ils résolvent ce problème. Ici http://www9.limewire.com/developer/gnutella_protocol_0.4.pdf est le spécifications du protocole Gnutella