2008-11-18 5 views
3

Tous,Architecture générique pour un serveur réseau/client à l'aide d'une machine d'état

, je inventé fait un protocole simple que je veux utiliser pour un client de parler à un serveur. Il est typique (je pense) mise en page en trois phases:

  • Connection Establishment (à terme inclure la négociation de capacité)
  • échange de données réelles - les paquets voyagent joyeusement çà et là », s'interprété par le récepteur respectif qui agit sur eux en conséquence
  • Connexion Démontage - un côté dit «ne veux plus rien», l'autre côté dit «ainsi soit-il» (permettra éventuellement à l'autre côté d'envoyer des données jusqu'à ce qu'il soit fait au lieu de simplement fermer le conversation)

Le fr amework est une configuration simple: le serveur fait java.net.ServerSocket.accept() et démarre un thread pour gérer la connexion entrante par un client, ce qui crée un java.net.Socket() sur l'hôte/port où le serveur est attendre. Les deux parties utilisent les données java.io.InputStream et java.io.OutputStream et diffusent les données les unes aux autres, assemblant les messages entrants sortant et analysant. Bien, jusqu'ici.

Jusqu'ici, le protocole est codé en dur. L'établissement de connexion et le démontage sont à peu près corrects, tandis que la partie Échange de données - que je veux être en duplex intégral - est plutôt désastreuse.

Alors, pense-moi, faisons cela de la bonne façon et mettons en place une machine d'état en utilisant, surprise, le motif de conception du même nom. Je suis assez clair sur ce que les états devraient être pour le serveur et le client, respectivement, et quels types d'événements devraient se produire pour qu'une transition ait lieu, et quelles actions devraient être entreprises lorsqu'une transition se produit. Cela semble bon - sur le papier, c'est. En pratique, j'ai posé quelques questions que je ne peux pas résoudre sur papier.

En particulier, les entrées de la machine d'état sont ... un peu diverses. Comment pourrais-je être en mesure d'écrire des données, lire des données et vérifier la connexion (il peut avoir fermé ou peut être cassé) en même temps? En outre, la première et la troisième phase devraient avoir des temporisateurs pour éviter des temps d'attente potentiellement infinis pour les réponses. Donc, je serais reconnaissant pour toute aide qui comble mon écart entre la machine d'état théorique et la machine d'état de code. Par ailleurs, je peux aussi lire C/C++/C# - pas besoin de traduire en Java (c'est ce que j'utilise).

Répondre

0

L'état de votre machine doit être stockée par « Connexion »

Chaque client de connexion pourrait être dans un état différent. Donc si vous aviez un objet qui suivait votre état, vous auriez une instance de cet objet pour chaque connexion.

J'ai effectivement écrit une petite bibliothèque qui résume à peu près tout de la machine d'état si vous êtes intéressé. Il y a aussi un code de test qui devrait vous montrer comment l'utiliser. Il fait des choses que vous pourriez oublier, comme s'assurer que les transitions d'état qui ne sont pas "valides" sont en fait une erreur plutôt que peut-être manquée, et que les transitions d'état de journalisation sont libres.

ps. (N'importe qui) Si vous le regardez et ne l'aimez pas - s'il vous plaît laissez-moi savoir pourquoi.Je voudrais le rendre utilisable pour n'importe qui.

Questions connexes